Visualizzazione post con etichetta pacchetti. Mostra tutti i post
Visualizzazione post con etichetta pacchetti. Mostra tutti i post

domenica 1 settembre 2024

Lista e aggiornamento dei pacchetti aggiuntivi

Dal Menù dell'interfaccia grafica di R (RGui) alla voce Pacchetti selezionando Carica pacchetto... compare l'elenco dei pacchetti installati  – sia i pacchetti previsti di default nella installazione base di R sia i pacchetti aggiuntivi installati dall'utente – che con l'opzione Aggiorna pacchetti...  possono (e devono) essere periodicamente aggiornati.

Uno script che genera l'elenco dei pacchetti installati sembrerebbe quindi superfluo, ma voglio dimostrare che non è esattamente così.

Ora copiate e incollate nella Console di R questo script e premete ↵ Invio.

# GENERA LA LISTA DEI PACCHETTI DELL'INSTALLAZIONE ORIGINARIA
#
pacchetti <- as.data.frame(installed.packages()[,c(1:3)], row.names=FALSE) # genera la lista
pacchetti # mostra la lista
write.csv(pacchetti, "C:/Rdati/pacchetti.csv") # salva la lista
#

La prima riga genera la lista di tutti i pacchetti installati e ne salva in una tabella (pacchetti) i primi tre campi (c(1:3)), quelli che ci interessano e che sono il nome del pacchetto (Package), la sua ubicazione nel PC (LibPath), e la versione installata (Version) e la seconda riga mostra la lista nella Console di R.

> pacchetti # mostra la lista
              Package                                        LibPath    Version
1               abind C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
2             askpass C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
3           backports C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
4           base64enc C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
5         BayesFactor C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
6          bayestestR C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
7           BiasedUrn C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
8              bitops C:/Users/xxxxx/AppData/Local/R/win-library/x.x      x.x.x
..........
272           splines             C:/Program Files/R/R-x.x.x/library      x.x.x
273             stats             C:/Program Files/R/R-x.x.x/library      x.x.x
274            stats4             C:/Program Files/R/R-x.x.x/library      x.x.x
275          survival             C:/Program Files/R/R-x.x.x/library      x.x.x
276             tcltk             C:/Program Files/R/R-x.x.x/library      x.x.x
277             tools             C:/Program Files/R/R-x.x.x/library      x.x.x
278      translations             C:/Program Files/R/R-x.x.x/library      x.x.x
279             utils             C:/Program Files/R/R-x.x.x/library      x.x.x

Tre precisazioni:
 se dal codice togliete [,c(1:3)] la lista generata comprenderà tutti i campi previsti nelle specifiche dei pacchetti;
 i pacchetti ubicati in C:/Program Files/R/R-x.x.x/library (dove x.x.x è la versione di R) sono quelli previsti di default nella installazione base di R;
 quelli ubicati in C:/Users/xxxxx/AppData/Local/R/win-library/x.x  (dove xxxxx è il nome dell'utente e x.x la versione di R) sono i pacchetti aggiuntivi installati dall'utente.

La terza riga di codice dello script salva la lista nel file C:\Rdati\pacchetti.csv (da notare che \ è la barra rovesciata o backslash impiegata da Windows come separatore tra i nomi delle directory nel percorso di un file, mentre R impiega la barra obliqua o slash).

Ed è qui che la cosa si fa interessante, perché disporre di un file con i nomi dei pacchetti installati comporta un notevole vantaggio, consentendoci di riprodurre una installazione dei pacchetti aggiuntivi identica a quella corrente:
 quando si installa un aggiornamento maggiore di R a una nuova versione, indicato da un cambiamento nella prima e/o nella seconda cifra della versione (i.e.: X.X.x oppure x.X.x);
 quando si installa R ex novo su un altro PC;
 quando si vogliono aggiungere all'installazione preesistente su un altro PC i pacchetti impiegati nell'installazione corrente.

Precisato che quando cambia solamente la terza cifra del numero della versione (i.e.: x.x.X) questo viene considerata un aggiornamento minore ed è sufficiente disinstallare la versione corrente, installare la nuova versione, ed effettuare l'aggiornamento dei pacchetti dal menù di R (Pacchetti >> Aggiorna pacchetti...), nel caso di una aggiornamento maggiore ci sono tre opzioni:
 fare coesistere diverse versioni di R e delle relative librerie (ma sono possibili problemi);
 disinstallare la versione corrente di R e installarne una nuova senza mettere mano alle librerie (ma anche se queste poi vengono poi aggiornate seguendo le indicazioni che si trovano online si può andare incontro a problemi);
 procedere ogni volta con una installazione pulita di R, che prevede di disinstallare la versione corrente di R, di cestinare tutte le librerie e reinstallarle tutte daccapo.

In quest'ultimo caso, che personalmente impiego e che mi sento di consigliare in quanto mette sicuramente al riparo da qualsiasi problema, il primo passo è leggere il file C:\Rdati\pacchetti.csv che contiene i pacchetti dell'installazione originaria (O) che era installata sul PC, che è stata disinstallata e che si intende replicare:  

# IMPORTA LA LISTA DEI PACCHETTI DELL'INSTALLAZIONE ORIGINARIA (O)
#
pacchetti_O <- read.csv("C:/Rdati/pacchetti.csv")[c(-1)] # legge la lista
pacchetti_O # mostra la lista
#

Il secondo passo è generare la lista dei pacchetti installati localmente (L) e che, quando si parte con una installazione pulita di R, comprenderà solamente i pacchetti installati di default in C:/Program Files/R/R-x.x.x/library (dove x.x.x è la versione di R):

# GENERA LA LISTA DEI PACCHETTI INSTALLATI LOCALMENTE (L)
#
pacchetti_L <- as.data.frame(installed.packages()[,c(1:3)], row.names=FALSE) # genera la lista
pacchetti_L # mostra la lista
#

Il terzo passo è generare la lista dei pacchetti aggiuntivi mancanti da installare (M) come differenza tra quelli dell'installazione originaria e quelli già installati localmente (M = O - L). Va da sé che questa differenza esclude i pacchetti dell'installazione base di R, per definizione già installati localmente, e lascia nella lista solamente pacchetti aggiuntivi:

# GENERA LA LISTA DEI PACCHETTI AGGIUNTIVI MANCANTI DA INSTALLARE (M = O - L)
#
pacchetti_M <- setdiff(pacchetti_O$Package, pacchetti_L$Package) # genera la lista
pacchetti_M # mostra la lista
#

Il quarto e ultimo passo è l'installazione dei pacchetti aggiuntivi mancanti (M):

# INSTALLA I PACCHETTI AGGIUNTIVI MANCANTI (M)
#
install.packages(pacchetti_M) # installa i pacchetti mancanti
#

A questo punto confermare con SI le specifiche di configurazione proposte,



quindi selezionare il CRAN preferito, dal quale effettuare il download dei pacchetti (sotto Italy trovate Milano e Padua, io per inveterata abitudine mi collego a Padua che è stato il primo dei due in Italia a implementare la modalità "sicura" https e funziona molto bene, ma ovviamente i due si equivalgono).


Nella Console di R vedrete scorrere il download dei pacchetti e la loro installazione, che include la verifica dell'integrità dei file scaricati. Il processo richiede un po' di tempo, serve un po' di pazienza, consiglio di non fare nulla fino alla conferma dell'avvenuto completamento della procedura.

Al termine è possibile verificare che tutto sia andato a buon fine eseguendo degli script che richiedono qualcuno dei pacchetti appena installati. La procedura qui riportata è stata validata con la versione di R per Windows 4.4.1 a 64 bit, eseguendola più volte su differenti PC con Windows 11 e riproducendo una installazione originaria di oltre 270 pacchetti contenenti oltre 12 000 file, senza alcun problema. 

----------

Codice opportunamente modificato e adattato da un post di Roberto Chiosa:
https://robertochiosa.medium.com/import-export-r-packages-a6a122005e00

domenica 16 dicembre 2018

Teorema di Bayes e diagnosi medica

Si consideri uno schema come il seguente nel quale C rappresenta una delle tante cause osservabili, E rappresenta uno dei tanti effetti osservabili, e le frecce dirette dalla causa all’effetto rappresentano i rapporti di causa/effetto.


Il "problema classico" della probabilità può essere risolto applicando la logica deduttiva. Conoscendo la causa, possiamo da questa dedurre gli effetti corrispondenti: così sapendo che un dado ha sei facce, quindi conoscendo la causa, possiamo da questa dedurre la probabilità che ha una specifica faccia di comparire al prossimo lancio del dado (l'effetto). La soluzione del cosiddetto "problema inverso", ovvero l’induzione, è più difficile, in quanto lo stesso effetto può essere determinato da più cause, tra loro indipendenti. Il teorema di Bayes [1] consente, a partire dall'effetto osservato, di calcolare la verosimiglianza delle cause – espressa nel solo modo possibile, cioè in termini di probabilità.

Il teorema di Bayes trova applicazione in tutti i campi, qui vediamo quello della diagnostica medica. La quale prevede che sulla base della conoscenza medica – la conoscenza delle malattie (le cause) e dei rispettivi sintomi e segni (gli effetti) – in uno specifico paziente si debba invertire il processo logico e risalire dai sintomi e dai segni presenti (gli effetti) alla malattia (la causa) che li ha determinati. Compito sovente non facile visto che il più delle volte i medesimi effetti possono essere determinati da differenti cause.

Per affrontare il tema sono necessarie alcune definizioni.

La probabilità marginale che si verifichi l’evento A è

P(A)

e si legge semplicemente "la probabilità di A". Dal punto di vista numerico la probabilità marginale di un evento è un numero positivo compreso tra 0 (evento che non accade mai) e 1 (evento certo) ovvero
0 P(A) 1

Corollario: la probabilità che non si verifichi l’evento A è

P(nonA) = 1 – P(A)

La probabilità condizionata
P(A|B)

è la probabilità di un evento A condizionata ad un evento B, ovvero è la probabilità che si verifichi A a condizione che si sia verificato B e si legge "la probabilità di A, dato B" ovvero "la probabilità di A condizionata a B"

La probabilità congiunta
P(A B)

è la probabilità di due eventi congiunti, ovvero è la probabilità che si verifichino sia A sia B, e si legge "la probabilità congiunta di A e B" ovvero "la probabilità di A e B". La probabilità congiunta può essere meglio compresa facendo riferimento al diagramma seguente:


La relazione fra probabilità condizionata e probabilità congiunta è la seguente:

P(A B) = P(A|B) P(B)    (i)

ma poiché la probabilità congiunta deve necessariamente essere la stessa sia partendo dalla probabilità di A sia partendo dalla probabilità di B, deve essere anche

P(A B) = P(B|A)P(A)    (ii)

Combinando la (i) con la (ii) si ottiene il teorema delle probabilità composte

P(A B) = P(A|B) P(B) = P(B|A) P(A)

e dall'identità
P(A|B)  P(B) = P(B|A)  P(A)

si ricava il teorema di Bayes:

                                                                  P(B|A)P(A)
                                                 P(A|B) =   ----------------
                                                                        P(B)

Se poniamo A = la causa e B = l’effetto, il teorema di Bayes suona così

                                               P(dell’effetto|data la causa) × P(della causa)
P(della causa|dato l’effetto) =    --------------------------------------------------
                                                 P(dell’effetto)

Se consideriamo il problema specifico della diagnosi medica, nel caso di una malattia M (la causa) che può essere presente (soggetti malati, M+) o assente (soggetti sani, M-), e di un segno T (l'effetto) determinato da questa malattia, come è tipicamente il risultato di un test per la sua diagnosi, che può essere positivo (T+) o negativo (T-), l'espressione precedente può essere riscritta come

            P(T+|M+)P(M+)
P(M+|T+) = ----------------------  (iii)
          P(T+)

Partendo dalla probabilità condizionata


Malattia +
Malattia -
Test +
P(T+|M+)
P(T+|M-)
Test -
P(T-|M+)
P(T-|M-)

e moltiplicando le probabilità della prima colonna (Malattia +) per la probabilità di presenza della malattia nella popolazione P(M+), cioè per la prevalenza della malattia, e moltiplicando le probabilità della seconda colonna (Malattia -) per la probabilità di assenza della malattia nella popolazione P(M-), essendo P(M-) = 1 - P(M+) otteniamo 


Malattia +
Malattia -
Test +
P(T+|M+) · P(M+)
P(T+|M-) · P(M-)
Test -
P(T-|M+) · P(M+)
P(T-|M-) · P(M-)

Sostituendo la probabilità di un test positivo P(T+) riportata al denominatore della (iii) con la somma P(T+|M+) · P(M+) + P(T+|M-) · P(M-) delle probabilità riportate nella riga Test + di quest'ultima tabella, possiamo esprimere il teorema di Bayes (iii) nella forma seguente, che consente di calcolare il valore predittivo di un test positivo P(M+|T+) ovvero la probabilità di essere malato per un soggetto che presenta un test positivo

         P(T+|M+) · P(M+)
P(M+|T+) = --------------------------------------------  (iv)
            P(T+|M+) · P(M+) + P(T+|M-) · P(M-)

Le grandezze in gioco nel calcolo del valore predittivo di un test positivo P(M+|T+) sono [2]:
la sensibilità P(T+|M+) del test diagnostico, che è la probabilità che il test sia positivo in un soggetto malato;
la specificità P(T-|M-) del test diagnostico che è la probabilità che il test sia negativo in un soggetto sano;
la prevalenza della malattia P(M+) cioè la probabilità di incontrare un soggetto malato nella popolazione generale.

Il teorema di Bayes consente di calcolare anche il valore predittivo di un test negativo P(M-|T-), ovvero la probabilità di essere sano per un soggetto che presenta un test negativo, nella forma seguente

         P(T-|M-) · P(M-)
P(M-|T-) = --------------------------------------------   (v)
           P(T-|M-) · P(M-) + P(T-|M+) · P(M+)

In genere, a causa del fatto che le statistiche epidemiologiche sono effettuate contando i casi - cosicché per conoscere ad esempio la prevalenza dell'influenza si conta il numero dei malati di influenza esistenti nella popolazione [3] - spesso si preferisce, in alternativa alle probabilità della (iv) e della (v), impiegare il numero di casi osservati, riportati in questo modo


Malattia +
Malattia -
Test +
VP
FP
Test -
FN
VN

e definiti, per uno specifico test diagnostico e una specifica malattia, come [4]:
veri positivi (VP), il numero di soggetti malati con il test positivo;
falsi positivi (FP), il numero di soggetti sani con il test positivo;
falsi negativi (FN), il numero di soggetti malati con il test negativo;
veri negativi (VN), il numero di soggetti sani con il test negativo.

Queste quattro grandezze, per un dato test diagnostico, sono quindi dei semplici conteggi dei risultati ottenuti applicando il test in condizioni controllate (nell'ambito di una ricerca clinica). In questa immagine 



è riportata in altro a sinistra (Fig. 1a) la distribuzione dei risultati di un ipotetico test in un campione di soggetti non affetti (Sani) e in un campione di soggetti affetti (Malati) da una specifica malattia. Le distribuzioni si sovrappongono parzialmente (area in colore verde): ed è quanto si osserva di fatto, nella stragrande maggioranza dei casi, nella realtà.

Se, ai fini della classificazione dei pazienti che hanno eseguito il test, fissiamo come valore soglia tra sani a malati quello riportato nella Fig. 1b, ci garantiamo di individuare correttamente tutti i soggetti malati (VP), e non avremo falsi negativi (FN), ma a scapito del fatto che classificheremo come malati anche molti soggetti sani (FP) e ridurremo il numero di soggetti sani correttamente classificati come tali (VN). In altre parole, in termini di probabilità, privilegeremo la sensibilità del test a scapito della sua specificità: non avremo alcun falso negativo (FN) ma avremo molti falsi positivi (FP).

Se fissiamo come valore soglia tra sani e malati quello riportato nella Fig. 1c, ci garantiamo di individuare correttamente tutti i soggetti sani (VN), e non avremo falsi positivi (FP) ma a scapito del fatto che classificheremo come sani anche molti soggetti malati (FN) e ridurremo il numero di soggetti malati correttamente classificati come tali (VP). In altre parole, in termini di probabilità, privilegeremo la specificità del test a scapito della sua sensibilità: non avremo alcun falso positivo (FP) ma avremo molti falsi negativi (FN).

Se infine fissiamo come valore soglia tra sani e malati quello riportato nella Fig. 1d, ci garantiamo di individuare correttamente la maggior parte dei soggetti sani (VN) e di individuare correttamente la maggior parte dei soggetti malati (VP), minimizzando contemporaneamente sia la possibilità di sbagliare classificando come sani dei soggetti malati (FN) sia la possibilità di sbagliare classificando come malati dei soggetti sani (FP). In altre parole, in termini di probabilità, realizzeremo un rapporto equilibrato tra la specificità del test e la sua sensibilità.

Nella maggior parte dei casi il valore soglia è scelto sulla base della strategia rappresentata nella Fig. 1d, che minimizza sia i falsi positivi sia i falsi negativi: è proprio questa la strategia seguita dalle curve ROC (vedere il post Curve ROC e valore soglia).  Tuttavia in casi particolari è possibile che sia più appropriato impiegare la strategia rappresentata nella Fig. 1b  (massimizzare la sensibilità) o più appropriato impiegare la strategia rappresentata nella Fig. 1c (massimizzare la specificità). Per una introduzione generale all'impiego del teorema di Bayes nella diagnosi medica vedere Federspil, Galen, Gigerenzer, Gill, Goodman, Motterlini e Nordenström nella pagina della bibliografia.

Dopo avere definito il valore soglia, dal quale dipendono la sensibilità e la specificità del test:
 il valore predittivo del test positivo, cioè la probabilità di essere malato per un soggetto che presenta un test positivo [5] 
 il valore predittivo del test negativo, cioè la probabilità di essere sano per un soggetto che presenta un test negativo [5] 
possono essere calcolati - a partire dalle probabilità mediante la (iv) e la (v) o, in alternativa, a partire dal numero di casi osservati VP, FP, FN, VN - come illustrato nel post Sensibilità, specificità, valore predittivo e nel post Efficienza e accuratezza diagnostica.


----------

[1] Bayes T. An essay towards solving a problem in the doctrine of chances. By the late Rev. Mr. Bayes, F. R. S. communicated by Mr. Price, in a letter to John Canton, A. M. F. R. S. Philo. Trans. Roy. Soc. 1763;53;370-418.
https://doi.org/10.1098/rstl.1763.0053

[2] Altman DG, Bland JM. Statistics Notes: Diagnostic tests 1: sensitivity and specificity. BMJ 1994;308;1552.
https://www.bmj.com/content/308/6943/1552.full

[3] In termini di conteggi la prevalenza è il numero di casi di malattia esistenti in un determinato momento in una data popolazione. Non deve essere confusa con l'incidenza, che è il numero di nuovi casi di malattia che si verificano in un determinato arco di tempo in una data popolazione.

[4] Gerhardt W, Keller H. Evaluation of test data from clinical studies. Scand J Clin Lab Invest 1986;46(supplement 181). 
https://www.tandfonline.com/doi/pdf/10.1080/00365518709168461

[5] Altman DG, Bland JM. Statistics Notes: Diagnostic tests 2: predictive values. BMJ 1994;309;102.
https://www.bmj.com/content/309/6947/102.1.full

giovedì 29 novembre 2018

Pacchetti aggiuntivi di statistica e grafica

Il programma R che si scarica e si installa sul proprio PC o notebook da sito ufficiale di R [1] include una serie di funzioni statistiche e grafiche di base, che tuttavia possono essere integrate da una miriade di funzioni statistiche e grafiche contenute nei pacchetti aggiuntivi disponibili, ciascuno orientato alla risoluzione di un problema specifico.

Per scaricare un pacchetto aggiuntivo e installarlo sul vostro PC o notebook:
selezionare dalla RGui l'opzione Pacchetti
selezionare dal menù a tendina che compare Installa pacchetti...

Si aprirà prima una finestra per selezionare nel CRAN (Comprehensive R Archive Network) il sito dal quale scaricare il pacchetto, per l'Italia potete selezionare Italy (Milano) o Italy (Padua), entrambi siti https.


Una volta selezionato il sito si aprirà una finestra con l’elenco dei pacchetti disponibili. Selezionate il pacchetto e premete OK per installarlo.

Quando si installa un pacchetto è possibile che questo richieda che sul PC o notebook siano installati altri pacchetti, cui esso si appoggia. Se questi non sono installati verrà effettuato automaticamente il download e l’installazione di più pacchetti, tutti quelli tra loro concatenati e quindi necessariamente e contemporaneamente richiesti per garantire la funzionalità dell’unico pacchetto che si desiderava installare. Ora scaricate e installate il pacchetto DAAG che ci serve tra poco (vedere il post il set di dati ais).

In R un "pacchetto" è una raccolta di funzioni, di set di dati e di codice R compilato. Quando si scarica e si installa un pacchetto, questo viene immagazzinato nella locale libreria. Ecco perché se nella Console di R digitate

library

potete vedere l'elenco dei pacchetti che avete installato e che sono disponibili in R sul vostro PC o notebook.

Per utilizzare le funzioni e i set di dati contenuti in un pacchetto è necessario caricarlo come segue:
dalla RGui fare click su Pacchetti;
selezionare Carica pacchetto...;
→ nella finestra che compare selezionare il pacchetto da caricare.


In alternativa è possibile, ed è più pratico, caricare i pacchetti impiegando all'interno degli script la funzione library() o la funzione require() e riportando come argomento all'interno della parentesi () il nome del pacchetto.

Una volta caricato un pacchetto è possibile avere l'elenco di tutti i set di dati che sono stati caricati con quel pacchetto, e digitando nella Console di R il nome di uno di questi set di dati poterne vederne il contenuto:

library(DAAG) # carica il pacchetto DAAG
data(package="DAAG") # elenca i set di dati caricati con il pacchetto DAAG
ais # mostra il contenuto del set di dati ais

Mediante la funzione data() possono essere caricati set di dati senza caricare il pacchetto che li contiene, così ad esempio è possibile caricare selettivamente il set di dati ais senza caricare il pacchetto DAAG digitando nella Console di R

data(ais, package="DAAG")

Digitando nella Console di R

help(package="DAAG")

si accede alla documentazione delle funzioni e dei set di dati contenuti nel pacchetto.

Per scaricare il manuale di riferimento in formato .pdf di un pacchetto:
→ accedere al CRAN;
fare click sulla voce Packages nella sezione Software;
fare click sul link Table of available packages, sorted by name;
→ fare click sul nome del pacchetto;
il manuale si trova alla voce Reference manual.

Per aggiornare periodicamente i pacchetti installati:
dalla RGui selezionare l'opzione Pacchetti;
dal menù a tendina che compare selezionare Aggiorna pacchetti...

I pacchetti non più manutenuti vengono rimossi dal CRAN, ma sono ancora resi disponibili nell'archivio storico di R.
https://cran.r-project.org/src/contrib/Archive/

----------

[1] The R Project for Statistical Computing.
https://www.r-project.org/