dispensa su programma di calcolo R\nSalvaSalva Dispensa R per dopo\nIntroduzione allanalisi statistica con R\nChe cos` eR\nR` e un ambiente basato sul linguaggio S, per la gestione e lanalisi statistica di dati e la produzione di graci, disponibile gratuitamente sotto i vincoli della GPL (General Public Licence). Informazioni, risorse e molto altro sono disponibili al sito: http://cran.r-project.org/ La versione pi` u recente di R pu` o essere scaricata dalla pagina: http://cran.r-project.org/bin/windows/base/ Una volta scaricato il le .exe sul proprio computer ` e suciente lanciare il programma di installazione. Sono comunque presenti dettagliate spiegazioni sul sito di distribuzione del programma. In R lanalisi ` e fatta attraverso una serie di passi, con risultati intermedi che sono immagazzinati in oggetti. Rispetto a programmi come SAS o SPSS, R fornisce un output minimo. I rimanenti risultati possono essere successivamente richiamati tramite opportuni comandi. Per approfondimenti su aspetti che non sono trattati in queste dispense si rimanda a: 1. Iacus, Masarotto Laboratorio di Statistica con R, McGraw-Hill Italia, 2003. 2. Crivellari Analisi statistica dei dati con R, Apogeo, 2006. oltre alle numerose dispense per approfondire diversi aspetti di R, disponibili in rete. In particolare, nel sito http://cran.r-project.org/other-docs.html, si possono trovare anche numerose dispense in italiano (sezione Other languages). 1.1.2 Primi passi\nAvviato il programma R, apparir` a una nestra (Console) con il simbolo di prompt > 1\nche indica che lambiente ` e pronto per ricevere delle istruzioni, che vengono immesse scrivendo il comando sulla riga che comincia dal simbolo di prompt (detta linea di comando). Una volta concluso il comando si digita il tasto di Invio. Se il comando ` e completo, comparir` a una nuova linea di comando con il simbolo di prompt. Altrimenti comparir` a una nuova riga con il simbolo + che sta a signicare che il comando deve essere completato. La console di R pu` o essere utilizzata come semplice calcolatrice. E un ambiente interattivo, ossia i comandi producono una risposta immediata. Ad esempio, se scriviamo 2 + 2, comparir` a nella riga successiva il risultato. Alcuni esempi: > #somma > 2 + 2  4 > #moltiplicazione > 2 * 2  4 > #sottrazione e divisione > (2 - 3)/6  -0.167 > #ATTENZIONE: ` e diverso da scrivere > 2 - 3/6  1.5 > #elevamento a potenza > 2^2  4\nOsservazione Tutto quello che viene scritto su una riga di comando dopo # non viene letto dal programma. In tale modo, ` e possibile inserire dei commenti alle operazioni che vengono eettuate. Esistono poi diverse funzioni (vedi pi` u avanti) per le principali operazioni matematiche e trigonometriche. Per dare solo qualche esempio, sqrt serve per estrarre la radice quadrata da un numero, log calcola il logaritmo naturale ed exp lesponenziale: > sqrt(9) 2\n 3 > log(1)  0 > exp(0)  1 Gli operatori == (uguale), >=/<= (maggiore/minore uguale), >/< (maggiore/minore), != (diverso) sono utilizzati per eettuare confronti tra oggetti. Sono impiegati in diverse situazioni, ad esempio, come si vedr` a pi` u avanti, nella selezione di elementi da un vettore o da una matrice dei dati. Il confronto tra due elementi produce il risultato TRUE se il confronto ` e vericato, FALSE altrimenti. Alcuni esempi: > 2 * 2 == 4  TRUE > 2 * 2 > 4  FALSE > 2 * 2 >= 4  TRUE > 2 * 2 != 4  FALSE Ogni entit` a che il programma crea e manipola ` e denita un oggetto, che pu` o essere un numero, una variabile, una funzione, o pi` u in generale, strutture costruite a partire da tali componenti. Gli oggetti creati dallutilizzatore del programma durante una sessione di lavoro possono essere salvati con un nome, per poter essere riutilizzati durante la sessione. Per assegnare un nome ad un oggetto si impiega il comando <-, o, pi` u semplicemente = . > x <- 4 > x  4 > y = 3 * 2 > y 3\n 6 > #` e possibile effettuare delle operazioni con gli oggetti salvati > x * y  24 > #e creare nuovi oggetti da salvare con un nome > z = (y - x) * 2 > z  4 I nomi degli oggetti che vengono creati e salvati dallutente possono contenere un qualunque carattere alfa-numerico. Non devono mai iniziare con un numero, non ci devono essere spazi vuoti, n e gli operatori per le operazioni matematiche. Sarebbe opportuno, inoltre, che non coincidano con nomi di funzioni utilizzate dal programma. > #i nomi degli oggetti non devono contenere spazi vuoti > pro va = 2 Error: unexpected symbol in "pro va" > #non devono contenere simboli matematici > #creano confusione > x-y = 2 Error in x - y = 2 : could not find function "-<-" > #non devono iniziare con un numero > 2x = 2 Error: unexpected symbol in "2x" > #alcuni nomi sono "protetti" da R > for = 3 Error: unexpected '=' in "for =" > break = 5 Error in break = 5 : invalid (NULL) left side of assignment Si osservi che, anche se i nomi degli oggetti non devono iniziare con un numero, possono essere composti anche da numeri: > x2 = 5 > x2  5 Occorre fare attenzione al fatto che R ` e case sensitive, nel senso che distingue tra maiuscole e minuscole. Ad esempio, Y e y si riferiscono ad oggetti diversi. 4\n> y  6 > Y Error: object 'Y' not found Inne, se si attribuisce a due oggetti diversi lo stesso nome, R canceller` a il primo dei due oggetti e manterr` a in memoria solo il secondo: > a = 2 > a  2 > a = 4 > a  4\nGli oggetti in R\nGli oggetti creati dallutente vengono temporaneamente salvati nello spazio di lavoro (workspace). Per sapere qual ` e lo spazio di lavoro di default, ossia quello utilizzato dal programma nel momento in cui viene lanciato, si utilizza il comando getwd(), che mostrer` a il path della cartella nel computer che ` e stata automaticamente selezionata al momento dellinstallazione del programma. Si pu` o lavorare nel workspace di default, ma ` e consigliabile utilizzare spazi di lavoro diversi, e quindi cartelle diverse, per lavori diversi. Per modicare lo spazio di lavoro, si utilizza il comando setwd(). Ad esempio, se ` e stata creata una directory dal nome lezioniR nella directory C:, per salvare tutto il lavoro in questa cartella, allinizio della sessione di lavoro si scriver` a1 : setwd("C:/lezioniR") In alternativa, dal menu File, si sceglie lopzione Cambia directory e si sceglie la la cartella. In questa cartella devono essere inseriti tutti i dati, provenienti da le esterni ad R che si vogliono impiegare nella sessione di lavoro. Inoltre, in questa cartella verranno salvate le gure, le matrici di dati e, pi` u in generale, tutti gli oggetti che vengono creati durante la sessione di lavoro. A questultimo riguardo, come gi` a accennato, gli oggetti vengono salvati solo temporaneamente nello spazio di lavoro, no alla ne della sessione, e non sono visibili sicamente nella cartella selezionata come workspace. Per salvare tutto lo spazio di lavoro in maniera denitiva, si utilizza il comando save.image(), che crea un le senza nome nella cartella\nFate attenzione allorientamento dello slash, che ` e opposto da quello impiegato, ad esempio, sotto Windows.\nselezionata con estensione .Rdata, la cui icona ` e identica a quella di R. Se invece si vuole salvare lo spazio di lavoro con un nome si scriver` a save.image("nomefile.Rdata"). Inne, si possono salvare solo alcuni oggetti presenti nello spazio di lavoro, con il comando save(). Alcuni esempi: save(x, file = "x.Rdata") save(x, y, z, file = "prova.Rdata") Nel primo caso si salva solo loggetto x, che si trover` a nel le x.Rdata visibile nella cartella indicata come spazio di lavoro, nel secondo gli oggetti x, y, z. Ciascuno di questi le pu` o essere importato in una nuova sessione sessione semplicemente avviando R dal le .Rdata di interesse, oppure utilizzando il comando load(): load(".Rdata") load("prova.Rdata") Da quanto scritto sopra, dovrebbe essere chiaro che nel primo caso si carica tutto lo spazio di lavoro precedentemente salvato2 , nel secondo solo gli oggetti x, y, z. Il comando ls() permette di visualizzare i nomi degli oggetti memorizzati. Per eliminare uno o pi` u oggetti dallo spazio di lavoro si utilizza il comando rm(), mentre il comando rm(list = ls()) elimina tutti gli oggetti nello spazio di lavoro. Esempio: > ls()  "a" "x" "x2" "y" "z"\n> #cancella solo uno o pi` u oggetti > rm(x) > ls()  "a" "x2" "y" "z"\n> rm(y, x2) > ls()  "a" "z" > #cancella tutti gli oggetti nello spazio di lavoro > rm(list = ls()) > ls() character(0)\nAnche le operazioni di salvataggio e di importazione di un workspace pu` o essere eettuata con il menu File.\nTra gli oggetti in R, un ruolo di particolare rilevanza ` e rivestito dalle funzioni, insiemi di comandi elementari, che permettono di eettuare dalle pi` u comuni operazioni matematiche, alle pi` u sosticate tecniche statistiche, e altro ancora. I comandi incontrati no ad ora, come save.image, ls, o sqrt, sono esempi di funzioni. La sintassi di una generica funzione ` e del tipo: nomefunzione(argomento1, argomento2, argomento3,...) dove gli argomenti di una funzione, separati da una virgola, possono essere oggetti come vettori, matrici, altre funzioni, parametri o operatori logici. Alcuni argomenti possono avere dei valori di default, se sono posti uguali ad un valore, o ad una condizione, ecc. Non ` e sempre necessario specicare tutti gli argomenti di una funzione. Anche lordine degli argomenti non ` e importante. E necessario ricordare che, qualora gli argomenti della funzione siano inseriti in un ordine diverso da quello denito, si deve sempre richiamare il nome dellargomento che si vuole impiegare. Per richiamare lhelp in linea su una funzione, e quindi avere informazioni sulla sintassi della funzione, oltre a esempi pratici di impiego, si scrive: ?nomefunzione.\nOsservazione Quali argomenti vadano sempre specicati e quali solo in base alle nalit` a dellanalisi ` e un argomento complesso da trattare in astratto, senza esempi pratici. Nel seguito verranno introdotte numerose funzioni, con esempi che permetteranno di chiarire, di volta in volta, quali argomenti vadano specicati e quali no. 1.2.3 Pacchetti\nLe funzioni di R sono organizzate in pacchetti, i pi` u importanti dei quali sono gi` a disponibili quando si accede al programma. Alcuni pacchetti, pur essendo presenti nella release di base di R, devono essere caricati durante la sessione di lavoro, mediante il comando: require(nomepacchetto) Per sapere quali sono i pacchetti gi` a presenti nella release di R con cui si sta lavorando, basta scrivere: library() In alternativa, dal menu Pacchetti si sceglie lopzione Carica pacchetto. In tal caso apparir` a una nestra con la lista dei pacchetti gi` a installati. Sar` a quindi suciente selezionare il nome del pacchetto da caricare con il mouse e poi cliccare su OK. Per avere informazioni sul pacchetto e sulle funzioni in esso contenute: help(package = "nomepacchetto") Alcuni pacchetti non sono invece presenti nella release di base di R. Per installare un pacchetto non presente, ` e suciente scrivere: install.packages("nomepacchetto")\nTable 1: Esempio di matrice di dati\ni ETA 1 19 2 22 3 21 4 23 5 22 6 20\nPESO 50 75 80 56 75 58\nALTEZZA 1.65 1.78 1.91 1.72 1.81 1.68\nSESSO F M M F M F\nPROV RM RM TO NA TO NA\nLa prima volta che si usa questa funzione durante una sessione di lavoro si dovr` a anche selezionare da una lista il sito mirror da cui scaricare il pacchetto. In alternativa, nel menu Pacchetti si seleziona Installa pacchetti e, successivamente, si seleziona il pacchetto dalla lista di tutti i pacchetti.\nTipologie di dati in R\nR lavora con dati strutturati. Le strutture di dati contemplate sono: numeri contengono un singolo dato; vettori insieme lineare di elementi omogenei per tipologia, tutti numeri, tutte stringhe, ecc.; fattori vettore utilizzato per classicare o suddividere in livelli gli elementi di un altro vettore; array e matrici vettori multidimensionali. Le matrici hanno due dimensioni: righe e colonne. Gli array sono insiemi di numeri con p dimensioni. Ovviamente, per p = 1 si ottiene un vettore, per p = 2 una matrice. Il caso pi` u generale, con p > 2 non verr` a trattato; data frame sono matrici bidimensionali dove ogni colonna pu` o avere una tipo di dato diverso dalle altre; liste insieme di elementi non omogenei tra loro. Prima di andare a vedere i singoli tipi di dati, consideriamo il seguente esempio. Supponiamo di avere rilevato su sei unit` a, cinque variabili, tre numeriche, let` a, il peso e laltezza, e due categoriche, il sesso e la provincia di nascita. I dati sono riportati nella Tabella 1. La prima colonna della matrice contiene le etichette con cui vengono identicate le unit` a. Ciascuna delle rimanenti colonne rappresenta una variabile osservata sul campione. La riga i-ma della Tabella 1 riporta i valori osservati per le cinque variabili sullunit` a i. In R, le variabili vengono rappresentate sotto forma di vettori. Ciascun vettore rappresenta una distribuzione unitaria semplice. La matrice dei dati, che contiene le colonne rappresentanti le variabili osservate sul campione ` e una distribuzione unitaria multipla. Nel seguito, andremo a vedere dapprima come costruire i singoli vettori che compongono la Tabella 1 e, successivamente, la matrice dei dati. Nel far questo, verranno illustrate le principali propriet` a di vettori e matrici di dati in R. 8\nVettori di dati\nPer denire un vettore esistono molti modi, il pi` u comune dei quali ` e la funzione c(). Per costruire i vettori numerici della matrice dei dati nella Tabella 1, scriveremo: > ETA = c(19, 22, 21, 23, 22, 20) > ETA  19 22 21 23 22 20 > PESO = c(50, 75, 80, 56, 75, 58) > PESO  50 75 80 56 75 58 > ALTEZZA = c(1.65, 1.78, 1.91, 1.72, 1.81, 1.68) > ALTEZZA  1.65 1.78 1.91 1.72 1.81 1.68 E possibile eettuare operazioni sui vettori. Se, ad esempio, volessimo calcolare laltezza in centimetri, piuttosto che in metri: > ALT.CM = ALTEZZA * 100 > ALT.CM  165 178 191 172 181 168 Se, invece, vogliamo calcolare il body mass index delle unit` a del campione, dato dal rapporto tra il peso e il quadrato dellaltezza: > BMI = PESO/ALTEZZA^2 > BMI  18.4 23.7 21.9 18.9 22.9 20.5 Per ridurre il numero di decimali, si utilizza la funzione round(x, digits), dove x ` e un oggetto (numero, vettore, matrice) che contiene numeri da arrotondare, e digits ` e il numero di decimali. > round(BMI, 2)  18.4 23.7 21.9 18.9 22.9 20.6 Per costruire i vettori delle variabili categoriche, si pu` o ancora utilizzare la funzione c. Successivamente, si pu` o applicare la la funzione factor, che denisce automaticamente le modalit` a della variabile categorica. Questo tipo di variabili sono utili nella classicazione delle unit` a. I singoli elementi del vettore vanno racchiusi tra virgolette: " ". 9\n> SESSO = c("F", "M", "M", "F", "M", "F") > SESSO  "F" "M" "M" "F" "M" "F" > SESSO = factor(SESSO) > SESSO  F M M F M F Levels: F M > PROV = c("RM", "RM", "TO", "NA", "TO", "NA") > PROV = factor(PROV) > PROV  RM RM TO NA TO NA Levels: NA RM TO Per selezionare gli elementi di un vettore si deve inserire tra parentesi quadre, successivamente al nome del vettore, un indice, o un vettore di indici, che indichi la posizione degli elementi del vettore da estrarre. Se davanti allindice c` e il segno "-", il corrispondente elemento viene eliminato dal vettore: > #seleziona il peso della prima unit` a > PESO  50 > #della sesta e della terza unit` a > PESO[c(6, 3)]  58 80 > #elimina l'altezza della quarta unit` a > ALTEZZA[- 4]  1.65 1.78 1.91 1.81 1.68 > #estrae l'et` a di chi ha un peso minore o uguale a 70 kg > ETA[PESO <= 70]  19 23 20 > #estrae il peso di che ha un'altezza maggiore di 1.70 > PESO[ALTEZZA > 1.70]  75 80 56 75 10\n> #estrae l'altezza di chi ha 22 anni > ALTEZZA[ETA == 22]  1.78 1.81 > #estrae il peso delle unit` a di sesso femminile > PESO[SESSO == "F"]  50 56 58 > #estrae l'altezza delle unit` a che hanno meno di 22 anni > #e che non sono nate nella provincia di Napoli > ALTEZZA[ETA < 22 & PROV != "NA"]  1.65 1.91 Osservazione Le variabili di classicazione possono essere, a loro volta trasformate in variabili numeriche, tramite la funzione as.integer. Si osservi che, nel caso i livelli siano deniti da caratteri, o stringhe di caratteri, la trasformazione in numeri rispetta lordine alfabetico delle componenti del vettore. > as.integer(SESSO)  1 2 2 1 2 1 2.1.1 Tipologie particolari di vettori: le funzioni seq e rep\nLa funzione seq genera un vettore che contiene una sequenza regolare di numeri, in base a determinate regole. La sintassi della funzione ` e3 : seq(from = 1, to, by, length) Largomento from, che va sempre specicato, indica il primo numero della sequenza di numeri, che, di default, ` e posto pari ad 1. Il secondo, to, ` e il numero nale della sequenza. by indica il passo della sequenza, ossia lincremento tra un numero e quello successivo. Se non specicato, ` e pari ad 1. Inne, length ` e la lunghezza della sequenza. Non ` e necessario specicare tutti gli argomenti, dal momento che, ad esempio, una volta specicato valore di inizio, valore nale e passo, la lunghezza ` e automaticamente denita. Ad esempio, per ottenere una sequenza da 3 a 15, di passo 3 e, quindi, di lunghezza pari a 5, si pu` o scrivere indierentemente: > > > > #due diversi modi di ottenere la stessa sequenza x = seq(from = 3, to = 15, by = 3) x1 = seq(from = 3, to = 15, length = 5) x\nSi osservi che non sono stati riportati tutti gli argomenti della funzione, ma solo quelli di uso pi` u comune. Questo verr` a fatto anche per le funzioni che verranno successivamente illustrate, per non appesantire la spiegazione delle varie funzioni. Per approfondimenti, si pu` o sempre fare ricorso allhelp.\nSi osservi anche che, come accennato precedentemente, non ` e necessario scrivere il nome dellargomento, se viene riportato nellordine pressato di default. Ad esempio, per ottenere un vettore con una sequenza di numeri da 2 (from = 2) a 10 (to = 10), di passo 2 (by = 2), ` e suciente scrivere: > seq(2, 10, 2)  2 4 6 8 10\nSe si specicano i nomi degli argomenti, questi possono essere posti anche in ordine diverso da quello pressato: > seq(1, length = 5, by = .5)  1.0 1.5 2.0 2.5 3.0 Inne, un modo compatto per ottenere delle sequenze di passo 1 ` e il seguente: > 1:5  1 2 3 4 5 > 5:1  5 4 3 2 1 Nellultimo caso otteniamo una sequenza ordinata in maniera decrescente. La funzione rep(x, times) genera un vettore in cui un oggetto (x), numero o vettore, viene ripetuto un numero di volte pari a (times): > rep(x = 1, times = 5)  1 1 1 1 1 > rep(c(1, 2), 2)  1 2 1 2\nLe matrici in R possono essere denite tramite oggetti di classe matrix e data.frame. La dierenza principale, ` e che gli oggetti di classe matrix sono matrici i cui elementi devono essere tutti della stessa natura, ad esempio vettori numerici, mentre gli oggetto di classe data.frame sono matrici in cui le colonne possono essere di natura dierente. Per questo motivo, questi ultimi oggetti sono impiegati per trattare matrici di dati. Dora in avanti quando si parler` a di matrice di dati ci si riferir` a ad un data frame, se non altrimenti specicato. Si osservi, inne, che la maggior parte delle funzioni che possono essere applicate ad oggetti di classe matrix sono applicabili anche ai data frame, ma non ` e sempre vero il viceversa. La funzione per generare un data frame ` e data.frame, che permette di unire pi` u vettori di uguale lunghezza come colonne del data frame, ognuno dei quali si riferisce ad una diversa variabile. Costruiamo quindi la matrice dei dati della Tabella 1: > Dati = data.frame(ETA, PESO, ALTEZZA, SESSO, PROV) > Dati ETA PESO ALTEZZA SESSO PROV 19 50 1.65 F RM 22 75 1.78 M RM 21 80 1.91 M TO 23 56 1.72 F NA 22 75 1.81 M TO 20 58 1.68 F NA\nSi osservi che viene automaticamente generata la colonna delle etichette. La funzione str permette di analizzare la struttura di un oggetto. In particolare, nel caso della matrice di dati appena ricavata si ha: > str(Dati)\ndata.frame': 6 obs. of 5 variables: $ ETA : num 19 22 21 23 22 20 $ PESO : num 50 75 80 56 75 58 $ ALTEZZA: num 1.65 1.78 1.91 1.72 1.81 1.68 $ SESSO : Factor w/ 2 levels "F","M": 1 2 2 1 2 1 $ PROV : Factor w/ 3 levels "NA","RM","TO": 2 2 3 1 3 1\nLa funzione names applicata alla matrice dei dati, restituisce il nome delle variabili della matrice: > names(Dati)  "ETA" "PESO" "ALTEZZA" "SESSO" 13 "PROV"\nLestrazione di dati da un data frame pu` o essere eettuata in maniera simile a quanto avviene per i vettori. Va per` o tenuto conto che, trattandosi di una matrice, ha due dimensioni. Quindi, scrivendo Dati[i, j], si estrae lelemento che si trova nelli-ma riga e nella j-ma colonna della matrice A. Quindi, lindice prima della virgola si riferisce alle righe, mentre quello dopo la virgola riguarda le colonne: > #estrae l'elemento che si trova nella prima riga e nella seconda colonna > Dati[1, 2]  50 > #estrae il secondo ed il quarto elemento della prima riga > Dati[1, c(2, 4)] PESO SESSO 50 F\n> #estrae la sotto-matrice formata dalle prime due righe > #e dalla seconda e terza colonna > Dati[1:2, 2:4] PESO ALTEZZA SESSO 1 50 1.65 F 2 75 1.78 M Si osservi che se non si scrive nulla prima della virgola, lestrazione riguarder` a tutte le righe; se non si scrive nulla dopo la virgola, lo stesso avverr` a per le colonne. In altri termini, scrivendo Dati[, j] si estrarr` a tutta la colonna j-ma, ossia tutte le righe della colonna; scrivendo Dati[i, ] si vuole estratte tutta la riga i-ma: > #estrae la seconda riga > Dati[2, ] ETA PESO ALTEZZA SESSO PROV 2 22 75 1.78 M RM > #estrae la terza colonna > Dati[ , 3]  1.65 1.78 1.91 1.72 1.81 1.68 > #estrae la terza e quarta colonna > Dati[ , 3:4]\nALTEZZA SESSO 1.65 F 1.78 M 1.91 M 1.72 F 1.81 M 1.68 F\n> #elimina la prima riga > Dati[- 1, ] ETA PESO ALTEZZA SESSO PROV 22 75 1.78 M RM 21 80 1.91 M TO 23 56 1.72 F NA 22 75 1.81 M TO 20 58 1.68 F NA\nDal momento che le colonne sono delle variabili, ` e possibile estrarle anche indicando nome della variabile, scrivendo nomedata.frame$nomecolonna. Ad esempio, per estrarre la prima variabile si pu` o indicare lindice della prima colonna, o il nome della variabile: > Dati[, 1]  19 22 21 23 22 20 > Dati$ETA  19 22 21 23 22 20 Se quindi vogliamo ricavare la matrice dei dati contenente solo le variabili numeriche, scriveremo, ad esempio: > Dati2 = Dati[, 1:3] > Dati2 ETA PESO ALTEZZA 19 50 1.65 22 75 1.78 21 80 1.91 23 56 1.72 22 75 1.81 20 58 1.68\nLe liste sono insiemi di oggetti di natura e dimensione diversa. Per questo motivo, sono spesso usate per raccogliere i risultati di unanalisi. Per generare una lista si impiega la funzione list. Costruiamo una lista, i cui elementi sono la nostra matrice dei dati, ed il vettore x, generato nellesempio delle sequenze di numeri. > Lista = list(Dati, x) > Lista [] ETA PESO ALTEZZA SESSO PROV 1 19 50 1.65 F RM 2 22 75 1.78 M RM 3 21 80 1.91 M TO 4 23 56 1.72 F NA 5 22 75 1.81 M TO 6 20 58 1.68 F NA []  3\nDi default gli oggetti in una lista non sono identicati con un nome, ma solo con un numero. Per assegnare un nome a ciascun oggetto della lista si usa la funzione names, imputando un vettore di stringhe della stessa lunghezza del numero di oggetti4 : > names(Lista) = c("Dati", "sequenza") > Lista $Dati ETA PESO ALTEZZA SESSO PROV 1 19 50 1.65 F RM 2 22 75 1.78 M RM 3 21 80 1.91 M TO 4 23 56 1.72 F NA 5 22 75 1.81 M TO 6 20 58 1.68 F NA $sequenza  3 6\nPer estrarre un oggetto da una lista si pu` o scrivere nomelista[[numerooggetto]]. Qualora ai diversi oggetti sia stato assegnato un nome, si pu` o anche scrivere nomelista$nomeoggetto, . Quindi, per estrarre il secondo elemento della lista si pu` o scrivere, alternativamente:\nLa stessa funzione pu` o essere impiegata per modicare i nomi degli oggetti di una lista, delle colonne di una matrice di dati.\n> Lista[]  3 6 9 12 15\n> Lista$sequenza  3 6 9 12 15\nCaricare dati da fonti esterne\nE raro che i dati vengano inseriti a mano, come negli esempi precedenti. La situazione pi` u comune ` e che vengano inseriti a partire da le esterni. R ` e in grado di leggere dati in praticamente qualsiasi formato5 . In questa sezione vedremo come caricare in R dati che sono stati salvati sotto forma di testo, soluzione molto comune, con estensioni .txt o .csv. Per caricare questo tipo di dati si impiega la funzione read.table(), che, con le opportune specicazioni, ` e in grado di leggere le salvati con queste ed altre estensioni. Consideriamo il le exams.txt, che contiene i voti riportati in cinque materie da sei studenti. In questa matrice di dati le variabili sono gli esami e gli studenti sono le unit` a. Nella prima riga ci sono i nomi delle variabili, ossia gli esami sostenuti dagli studenti. Perch e R sia in grado di caricare questi dati, occorre indicare al programma dove si trova il le. Qualora il le si trovasse in unaltra cartella diversa dal workspace occorre indicare tutto il percorso, per permettere al programma di individuare la cartella. Ad esempio, se la cartella dove si trovano i dati fosse "D:/my documents/data", si dovrebbe scrivere: read.table("D:/my documents/data/exams.txt", header = TRUE) dove largomento header posto uguale a TRUE sta a signicare che la prima riga della matrice di dati contiene i nomi delle variabili. Se, invece, la cartella in cui si trovano i dati ` e quella denita come spazio di lavoro, non serve indicarla. La soluzione pi` u semplice ` e, quindi, copiare il le nella nostra cartella "C:/lezioniR", in modo che il programma sia in grado di individuare i dati immediatamente, e scrivere: > exams = read.table("exams.txt", header = TRUE) > str(exams)\ndata.frame': $ EconomiaI : $ EconomiaII : $ StatisticaI : $ StatisticaII: $ Marketing :\n6 obs. of 18 30 23 20 30 25 21 30 22 19 30 22 26 30 28\n5 variables: 21 30 27 22 30 30 25 30 26 24 30 28 28 26 24\n5 Tramite il pacchetto foreign, R ` e in grado di leggere e salvare dati in formati provenienti da altri programmi di analisi statistica, come Stata, SPSS e SAS.\nEconomiaI EconomiaII StatisticaI StatisticaII Marketing Chiara 18 20 21 19 26 Piero 30 30 30 30 30 Sabrina 23 25 22 22 28 Elena 21 22 25 24 28 Sara 30 30 30 30 26 Marta 27 30 26 28 24 Una volta caricati i dati, si possono eettuare operazioni sulla matrice dei dati, o sulle singole variabili. Per accedere alle variabili della matrice dei dati si possono applicare le soluzioni viste precedentemente. Per cui, per richiamare la prima variabile si pu` o scrivere, ad esempio: > exams$EconomiaI  18 30 23 21 30 27 Se richiamassimo direttamente il nome della variabile, otterremmo un risultato di errore, perch e R non pu` o accedere direttamente alle variabili allinterno di una matrice di dati: > EconomiaI Error: object 'EconomiaI' not found La funzione attach() permette di caricare temporaneamente in memoria le singole variabili della matrice dei dati e rappresenta, quindi, una maniera pi` u veloce per accedere direttamente alle variabili della matrice dei dati: > attach(exams) > EconomiaI  18 30 23 21 30 27 Si osservi che comunque le variabili non compaiono nello spazio di lavoro: > ls()  "exams"\nOsservazione Una volta eettuate le analisi sulle variabili, ` e preferibile applicare la funzione detach(), che chiude laccesso diretto alle variabili. Consideriamo ora il le pazienti.csv, che riporta dati relativi a 15 persone, che sono state sottoposte ad un trattamento medico, sui quali sono state osservate le seguenti variabili6 :\nsesso; eta; col.pre, colesterolo totale, prima del trattamento; cor.pre, cortisolo plasmatico, prima del trattamento; umor.pre, umore, prima del trattamento; pess.pre, pessimismo, prima del trattamento; col.post, colesterolo totale, dopo il trattamento; cor.post, cortisolo plasmatico, dopo il trattamento; umor.post, umore, dopo il trattamento; pess.post, pessimismo, dopo il trattamento;\nI le con estensione .csv sono particolari tipi di documenti di testo che possono essere letti e salvati con Excel. In questo caso, il le ` e stato salvato con le impostazioni internazionali americane, per cui i decimali sono separati da un punto, e lo spazio tra le variabili ` e dato da una virgola7 . Queste informazioni vanno date alla funzione read.table(), tramite gli argomenti dec e sep rispettivamente: > pazienti = read.table("pazienti.csv", header = TRUE, dec = ".", + sep = ",", row.names = 1) > head(pazienti) sesso eta peso col.pre cor.pre umor.pre pess.pre col.post cor.post umor.post M 27 60 260 14.5 1 1 175 3.2 1 M 41 65 320 8.0 3 1 195 4.5 0 M 65 75 360 13.0 2 3 225 8.7 1 M 53 67 380 12.0 0 1 220 8.7 0 M 47 52 350 20.5 1 1 222 13.5 0 M 56 70 253 14.7 3 3 120 16.5 3 pess.post 1 1 1 2 3 4 5 6\n6 Le variabili relative allumore ed al pessimismo, sono state valutate in base alla scala della depressione di Beck. 7 Se il le viene salvato con le impostazioni italiane, i decimali sono separati da una virgola, mentre le variabili da un punto e virgola.\nLargomento row.names posto uguale ad 1 indica al programma di non leggere la prima colonna del data frame, che contiene lidenticativo del paziente, come una variabile, ma di impiegarla per identicare le righe della matrice dei dati, ossia come etichette delle unit` a. La funzione head mostra solo le prime sei righe della matrice dei dati, il che ` e utile quando si ha a che fare con matrici molto grandi8 . In alternativa, si pu` o impiegare la funzione read.csv(), che ` e adatta a leggere dati salvati in .csv, con le impostazioni internazionali anglosassoni9 : > pazienti = read.csv("pazienti.csv", row.names = 1) > str(pazienti)\ndata.frame': $ sesso : $ eta : $ peso : $ col.pre : $ cor.pre : $ umor.pre : $ pess.pre : $ col.post : $ cor.post : $ umor.post: $ pess.post:\n15 obs. of 11 variables: Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 1 1 1 ... int 27 41 65 53 47 56 40 58 32 40 ... int 60 65 75 67 52 70 68 56 82 70 ... int 260 320 360 380 350 253 400 250 136 172 ... num 14.5 8 13 12 20.5 14.7 7.2 13.3 13.6 8.3 ... int 1 3 2 0 1 3 1 3 2 2 ... int 1 1 3 1 1 3 0 3 2 3 ... int 175 195 225 220 222 120 245 320 165 148 ... num 3.2 4.5 8.7 8.7 13.5 16.5 8.5 12.9 11.8 8 ... int 1 0 1 0 0 3 0 3 0 0 ... int 1 0 3 1 0 3 0 2 0 1 ...\n> attach(pazienti) Nella funzione read.csv non occorre specicare gli argomenti header, dec e sep che sono gi` a impostati di default.\nOsservazione Si noti che, sia per il le exams che per pazienti, abbiamo impiegato la funzione attach(), per cui non sar` a necessario, nelle analisi che seguono, richiamare il nome della matrice dei dati di provenienza, ma solo i nomi delle variabili.\nSe si vuole visualizzare le prime n righe di una generica matrice X, si scrive: head(X, n), dove n ` e compreso tra 1 e il numero di righe della matrice. 9 Lequivalente per i le salvati con le impostazioni italiane ` e la funzione read.csv2.\nIntroduzione allanalisi dei dati\nLe principali funzioni per lanalisi dei dati\nIn bf R ci sono diverse funzioni per lanalisi descrittiva dei dati. Tra le pi` u utilizzate ricordiamo:\nmean() calcola la media di un vettore di dati; median() calcola la mediana di un vettore di dati; var() calcola la varianza di un vettore di dati, la covarianza tra due vettori, o la matrice di varianze e covarianze di una matrice di dati; cor() calcola la correlazione tra due vettori, o la matrice di correlazione di una matrice di dati; sd() calcola lo scarto quadratico medio (standard error) di un vettore di dati; summary() riporta le principali statistiche descrittive di un vettore o di una matrice di dati; length() restituisce la lunghezza del vettore (ossia la numerosit` a campionaria, se si opera su dati campionari); sum() calcola la somma degli elementi di un vettore.\nMolte altre funzioni per lanalisi statistica dei dati saranno introdotte, di volta in volta, con esempi specici. Alcuni esempi, basati sui dati del le exams.txt sono riportati di seguito. Per ridurre il numero di decimali, in maniera denita, senza dovere sempre utilzzare la funzione round, si utilizza la funzione options, che permette di modicare le opzioni di default di R. In particolare, scrivendo, ad esempio, options(digits = 2), tutti i risultati non interi verranno riportati con due numeri decimali. Se dopo la virgola ci sono degli zero, riporter` a i primi due numeri decimali dopo gli zeri10 : > > > > > > #salva le impostazioni iniziali op = options() #riporta al massimo tre numeri decimali options(digits = 3) #La media pu` o essere calcolata combinando le funzioni "sum" e "length" sum(EconomiaI)/length(EconomiaI)\n10 Dal momento che ogni modica con options ` e denitiva, no alla ne della sessione di lavoro, ` e opportuno salvare le impostazioni iniziali e ripristinarle alla ne dei calcoli.\n> #o direttamente con la funzione "mean" > mean(EconomiaI)  24.8 > #calcolo della mediana > median(EconomiaI)  25 > #La funzione "var" pu` o essere usata > #per il calcolo della varianza di un vettore: > var(EconomiaI)  24.6 > #per calcolare la covarianza tra due vettori: > var(EconomiaI, EconomiaII)  21.6 > #o per ricavare la matrice di varianze e covarianze > #tra le variabili di una matrice: > var(exams) EconomiaI EconomiaII StatisticaI StatisticaII Marketing EconomiaI 24.6 21.6 17.3 21.7 1.0 EconomiaII 21.6 20.2 14.1 18.9 -0.6 StatisticaI 17.3 14.1 14.7 16.8 1.6 StatisticaII 21.7 18.9 16.8 20.7 0.6 Marketing 1.0 -0.6 1.6 0.6 4.4 > #La funzione "cor" calcola la correlazione tra due variabili > cor(EconomiaI, EconomiaII)  0.972 > #o la matrice di correlazione > #tra le variabili di una matrice di dati quantitativi: > cor(exams) EconomiaI EconomiaII StatisticaI StatisticaII Marketing 1.0000 0.9719 0.913 0.9623 0.0962 0.9719 1.0000 0.818 0.9250 -0.0637 0.9132 0.8179 1.000 0.9642 0.1992 0.9623 0.9250 0.964 1.0000 0.0629 0.0962 -0.0637 0.199 0.0629 1.0000 22\nEconomiaI EconomiaII StatisticaI StatisticaII Marketing\n> #calcolo dello scarto quadratico medio: > sd(EconomiaI)  4.96 > #la funzione "summary", applicata ad un vettore numerico, > #ne calcola valori minimo e massimo, media, mediana e quartili > summary(EconomiaI) Min. 1st Qu. 18.0 21.5 Median 25.0 Mean 3rd Qu. 24.8 29.2 Max. 30.0\n> #applicata ad una matrice, > #riporta le principali informazioni per ciascuna variabile > summary(exams) EconomiaI Min. :18.0 1st Qu.:21.5 Median :25.0 Mean :24.8 3rd Qu.:29.2 Max. :30.0 3.1.2 EconomiaII Min. :20.0 1st Qu.:22.8 Median :27.5 Mean :26.2 3rd Qu.:30.0 Max. :30.0 StatisticaI Min. :21.0 1st Qu.:22.8 Median :25.5 Mean :25.7 3rd Qu.:29.0 Max. :30.0 StatisticaII Min. :19.0 1st Qu.:22.5 Median :26.0 Mean :25.5 3rd Qu.:29.5 Max. :30.0 Marketing Min. :24 1st Qu.:26 Median :27 Mean :27 3rd Qu.:28 Max. :30\nLe funzioni apply, tapply e aggregate\nLa funzione apply permette di calcolare una generica funzione sulle righe (qualora lapplicazione della funzione sulle righe abbia senso) o sulle colonne di una matrice di dati. La sintassi ` e apply(X, dim, FUN), dove X ` e una matrice di dati, dim ` e la dimensione lungo la quale si vuole calcolare la funzione: 1 = per riga, 2 = per colonna), e FUN ` e la funzione da applicare 11 ai dati . > #calcola le medie delle variabili per riga > apply(exams, 1, mean) Chiara 20.8 Piero Sabrina 30.0 24.0 Elena 24.0 Sara 29.2 Marta 27.0\n> #e per colonna > apply(exams, 2, mean) EconomiaI 24.8 EconomiaII 26.2 StatisticaI StatisticaII 25.7 25.5 Marketing 27.0\n11 Deve essere coerente con i dati che si vogliono analizzare. Non si pu` o impiegare la funzione mean, ad esempio, se le variabili non sono quantitative.\nIn questo caso, dal momento che le variabili sono omogenee (sono voti riportati agli esami), ha senso sia la media per riga, voto medio dello studente, sia quella per colonna, voto medio per esame. Se le variabili non sono omogenee, non ha senso eettuare operazioni per riga, ma solo per colonna. Se nel data frame sono presenti variabili di classicazione, ` e possibile calcolare una funzione separatamente su ciascuna classe di unit` a, tramite le funzioni tapply e aggregate, che si applicano, rispettivamente, ad un singolo vettore, e ad una matrice di dati. La sintassi della funzione tapply ` e: tapply(X, INDEX, FUN) dove X ` e un vettore, INDEX una variabile di classicazione12 , o una lista di variabili di classicazione, e FUN la funzione da applicare ai dati. Ad esempio, considerando la matrice di dati pazienti, se si vuole calcolare il peso medio dei pazienti, a seconda del sesso: > pesomedio.s = tapply(peso, sesso, mean) > pesomedio.s F M 74.0 65.3 La sintassi della funzione aggregate ` e: aggregate(x, by, FUN) dove x ` e una matrice di dati, by ` e una lista, al limite composta da un solo oggetto, di variabili di classicazione, e FUN, la funzione. Dalla matrice dei dati pazienti ricaviamo le variabili quantitative, e creiamo un nuovo data frame, sulle cui variabili calcoliamo la media in base al sesso: > pazienti2 = data.frame(eta, peso, col.pre, cor.pre, col.post, cor.post) > aggregate(pazienti2, list(sesso), mean) Group.1 eta peso col.pre cor.pre col.post cor.post 1 F 48.8 74.0 195 14.3 237 11.74 2 M 47.0 65.3 332 12.8 200 9.09 Il risultato ` e una matrice, sulle cui righe ci sono le medie delle variabili, distintamente per il sesso dei pazienti. 3.1.3 Distribuzioni di frequenze semplici e doppie\nPer generare distribuzioni di frequenze assolute semplici (una sola variabile) o doppie (due variabili) in R si utilizza la funzione table. Anche se la funzione pu` o essere applicata a qualsiasi tipo di variabile, ci occuperemo solo di distribuzioni di variabili qualitative, o quantitative discrete. La distribuzione di frequenze della variabile umor.pre, ad esempio, ` e:\nNon necessariamente salvata come factor.\n> fr = table(umor.pre) > fr umor.pre 0 1 2 3 1 4 7 3 La corrispondente distribuzione di frequenze relative si ottiene applicando la funzione prop.table alla distribuzione di frequenze assolute: > prop.table(fr) umor.pre 0 1 2 3 0.0667 0.2667 0.4667 0.2000 Per determinare distribuzioni di frequenza doppie, si utilizza sempre table. Prendendo come esempio la distribuzione dei pazienti, in base al sesso ed alla valutazione dellumore prima del trattamento: > fr1 = table(sesso, umor.pre) > fr1 umor.pre sesso 0 1 2 3 F 0 1 6 1 M 1 3 1 2 > prop.table(fr1) * 100 umor.pre sesso 0 1 2 3 F 0.00 6.67 40.00 6.67 M 6.67 20.00 6.67 13.33 dove la tabella delle frequenze relative ` e stata moltiplicata per 100, allo scopo di ottenere le percentuali, di pi` u immediata leggibilit` a.\nCreare graci con R\nR` e in grado di produrre diversi tipi di graco, attraverso funzioni per i graci, che possono essere divisi in tre gruppi: 1. funzioni di alto livello, che creano un nuovo graco sulla nestra graca; 2. funzioni di basso livello, che aggiungono parti ad un graco gi` a esistente; 25\n3. funzioni per graci interattivi, che consentono di aggiungere interattivamente informazioni, o di estrarne, da un graco esistente. In R ` e inotre disponibile una lunga serie di parametri graci, che permettono di personalizzare laspetto della nestra graca, che possono essere modicati dallutilizzatore. Si rimanda allhelp in linea della funzione par per una lista di tali argomenti. La funzione di alto livello principale e pi` u generale ` e plot(), ma, a seconda dellanalisi condotta, si possono impiegare altre funzioni di alto livello, pi` u speciche. Ogni volta che si utilizza la funzione plot(), o qualsiasi altra funzione di alto livello, si apre una nuova nestra graca, che sostituisce quella precedentemente aperta. Lo scatterplot, o diagramma di dispersione, ` e un graco cartesiano che permette di confrontare due variabili. E formato dalle coordinate di ciascuna coppia di punti, che rappresentano il valore assunto da ciascuna unit` a nelle due variabili messe a confronto. Tramite il diagramma di dispersione ` e possibile evidenziare sia la presenza di valori anomali, ovvero punti che si discostano dalla nuvola dei punti, sia lesistenza di relazioni tra le due variabili, ad esempio lineare o quadratica. La funzione impiegata per lo scatterplot ` e plot. In questo caso, la sintassi della funzione ` e: plot(x, y, type = "p") dove x e y sono due vettori che rappresentano le coordinate dei punti nel graco, mentre type denisce il tipo di graco. Nel caso di un diagramma di dispersione, si usa lopzione di default, ossia type = "p", che equivale ad un graco a punti. A partire dai dati contenuti nel le auto.csv creiamo, come esempio, un graco in cui si mettono a confronto il peso dellauto (peso) e la cilindrata (cilindrata) (Figura 1): > #carica i dati "auto" > auto <- read.csv("auto.csv", row.names = 1) > attach(auto) > plot(x = peso, y = cilindrata) In base al graco si vede che c` e una correlazione positiva tra le due variabili. Esercizio Calcolare la correlazione tra le due variabili, per vericare se lintuizione graca ` e giusticata. Il graco pu` o essere arricchito, con altri argomenti della funzione plot, come, ad esempio, main per inserire un titolo al graco, o xlab e ylab per inserire le intestazioni dellasse delle ascisse e delle ordinate rispettivamente. Possiamo anche modicare laspetto dei punti, con largomento pch, il cui valore di default ` e pari a 1, ed anche il colore, con largomento col, il cui valore di default ` e 1, equivalente a nero (Figura 2). > plot(peso, cilindrata, xlab = "peso (kg)", + ylab = "cilindrata (l)", main = "Auto", pch = 2, col = 2) 26\nFigure 1: Scatterplot dei dati relativi a peso e cilindrata\nG GG G G GG G G G GG GG G G G G G G GG GG G G G G G G G G G G G G G G G GG G G G G GG G G G GGG G G G G G G GG GGGG G G GG GG G GG G G G G G G G G G GG G G GG G G GG G G G GG G G G G G G G G G G G GG G G G G GG G G G G G G GG G G GG G G G G G G G G G G G G G G G G G G G\nFigure 2: Scatterplot dei dati relativi a peso e cilindrata con punti modicati\nFigure 3: Scatterplot dei dati relativi a peso e cilindrata con identicazione del tipo di trazione\nEsercizio Modicare pch e col per ottenere graci con aspetto diverso. Per identicare le unit` a sul graco con un colore e/o con un punto diverso, a seconda del valore di una variabile di classicazione, o fattore, si possono impiegare nuovamente gli argomenti pch e/o col. In questo caso va specicato per i due argomenti un vettore numerico, che permetta di associare un tipo di punto e/o un colore a ciascuna unit` a, a seconda della classe cui appartiene. Se la variabile di classicazione ` e un vettore di stringhe, dovr` a prima essere trasformata in vettore numerico tramite la funzione as.integer. Consideriamo il caso in cui si voglia identicare le auto in base alla trazione. La variabile trazione non ` e numerica, quindi va trasformata. Dopo la trasformazione, si ha che 4wd = 1, fwd = 2, rwd = 3. Si pu` o anche aggiungere una legenda, tramite la funzione legend, da inserire dopo la funzione plot, la cui sintassi di base ` e: legend(x, y, legend) dove x ed y sono le coordinate alle quali viene posizionata la legenda, mentre legend ` e un vettore, della stessa lunghezza del numero di classi diverse nella variabile di classicazione, che rappresenta i vari elementi da identicare. In questo caso si pu` o impiegare direttamente la funzione levels per ricavare i nomi delle classi. In generale, si costruisce un vettore con i nomi delle modalit` a della variabile di classicazione. Altri argomenti variano a seconda del graco. In questo caso occorrer` a associare a ciascun elemento del vettore di stringhe il simbolo corrispondente, attraverso pch e col (Figura 3). > traznum = as.integer(trazione) 28\n> plot(peso, cilindrata, pch = traznum, col = traznum) > legend(800, 5, legend = levels(trazione), pch = 1:3, col = 1:3) Dal graco si osserva che le automobili con quattro ruote motrici sono concentrate soprattutto tra quelle a bassa cilindrata e con un peso intorno alla media, le auto a trazione anteriore sono principalmente a bassa cilindrata e di piccolo peso, mentre tra quelle a trazione anteriore ci sono modelli con elevato peso e cilindrata. Esercizio Creare un graco simile al precedente, ma con alimentazione come variabile di classicazione. Commentare i risultati. Il graco a bolle, o bubbleplot, ` e un graco bi-dimensionale che permette di rappresentare contemporaneamente lassociazione tra tre variabili, x, y, z. La terza variabile viene rappresentata sostituendo i punti corrispondenti alle coordinate delle unit` a rispetto alle prime due variabili con delle bolle, la cui dimensione ` e proporzionale ai valori della terza variabile. Per la generazione del bubbleplot in R si impiega la funzione symbols, la cui sintassi ` e: symbols(x, y, circles, inches, fg = 1, bg) dove x, y sono le coordinate delle prime due variabili, circles stabilisce la circonferenza delle bolle, proporzionali ai valori assunti dalla terza variabile, inches che ssa la massima ampiezza delle bolle, fg che specica il colore del diametro della bolla (di default ` e nero = 1), mentre bg ` e un argomento che serve per determinare il colore con cui vanno riempite le bolle (di default non viene riempita). Altri argomenti sono comuni a quelli gi` a visti per plot. Consideriamo il caso in cui confrontiamo peso e cilindrata, con le bolle proporzionali alla percorrenza urbana (Figura 4): > symbols(peso, cilindrata, circles = percorr.urbana, + inches = 0.5, xlab = "peso (kg)", ylab = "cilindrata (l)", main = "Auto") In aggiunta a quanto visto con i precedenti graci, ora osserviamo che, come prevedibile, i modelli pi` u pesanti e con cilindrata pi` u elevata hanno anche una percorrenza urbana minore. Per distinguere le automobili in base allalimentazione (1 = benzina, 2 = diesel), possiamo riempire ogni bolla con un colore diverso (Figura 5): > + + > + symbols(peso, cilindrata, circles = percorr.urbana, inches = 0.5, xlab = "peso (kg)", ylab = "cilindrata (l)", bg = alimentazione, main = "Auto") legend(x = 880, y = 5, legend = c("benzina", "diesel"), pch = rep(16, 2), col = 1:2)\nIn questo caso si mette in evidenza lesistenza di due gruppi di auto con alimentazione diesel, un primo gruppo che si trova tra i modelli pi` u al disotto dei 1200 kg, a bassa cilindrata e ad elevata percorrenza urbana, un secondo con cilindrata attorno alla media, piuttosto pesanti e con una percorrenza urbana medio-bassa. 29\nFigure 4: Bubble plot\n4 cilindrata (l) 1 600 2 3 5\nFigure 5: Bubble plot con bolle distinte in base al tipo di alimentazione del motore\nFigure 6: Boxplot\nEsercizio Creare un graco simile al precedente, ma con trazione come variabile di classicazione. Commentare i risultati. Il boxplot ` e un graco che rappresenta le seguenti quantit` a: minimo, massimo, primo, secondo (mediana) e terzo quartile. Fornisce informazioni sulla sulla variabilit` a che sulla asimmetria di una distribuzione. Si richiede con la funzione boxplot (Figura 6). > boxplot(cilindrata) Un metodo per la rappresentazione contemporanea di tre o pi` u variabili ` e la matrice dei diagrammi di dispersione (scatterplot matrix). Si tratta di un insieme di diagrammi di dispersione nei quali sono messe a confronto tutte le coppie di variabili di una matrice di dati quantitativi. La funzione che genera la scatterplot matrix ` e pairs: pairs(x, labels) dove x ` e la matrice dei dati, mentre labels ` e il vettore dei nomi delle variabili. labels si utilizza, in maniera analoga alla funzione names, se si vuole modicare il nome delle variabili. Altri argomenti graci sono identici a quelli visti per le precedenti funzioni. Costruiamo la matrice dei diagrammi sul data frame auto2, ricavato dai dati auto (Figura 7): > auto2 = data.frame(peso, cilindrata, percorr.urbana) 31\nFigure 7: Scatterplot matrix\nG G G G G G GG G\nG G G G GG GG G G\nG G G G G G GG G G G G G GG G G G G G G G G G GG G G G GG GG G G G G G G G GG G G G G G GG G G G G G GG G G G G G G G G G G G G G G G G G GG G G G G G GG G G G G G G G G G G G G G G G G G G G G GG GG G G G G G G G GG G G G G G G G G G G G G G G G\nG G G G GG G G G G G G G G G G G G G G G GGG G G G G G G GG G GG G G G G G G G GGGG G GG G G G G GG G G G G GG G G G G\n> pairs(x = auto2, pch = 21, bg = 4) Guardando, ad esempio, alla prima riga della matrice dei graci, si osserva una relazione positiva tra peso e cilindrata, mentre quella tra peso e percorrenza urbana ` e negativa. Si possono distinguere le unit` a in base ad una variabile di classicazione, attraverso gli argomenti pch e bg, nello stesso modo visto negli esempi precedenti. In questo caso linserimento della legenda ` e molto pi` u complicato e trascende lobiettivo di questa dispensa. Esercizio Creare un graco in cui i punti e i colori dei punti cambino a seconda del tipo di trazione. Commentare i risultati. Per variabili qualitative, o quantitative discrete, possiamo costruire un diagramma a barre, in cui laltezza di ogni barra ` e proporzionale alla frequenza assoluta, o relativa, di ciascuna modalit` a della variabile, tramite la funzione barplot, applicata alloutput di table. Ad esempio, per la distribuzione di frequenze assolute dei modelli di auto in base al numero dei cilindri si ha (Figura 8: > barplot(table(N.cilindri)) Inne, per variabili qualitative, non ordinate, si pu` o utilizzare un graco a torta, che consiste nellattribuire ciascuna modalit` a della variabile ad una fetta di un cerchio, la cui ampiezza ` e proporzionale alla frequenza relativa della modalit` a, tramite funzione pie, applicata alloutput di table Con riferimento alla variabile trazione (Figura 9): 32\nG G G G G G G G G G G G G G G G G G G GG G GG G G G G G GG G G G G G G G G G G GG G G GG G G G G G G G G G G G G GG G G G G G G G G G G G GG G G G G G G GG GG G G GG G G GG G G G G G G GG G G G G GG G G G GGG G GG G G GG GG G G GG G G G GG G G GG G G G GG G G G G G G GG G G G G G G G\nG GG G G G G G G G G G G G G G G GG G G GG G G GG G GG G G G GG G GG GG G G G G G G G GG G G G G G GG G GGG G G G G G G GG G G G G\nG G G G G G G G G G G G G G GGG G GG G G G G GG G G GG GG G G G GG G G G G G G G G G G G GG G G G GG G G GG G G G GG G G G G G G G GG G G GG G G G G G G G G GG G GG G G G G G G G G G G G G G G GG G G\nG G G G G G G G G G GG G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G GGG G G G G G GG G G G G G G G G G G G G G G G G G G GG G G G G G G G G G G G G G GG G G G GGGG GG G G G G G GG G G G G G G G G G\nFigure 8: Diagramma a barre\nFigure 9: Graco a torta\nDi seguito si riportano i comandi per il trattamento di variabili casuali (v.c.) in R. Bernoulli\nDensit` a dbinom (x=x,size=1,prob= ) Ripartizione pbinom (q=x,size=1,prob= ) Quantile qbinom (p=,size=1,prob= ) Estrazione di valori casuali da una v.c. Bernoulli rbinom (n,size=1,prob= )\nDensit` a dbinom (x=x,size=m,prob= ) Ripartizione pbinom (q=x,size=m,prob= ) Quantile qbinom (p=,size=m,prob= ) Estrazione di valori casuali da una v.c. binomiale rbinom (n,size=m,prob= )\nDensit` a dgeom (x=x,prob= ) Ripartizione pgeom (q=x,prob= ) Quantile qgeom (p=,prob= ) Estrazione di valori casuali da una v.c. geometrica rgeom (n,prob= )\nDensit` a dpois (x=x,lambda=) Ripartizione ppois (q=x,lambda=) Quantile qpois (p=,lambda=) Estrazione di valori casuali da una v.c. Poisson rpois (n,lambda=)\nDensit` a dexp (x=x,rate=) Ripartizione pexp (q=x,rate=) Quantile qexp (p=,rate=) Estrazione di valori casuali da una v.c. esponenziale rexp (n,rate=) 34\nDensit` a dnorm (x=x,mean=,sd= ) Ripartizione pnorm (q=x,mean=,sd= ) Quantile qnorm (p=,mean=,sd= ) Estrazione di valori casuali da una v.c. normale rnorm (n,mean=,sd= )\nDensit` a dt (x=x,df=k) Ripartizione pt (q=x,df=k) Quantile qt (p=,df=k) Estrazione di valori casuali da una v.c. t di Student rt (n,df=k)\nDensit` a dchisq (x=x,df=k) Ripartizione pchisq (q=x,df=k) Quantile qchisq (p=,df=k) Estrazione di valori casuali da una v.c. 2 rchisq (n,df=k)\nDensit` a df (x=x,df1=n1,df2=n2) Ripartizione pf (q=x,df1=n1,df2=n2) Quantile qf (p=,df1=n1,df2=n2) Estrazione di valori casuali da una v.c. F di Fisher rf (n,df1=n1,df2=n2)\nDensit` a dunif (x=x,min,max) Ripartizione punif (x=x,min,max) Quantile qunif (p=,min,max) Estrazione di valori casuali da una v.c. F di Fisher runif (n,min,max)\nProbabilit` a di ottenere un valore pari a 3 (3 successi) in una binomiale n=10 prove indipendenti =0.5. > dbinom(3,10,0.5)  0.117 Funzione di ripartizione valore 3 (3 successi) in una binomiale n=10 prove indipendenti =0.5. > pbinom(3,10,0.5)  0.172 Quantile 0.171875 in una binomiale in una binomiale n=10 prove indipendenti =0.5. > qbinom(0.171875,10,0.5)  3 Generazione casuale di 5 valori in una binomiale n=10 prove indipendenti =0.5. > rbinom(5,10,0.5)  7 6 5 6 3 Vettore k contenente i numeri da 0 a 10 > k<-c(0:10) > k  0 1 2 3 4 5 6 7 8 9 10\nVettore contenente le probabilit` a dei valori da 0 a 10 in una binomiale n=10 prove indipendenti =0.5 (Figura 10). > p<-dbinom(k,10,0.5) > p  0.000977 0.009766 0.043945 0.117188 0.205078 0.246094 0.205078 0.117188  0.043945 0.009766 0.000977 Distribuzione di probabilit` a della funzione di probabilit` a dei valori da 0 a 10 in una binomiale n=10 prove indipendenti =0.8 (Figura 11). > p<-dbinom(k,10,0.8) 36\nFigure 10: Graco a barre verticali della funzione di probabilit` a dei valori da 0 a 10 in una binomiale n=10 prove indipendenti =0.5\n0.30 0.00 0 0.05 0.10 0.15 p 0.20 0.25\nFigure 11: Graco a barre verticali della funzione di probabilit` a dei valori da 0 a 10 in una binomiale n=10 prove indipendenti =0.8\nFigure 12: Graco a barre verticali della funzione di probabilit` a dei valori da 0 a 10 in una binomiale n=10 prove indipendenti =0.2\nFigure 13: Graco della distribuzione Normale con media uguale e diversa varianza o varianza uguale e diversa media\nN(0,0.5) N(0,1) N(2,1) 0.6 dnorm(x, 0, 0.5) 0.0 6 0.2 0.4\nFigure 14: Graco funzione di ripartizione Normale standard\n1.0 pnorm(x) 0.0 10 0.2 0.4 0.6 0.8\nDistribuzione di probabilit` a della funzione di probabilit` a dei valori da 0 a 10 in una binomiale n=10 prove indipendenti =0.2 (Figura 12). > p<-dbinom(k,10,0.2) Quantile 0.95 di una Normale standard > qnorm(0.95)  1.64 Quantile 0.975 di una Normale standard > qnorm(0.975)  1.96 Quantile 0.99 di una Normale standard > qnorm(0.99)  2.33 Quantile 0.025 di una Normale standard 39\n> qnorm(0.025)  -1.96 Quantile 0.975 di una t Student di parametro 10 > qt(0.975,10)  2.23 Quantile 0.975 di una t Student di parametro 20 > qt(0.975,20)  2.09 Quantile 0.95 di una chi-quadro di parametro 5 > qchisq(0.95,5)  11.1 Quantile 0.95 di una F di Fisher di parametri 2 e 3 > qf(0.95,2,3)  9.55 Il graco della distribuzione Normale con media uguale e diversa varianza o varianza uguale e diversa media si ottiene con la seguente sintassi (Figura 13): > curve(dnorm(x,0,0.5),-6,6) > curve(dnorm(x,0,1),-6,6,add=TRUE) > curve(dnorm(x,2,1),-6,6,add=TRUE)\nVerica delle ipotesi\nTest di ipotesi sul valor medio\nDato un campione estratto da una variabile casuale X , con distribuzione normale di media e varianza incognita 2 , se si vuole sottoporre a verica lipotesi che la media del campione sia pari a 0 , la verica dellipotesi viene eettuata sulla statistica test: t= X 0 , s/ n\ndove X ` e la media campionaria, s ` e la stima dello scarto quadratico medio e n ` e la numerosit` a del campione. Sotto lipotesi nulla, la statistica t si distribuisce come una variabile casuale T di Student, con n 1 gradi di libert` a. Per il test di ipotesi sul valore medio di un campione, in R si impiega la funzione t.test, che permette: 40\n1. di costruire un intervallo di condenza per la media; 2. di eseguire test di ipotesi sia su un singolo campione, sia per il confronto tra due campioni. La sintassi di base della funzione ` e: t.test(x, y = NULL, alternative = "two.sided", mu = 0, paired = FALSE, var.equal = FALSE, conf.level = 0.95) dove x ` e un vettore di dati, y ` e un vettore (opzionale) di dati, da specicare quando si vuole eettuare il confronto tra due campioni, mentre mu ` e lipotesi nulla sul valore della media (test su un campione), o sulla dierenza tra medie (test su due campioni). Di default mu = 0. Largomento alternative ` e una stringa che serve a specicare lipotesi alternativa. Pu` o essere "two.sided" (opzione di default), quando lipotesi alternativa ` e che la media (o la dierenza tra medie) ` e diversa da quella ssata nellipotesi nulla, "less", quando ` e minore, "greater", quando ` e maggiore. Inne conf.level ` e il livello di condenza dellintervallo, ovvero il complemento ad 1 della probabilit` a dellerrore di I specie ssato, di default posto uguale a 0.95. Gli argomenti paired e var.equal verranno commentati successivamente. Loutput della funzione ` e una lista che contiene, tra gli altri, i seguenti oggetti: statistic il valore della statistica t; parameter i gradi di libert` a della statistica t; p.value il p-value del test, che ` e la probabilit` a di ottenere un risultato pari (o pi` u estremo) di quello osservato, supposta vera lipotesi nulla, P r(|T | > t); conf.int lintervallo di condenza per la media; estimate il valore stimato della media, o della dierenza tra medie; null.value il valore specicato per lipotesi nulla; Eseguendo il test senza salvare il risultato, o richiamando il nome con cui vengono salvati i risultati, R restituisce le principali informazioni circa il test condotto. 5.1.1 Test t sulla media di un campione\nA partire dalle due variabili del dataframe pazienti che riportano il livello di colesterolo prima e dopo il trattamento, creiamo una nuova variabile, ratio, data dal rapporto tra le due. Questa variabile ` e un numero indice, minore di 1 se il livello di cortisolo ` e diminuito dopo il trattamento, e maggiore se vale il viceversa. > ratio = cor.post/cor.pre > summary(ratio) Min. 1st Qu. 0.221 0.611 Median 0.745 Mean 3rd Qu. 0.805 0.985 41 Max. 1.470\nLipotesi nulla che si vuole sottoporre a verica ` e che non ci sia dierenza nel livello di colesterolo, contro lipotesi alternativa che ci sia dierenza. In termini formali: H0 : = 1 H1 : = 1 Fissando un livello di signicativit` a pari a = 0.05, si ha: > t1 = t.test(ratio, mu = 1) > t1 One Sample t-test data: ratio t = -2.33, df = 14, p-value = 0.03535 alternative hypothesis: true mean is not equal to 1 95 percent confidence interval: 0.625 0.985 sample estimates: mean of x 0.805 > t1$statistic t -2.33 > t1$p.value  0.0353 > t1$estimate mean of x 0.805 Nellesempio abbiamo evidenziato sia le informazioni generali sul test, sia alcune delle informazioni pi` u rilevanti. Ricordando che il p-value pu` o anche essere interpretato come il minimo livello di signicativit` a per il quale lipotesi nulla viene riutata, dal momento che ` e minore di , lipotesi nulla viene riutata. Un altro modo di valutare i risultati del test ` e quello di confrontare la statistica t con il valore critico, o soglia, della distribuzione T di Student, al livello di signicativit` a pressato. Per ricavare i valori della distribuzione si impiega la funzione qt(p, df), dove p ` e una probabilit` a, o un vettore di probabilit` a, mentre df ` e il numero di gradi di libert` a. In pratica, per un dato valore di p, la funzione restituisce il valore tp tale che P rob(Tdf tp ) = p, dove Tdf ` e una variabile casuale T di Student, con df gradi di libert` a. Dal momento che il test ` e bi-direzionale, ossia lipotesi nulla pu` o essere riutata sia per valori positivi che negativi della statistica t, ricaviamo i due valori critici corrispondenti a t/2 e a t1/2 . 42\n> n = length(ratio) > n  15 > alpha = .05 > qt(c(alpha/2, 1 - (alpha/2)), n - 1)  -2.14 2.14\nLa distribuzione della statistica, con le regioni di accettazioni e di riuto, ` e illustrata 13 nella Figura 15. Il valore osservato per la statistica t non ` e compreso allinterno dei due valori critici, per cui, come visto precedentemente, lipotesi nulla viene riutata.\nFigure 15: Distribuzione della statistica t Test bidirezionale\nIn realt` a, lipotesi che si vorrebbe vericare ` e se il livello di cortisolo post-trattamento sia signicativamente minore di quello pre-trattamento. In tal senso, si potrebbe eettuare un test unidirezionale, del tipo: H0 : = 1 H1 : < 1\nLa sintassi per ottenere la funzione ` e piuttosto complicata, e non verr` a commentata. E tuttavia disponibile nello script della dispensa, per chi vuole approfondire.\ndove lipotesi nulla ` e, al solito, che non ci sia dierenza, contro lipotesi alternativa che, in media, il livello di cortisolo post-trattamento sia inferiore a quello osservato prima del trattamento. La distribuzione della statistica test, con la regione di accettazione e quella di riuto ` e riportata in Figura 16. Per eettuare il test in questo caso si scriver` a: > t.test(ratio, mu = 1, alternative = "less") One Sample t-test data: ratio t = -2.33, df = 14, p-value = 0.01767 alternative hypothesis: true mean is less than 1 95 percent confidence interval: -Inf 0.952 sample estimates: mean of x 0.805 Anche in questo caso lipotesi nulla viene riutata. Esercizio Calcolare il valore critico per il test unidirezionale. 5.1.2 Test t per campioni indipendenti e appaiati\nIl test pu` o essere condotto anche per confrontare le medie di due campioni. Consideriamo dapprima il caso di campioni indipendenti. Sempre con riferimento agli stessi dati dellesempio precedente, vogliamo vericare se il peso dei pazienti di sesso femminile sia maggiore di quello dei pazienti di sesso maschile. Costruiamo quindi due nuove variabili: > peso.m = peso[sesso == "M"] > peso.f = peso[sesso == "F"] > mean(peso.m)  65.3 > mean(peso.f)  74 H 0 : F = M H 1 : F > M\nFigure 16: Distribuzione della statistica t Test unidirezionale\nSi osservi che lipotesi nulla corrisponde a F M = 0, che equivale al valore di default per mu nella funzione t.test. Facciamo inoltre lulteriore ipotesi che le due varianze incognite siano uguali14 . In questo caso, si utilizza un argomento opzionale della funzione, ossia var.equal che va posto uguale a TRUE. Inne, ssiamo la probabilit` a dellerrore di I specie pari ad = 0.01: > t.test(peso.f, peso.m, var.equal = TRUE, + conf.level = 0.99, alternative = "greater") Two Sample t-test data: peso.f and peso.m t = 1.49, df = 13, p-value = 0.08 alternative hypothesis: true difference in means is greater than 0 99 percent confidence interval: -6.78 Inf sample estimates: mean of x mean of y 74.0 65.3 Lipotesi nulla viene accettata.\nIn realt` a, questa ipotesi pu` o essere sottoposta a verica, tramite la funzione var.test.\nOsservazione Nel caso in cui le varianze delle due popolazioni non possano essere assunte uguali, si pone var.equal = FALSE. Unaltra situazione comune ` e quella dei campioni appaiati. Lesempio pi` u comune ` e proprio quello relativo ai nostri dati, ossia vericare lecacia del trattamento, confrontando il valore medio di una qualche variabile del campione prima e dopo lesperimento. Per questo tipo di test si utilizza largomento paired, con lopzione tt TRUE. Per questo tipo di test consideriamo un nuovo data frame, sleep15 , che contiene dati relativi alleetto di due diversi sonniferi, in termini di incremento di numero di ore di sonno, su 10 pazienti. Le variabili sono: extra : numero extra di ore di sonno, rispetto ad un gruppo di controllo; group : tipo di sonnifero. In base al numero medio di ore di sonno extra nei due gruppi si osserva che, in media, con il secondo tipo di sonnifero i pazienti guadagnano in media pi` u ore di sonno. Si vuole vericare se questa dierenza ` e signicativa. > attach(sleep) > tapply(extra, group, mean) 1 2 0.75 2.33 > extra1 = extra[group == 1] > extra2 = extra[group == 2] > t.test(extra2, extra1, alternative = "greater", paired = T) Paired t-test data: extra2 and extra1 t = 4.06, df = 9, p-value = 0.001416 alternative hypothesis: true difference in means is greater than 0 95 percent confidence interval: 0.867 Inf sample estimates: mean of the differences 1.58 Come ci si aspetterebbe, lipotesi nulla, che corrisponde ad assumere che non ci sia dierenza tra i due gruppi viene riutata, a favore dellipotesi alternativa che la media del secondo gruppo ` e signicativamente maggiore di quella del primo.\nNella release di R sono inclusi un gran numero di data frame, che possono essere richiamati semplicemente specicando il nome del data frame. Scrivendo data(), comparir` a una nestra con lintera lista dei dati disponibili.\nEsercizio Il test sulle medie di campioni appaiati equivale ad un test sulle dierenze tra i due campioni. Vericare per esercizio.\nLanalisi della varianza (ANOVA) permette di confrontare due o pi` u gruppi di unit` a, deniti in base ad una o pi` u variabili di classicazione, tramite il confronto tra la variabilit` a interna di questi gruppi con la variabilit` a tra i gruppi. Lipotesi nulla ` e che tutti i gruppi abbiano la stessa media, e che le dierenze osservate tra i gruppi siano dovute solo al caso. La funzione che si impiega ` e anova, che viene applicata al risultato di una regressione lineare di una variabile continua su una o pi` u variabile discrete16 . Nel caso in cui si consideri una sola variabile esplicativa, si parla di analisi della varianza univariata, o ad una via. Consideriamo di nuovo i dati relativi alla matrice pazienti. Lipotesi nulla che vogliamo vericare ` e che, a prescindere dal livello di autovalutazione del pessimismo dopo il trattamento, il livello di colesterolo, sempre dopo il trattamento, sia sempre lo stesso, contro lipotesi alternativa che almeno due gruppi siano dierenti tra loro in media. In R bisogna prima eettuare la regressione della variazione del livello di cortisolo sullumore dopo il trattamento, e poi eettuare lanalisi della varianza. La regressione lineare tra le due variabili si ottiene con la funzione lm17 : > fit = lm(col.post ~ factor(pess.post)) > fit Call: lm(formula = col.post ~ factor(pess.post)) Coefficients: (Intercept) 216.7\n> anova.fit = anova(fit) > as.matrix(anova.fit) Df Sum Sq Mean Sq F value Pr(>F) factor(pess.post) 3 19849 6616 3.12 0.0701 Residuals 11 23313 2119 NA NA Si osservi che la variabile umor.post ` e stata trasformata in una variabile di classicazione, tramite la funzione factor. Prima di commentare i risultati, commentiamo loutput delle due funzioni. La funzione lm restituisce i coecienti stimati della regressione18 . Nellanalisi della varianza il valore di\nLe variabili esplicative devono essere salvate come factor. La tilde tra le due variabili nella funzione lm si ottiene tenendo premuto il tasto Alt e digitando 126. 18 In realt` a, la maggior parte deloutput, come spesso avviene in R non ` e immediatamente visibile, ma ` e salvata in una lista, in questo caso salvata con il nome fit.\ntali coecienti non ` e di particolare interesse, quanto piuttosto il loro segno. Si noti, intanto, che sono riportati i coecienti di tutti i gruppi, tranne il primo, "A". Questo perch e R lo considera come gruppo di riferimento. In eetti, lintercetta ` e proprio il numero medio di insetti trovati vivi negli esperimenti nei quali si usa questo tipo di spray. I rimanenti valori dei coecienti rappresentano il valore dierenziale rispetto al gruppo di riferimento. Loutput della funzione anova, che per comodit` a ` e stato riportato come una matrice, tramite la funzione as.matrix, restituisce la scomposizione della varianza e della devianza sia nei gruppi che tra i gruppi. Nelle prime tre colonne della prima riga della matrice ci sono i valori relativi alla devianza tra i gruppi. Il primo valore ` e il numero di gradi di libert` a (pari al numero di gruppi, meno 1), il secondo ` e la devianza tra i gruppi e il terzo la varianza. La seconda riga riporta i corrispondenti valori per la devianza nei gruppi. Tornando alla prima riga, il quarto valore ` e il valore della statistica F che si utilizza per sottoporre a verica lipotesi che le medie dei diversi gruppi sono uguali. Si osservi che il valore della statistica ` e pari al rapporto tra la varianza tra i gruppi e quella nei gruppi. Lidea ` e che se le medie sono uguali tra loro, la varianza dei gruppi ` e nulla, per cui tale rapporto ` e pari a 0. In generale, per accettare lipotesi nulla ci si aspettano valori piccoli di tale rapporto. Lultimo valore ` e il corrispondente p-value, ossia la probabilit` a di osservare un valore maggiore di quello osservato per la statistica F . Se il valore della statistica ` e 19 sucientemente piccolo, il p-value sar` a elevato, e lipotesi nulla non pu` o essere riutata . Nel nostro caso, il test risulta non signicativo, perch e il p-value ` e piccolo, ma comunque superiore ai livelli di signicativit` a generalmente ssati, per cui si accetta lipotesi nulla.\nIn presenza di una tabella di contingenza ` e possibile calcolare il valore di 2 , per vericare la presenza di connessione o di indipendenza tra le due variabili della tabella. Il test 2 serve a vericare se il valore della statistica ` e signicativamente diverso da 0, nel qual caso c` e dipendenza tra le due variabili. Costruiamo la tabella di contingenza per le variabili sesso e umor.post. Si vuole vericare lipotesi nulla che ci sia indipendenza tra le due variabili. > tab = table(sesso, umor.post) > tab umor.post sesso 0 1 2 3 F 5 0 2 1 M 4 2 0 1 Per eettuare il test, si utilizza la funzione summary, applicata alla tabella: > summary(tab)\nNella seconda riga questi valori non possono essere calcolati, e il programma restituisce un valore di dato mancante, NA.\nNumber of cases in table: 15 Number of factors: 2 Test for independence of all factors: Chisq = 4, df = 3, p-value = 0.3 Chi-squared approximation may be incorrect > #ripristina le impostazioni iniziali di R > options(op) In alternativa si pu` o utilizzare la funzione chisq.test. Il valore del p-value associato a questo test ` e superiore agli usuali livelli di signicativit` a che vengono ssati, per cui lipotesi di indipendenza non pu` o essere riutata.\nDocumenti simili a Dispensa R\nAltro di Stefano Furlan\nEsempio Applicazione Distribuzione Di Gumbel


Difesa del suolo. Lavori su torrente Esse ultimo atto della Provincia di Arezzo\n“Quella di oggi è l’ultima volta che parleremo di difesa del suolo”. Con il riordino delle Province e la conseguente ridistribuzione delle competenze, dal 1° gennaio 2016 sarà la Regione Toscana a prendersi cura di questo aspetto. Opere...\nClaudia Failli 10 novembre 2015 15:19\n“Quella di oggi è l’ultima volta che parleremo di difesa del suolo”.\nCon il riordino delle Province e la conseguente ridistribuzione delle competenze, dal 1° gennaio 2016 sarà la Regione Toscana a prendersi cura di questo aspetto. Opere idrauliche, bonifiche, interventi di messa in sicurezza del territorio. Tutto sarà gestito dal personale in forza alla Regione.\n“All’atto pratico i cambiamenti non saranno troppo evidenti – ha sottolineato il presidente della Provincia di Arezzo, Roberto Vasai – i presìdi e il personale verranno mantenuti nel territorio di competenza. Il coordinamento e la parte politica però saranno appannaggio della Regione”.\nCosì la Provincia di Arezzo, come le altre toscane, non svolgerà più mansioni di questo tipo e cederà il testimone alla Regione per quanto riguarda la progettazione e l’esecuzione di opere ed interventi e al Consorzio di Bonifica, il quale già da tempo svolge il ruolo di garante per la manutenzione.\nCosì, nell’ultima conferenza stampa organizzata dalla Provincia di Arezzo e incentrata sul tema della sicurezza idrogeologica, sono stati presentati i lavori eseguiti sui torrenti Esse di Cortona e Foiano. “I nove milioni che ci sono stati assegnati dalla Regione per la messa in sicurezza idraulica del territorio dopo le alluvioni del 2012 sono stati interamente spesi, a prova dell'efficienza e dell'efficacia del nostro servizio di difesa del suolo”. Il Presidente della Provincia Roberto Vasai non nasconde il suo orgoglio annunciando la fine dei lavori sul torrente Esse di Cortona e sull'omonimo torrente a Foiano, oltre a interventi compiuti nel territorio della provincia di Siena che è assegnato a quella di Arezzo per quanto riguarda la difesa idraulica. I lavori hanno riguardato il consolidamento degli argini del torrente Esse di Foiano, tra il ponte sulla S.P. 29 Cassia e la confluenza nell’Allacciante di Sinistra, per un importo di 2.200.000 di euro, e l’adeguamento degli argini del torrente Esse di Cortona per la protezione dell'abitato di Camucia, per un importo di 1.500.000 euro. “Ho voluto che fossero presenti anche i Comuni perché questi interventi li abbiamo fatti in stretto rapporto con le amministrazioni locali, interpretando così il ruolo di ente di secondo livello che oggi la legge ci assegna – ha proseguito Vasai. Quella della difesa del suolo è una delle materie che dal primo gennaio 2016 sarà di competenza regionale, e siamo certi di passare il testimone fornendo una struttura ben organizzata che potrà continuare ad operare in maniera proficua anche nella futura organizzazione della Regione”. "I lavori sono stati complessi, come ha ricordato l'Ingegner Leando Radicchi, responsabile della difesa del suolo della Provincia, perché hanno comportato anche procedure di esproprio, ed hanno visto il consolidamento arginale con interventi finalizzati ad impedirne la rottura in caso di piena". Francesco Sonnati - Sindaco Foiano della Chiana Miriano Miniati - Assessore comune Cortona Soddisfazione è stata espressa dagli amministratori di Cortona e Foiano: “questo intervento ci consente, tra l'altro, di mettere in sicurezza la zona dell'Outlet dove ci sono 140 attività commerciali”, ha detto il Sindaco di Foiano Francesco Sonnati mentre l'Assessore ai lavori pubblici del Comune di Cortona Miriano Miniati ha sottolineato come l'opera consenta di mettere in sicurezza l'abitato di Camucia con i suoi 8.000 abitanti. Entrambi hanno poi sottolineato un aspetto, e cioè la possibilità di utilizzare gli argini ricostruiti come percorsi ciclabili e pedonali: “si tratta di un effetto collaterale, per una volta positivo, dell'intervento che è pensato per consentire il pronto soccorso idraulico e una migliore vigilanza”, ha spiegato l'Ingegner Radicchi.


Orecchini Argento 925.EVER FAITH Semplice Lacrima Quotidiano Orecchio Infila Ciondola gli Orecchini Adornato con Cristallo  - €11.12 : Donna, Loafer e mocassini donna, Articoli per feste e compleanni, Sport e giochi allaperto, Prodotti per la pulizia delle scarpe e accessori, Abbigliamento premaman - magnagraeciateatrofestival.it\n♥ Materiale: *L'argento è in argento sterling 925. L'argento puro è troppo morbido per gli oggetti funzionali. al fine di rafforzare la durezza dell'argento. di solito aggiunge circa il 7.5% di rame. *Cascuna cristallo o zircone o perla. devono essere sottoposti a una rigorosa selezione. sia in base al colore.taglio o la chiarezza. *Non allergico.Senza nickel e senza piombo. ♥ Disegno: *Ognuno dei nostri prodotti vale la pena di acquistare. indossare. collezionare e come un regalo. *Tutti i regali vengono consegnati nella scatola per regalo. *Un ricordo segni di amore. affetto e sincero promessa. è un regalo meraviglioso per esprimere benedizioni e felice. Nota:L'immagine non ben mostrato la dinamica scintilla e lucentezza dei gioielli al sole. ♥ Il modo migliore per estendere la vita di servizio: * Quando non ti aspetti di indossarlo per un lungo periodo. mettilo in una busta o scatola sigillata. * Usando il panno morbido per pulire la superficie dei gioielli per rimuovere l'opacità e l'ottusità. * Non indossarlo con altri gioielli in metallo e conservare separatamente. * Non indossarlo quando fai il bagno. nuoti o lavori di casa. * Non entrare in contatto con altre sostanze chimiche come alcali e candeggina. ♥ Garanzia e Supporto: Al fine di garantire la soddisfazione dei clienti che acquistano.per qualsiasi problema o domanda non esitate a contattarci.\n♥MISURA: Lunghezza dell'Orecchini: 8cm(3.1in). Larghezza: 0.9cm(0.4in). Ogni Peso Orecchini: 1.5g.\nJFUME Donna Orecchini Collana in Argento Sterling 925 - Perla Bianca Coltivata D'acqua Dolce e Giada\nIJEWELRY2 principessa taglio quadrato in acciaio – Orecchini a bottone magnetico no piercing 7 mm\nElements Silver - Orecchini pendenti da donna con cristallo Swarovski. argento sterling 925. cod. E4462L\nDoppio ciclo Orecchini a lobo con Cristallo Swarovski Perla simulata bianca 18 kt placcato oro rosa per donne\nOrecchini. B.Catcher Orecchini in argento 925 Set di orecchini a forma di cuore con borchie Crazy Love in argento sterling 925\nGold Gala Orecchini in Argento 925% Rodiato Anallergici Bimba Ragazza


ALGODISTROFIA CON DOLORI ATROCI AL PIEDE E DEVASTAZIONI FARMACOLOGICHE - VALDO VACCARO\nYou are at:Home»Patologie muscoloscheletriche e connettivali»Algodistrofia»ALGODISTROFIA CON DOLORI ATROCI AL PIEDE E DEVASTAZIONI FARMACOLOGICHE\nBy Valdo Vaccaro\t 3 Gennaio 2016 1 commento\nUNA SITUAZIONE DRAMMATICA DALL’AUSTRALIA\nCaro Valdo, innanzitutto le faccio i migliori auguri di Buon Anno. È da tanto vorrei contattarla ma temevo di appesantire la sua posta. Questa volta però ho davvero necessità di un contatto urgente, essendo preso dalla disperazione. Il giorno 11 Novembre 2015 mia moglie è stata portata d’urgenza all’ospedale con sintomi di febbre alta, vomiti, convulsioni, e dolori lancinanti nella regione renale e gambe. La prima diagnosi è stata di infezione urinaria con possibile colica renale, per cui è stata sottoposta a trattamento di antibiotici per via endovenosa.\nPROBLEMI RENALI, INFIAMMAZIONI, CELLULITE E ULCERE\nLa sua pressione era molto bassa e il grado di infiammazione nel sangue, dopo i primi esami, era intorno a 145, quando in una persona normale il livello, secondo i medici, non supera mai 4 o 5 units.\nIl giorno dopo la sua degenza ospedaliera il piede destro di mia moglie ha rivelato uno sfogo cutaneo tipo morbillo, sempre più rosso fino ad arrivare all’altezza dell’inguine. Dopodiché al posto del rossore si sono formate delle autentiche piaghe diventate ulcerose ed infette. Per i dottori si tratta di infezione cutanea chiamata cellulite o cellulitis. Noi viviamo a Melbourne.\nDIAGNOSI DI SINDROME REGIONALE DOLOROSA COMPLESSA\nPurtroppo mia moglie ha dovuto smettere il trattamento di antibiotici per via endovenosa dopo tre settimane di cure a causa di reazione allergica. Il problema più grave è che, nonostante le ferite a gamba e piede si stiano rimarginandosi, c’è stata pure una diagnosi di Sindrome Regionale Dolorosa Complessa. Infatti, dopo sei settimane di degenza ospedaliera non riesce più nemmeno ad appoggiare per terra il piede destro colpito da questa infiammazione cutanea. Da poco ho anche scoperto che ha avuto pure un attacco di meningite acuta.\nDOLORI LANCINANTI E DIFFICOLTÀ MOTORIE\nIn Australia le risorse mediche non mancano. Mia moglie ha subito un piccolo intervento che le ha un po’ addormentato il nervo simpatico collegato ai nervi periferici del piede destro, per consentirle di fare un po’ di fisioterapia, in modo che piede e arto non si atrofizzino più di tanto. Il problema è che, dopo la prima settimana di deambulazione e di fisioterapia, lei stenta a camminare. Dopo aver fatto certi esercizi mi dice che la gamba ed il piede le fanno un male da morire. C’è anche da sottolineare che, per oltre due mesi, è stata bombardata da antibiotici, steroidi, oppioidi, nervo bloccanti tipo Lyrica ed Endine che non sono chiaramente indicati per uso a lungo termine dato i loro effetti collaterali e l’assuefazione che provocano.\nCURE MEDICHE A BASE DI OPPIOIDI E DI INTEGRAZIONI SINTETICHE\nHo provato a parlare con i medici di questo ospedale al centro di riabilitazione. Ho chiesto se c’era un metodo più igienistico ed innocente per affrontare questo problema e mi hanno risposto picche. L’unica cosa che hanno fatto, è stata quella di aggiungere supplementi di magnesio e vitamina C, sintetici ovviamente, ai vari oppioidi.\nABBONDANZA DI FRUTTA E VERDURE\nData la buona stagione qui in Australia continuo a rifornirla di ciliegie, sedano, avocado, insalate a base di pomodori freschi e rucola piccante, lamponi, susine, mirtilli, more, pesche, papaya e simili, per far sì che qualcosa di naturale la mangi. Purtroppo, a parte le difficoltà motorie c’è anche la stitichezza dovuta a tutte queste medicine. Come rimedio usiamo le prugne secche.\nCONTINUI DOLORI MUSCOLARI E RICERCA DI QUALCHE SOLUZIONE ALTERNATIVA ALLE CURE MEDICHE\nRimane il dramma dei continui dolori ai muscoli ed alle ossa creati dalla fisioterapia, oltre che da quasi sette settimane di immobilità. Lei è ancora giovane e credo che almeno questo sia un vantaggio. Le chiedo se, a parte mangiare sano, cosa che già sta facendo, esiste qualche altro suo consiglio. Spero di poter ricevere sua risposta nei prossimi giorni se le sarà possibile. La ringrazio comunque. Distinti saluti.\nCiao Sergio. La sindrome che hanno diagnosticato i medici australiani si chiama algodistrofia dal greco algos=dolore e dystrophos=malnutrizione del tessuto. La sindrome algodistrofica colpisce gli arti superiori come mano e spalla ma in particolare i piedi. È caratterizzata da gonfiore o edema, rigidità e dolori articolari. Può aggravarsi fino a creare problemi vasomotori e circolatori, determinando un’atrofia progressiva dei muscoli. Si manifesta da sola o accompagnata da una poliartrite.\nPULIRSI INTERNAMENTE È LA STRATEGIA PRIORITARIA\nLa realtà è che non ci sono sindromi specifiche e malattie strane, ma sempre uno stato alterato del corpo che si manifesta nei punti deboli con sintomi particolari. Solo la pulizia interna del corpo può guarire. Niente altro che quello. Questo diceva il grande Louis Kuhne. Tua moglie deve prima depurarsi e migliorare la condizione del suo sangue e del linfatico, e poi rafforzarsi progressivamente.\nOgni trauma neuro-muscolare-osseo è un evento di tipo fisico, ma finisce alla lunga per scatenare l’insorgenza di un trauma emozionale. La convivenza con uno stato di stress non è facile né tantomeno produttiva per chi deve riacquistare equilibrio e salute. Occorre pertanto darsi da fare per superare questa barriera.\nServono forza morale, doti di pazienza e di determinazione, fiducia in se stessi e nelle leggi della Natura, recupero delle migliori risorse interne. Leggi della Natura che includono non solo il principio di causa ed effetto, per cui se esiste questa patologia ci sono dei precisi fattori causanti a monte, che vanno individuati e disattivati, mentre il sintomo invalidante, qualunque sia il suo nome, non deve diventare oggetto di accanimento terapeutico e vittima di ripetute risonanze. Leggi della Natura che includono anche la Legge di autoguarigione, la Legge per la quale il corpo non va mai contro se stesso purché gliene diamo l’occasione e l’opportunità, evitando di aggredirlo con la paura, con le prospettive catastrofistiche, con i farmaci distruttivi e coi bastoni tra le ruote al proprio sistema immunitario.\nMALATTIE IATROGENE IN PREVALENZA\nPurtroppo gli interventi medici subiti hanno finito per aggravare le condizioni della tua compagna di vita, per cui non si sa in che misura i problemi siano suoi originali o invece di tipo iatrogeno, ovvero medico-causati. Non per pregiudizio ma per obiettività, temo che i guasti causati da antibiotici e da oppiacei siano alla base di questo andamento degenerativo.\nI danni degli antinfiammatori, del cortisone, degli antibiotici e degli oppiacei non sono pochi e non sono leggeri, soprattutto se vengono prolungati nel tempo. Il cortisone danneggia fegato, milza, reni e cuore. Incrementa colesterolo e trigliceridi, altera la glicemia e provoca sovrappeso, comporta tachicardia ed ipertensione. In pratica il cortisone ne combina di cotte e di crude e finisce per danneggiare irreparabilmente la qualità del sangue. Cortisone nemico numero uno della regola regina di Padre Taddeo, per cui nessuno muore di mal di cuore e tutti muoiono di sangue grasso, nessuno muore di sclerosi multipla ma tutti muoiono di sangue grasso, nessuno muore di diabete o di cancro ma tutti muoiono di sangue grasso. Antibiotici ed oppiacei non sono da meno. L’aggiunta di vitamina C sintetica e di magnesio inorganico non ha fatto altro che aggihngere mala al male, provocando ulteriore acidificazione del sangue.\nMIGLIORARE LE CONDIZIONI DEL SANGUE, DELLA CIRCOLAZIONE E DELLA STRUTTURA OSSEA\nRilevo danni alla circolazione e danni alle ossa. Nella osteoporosi le ossa diventano leggere, porose, deboli ed assottigliate. Per contrastare gli aspetti osteoporotici della alterazione occorre eliminare rigorosamente farmaci, integratori, alcol, caffè, the, fumo, zuccheri raffinati evidenti e nascosti. Occorre esporsi il più possibile al sole. Assumere frutta e verdure crude, cavoli, crescione d’acqua e di terra, ravanelli, rape, carote, acetosa, ortiche, tarassaco, ananas, manghi, papaie, durian, miele grezzo. L’Australia brilla per questo tipo di risorse. Esistono pure prodotti alimentari di alta qualità, con una marea di cereali e di semini. Queste sono tutte cose che stai sfruttando al meglio, mi pare.\nL’applicazione del pacchetto-salute della Health Science, includente ovviamente studio regolare ed approfondito del blog, pensiero positivo, movimento con cyclette e con camminate assistite da sostegni o racchette, respirazione profonda-ritmata-addominale, cattura energetica da ogni possibile fonte extra-alimentare, nutrizione vegan-crudista tendenziale e sostenibile, personalizzata secondo gusti ed esigenze particolari, mette il corpo nelle migliori condizioni possibili per venire a capo della patologia e per guarire.\nAttenti però a non cadere nel tranello della disinformazione e delle incertezze. Dalle patologie reumatiche si guarisce ma occorre preparazione, fiducia, coerenza e pazienza. Mandar fuori l’acidità, l’acido urico, i veleni dei farmaci non è cosa da ridere. Staccarsi dai farmaci e dagli integratori non è cosa da ridere. Il miglioramento nella dieta e nei comportamenti implica sempre una fase eliminativa fastidiosa e prolungata, proporzionata per intensità e durata allo stock tossico accumulato. Occorre in tali circostanze forza morale e determinazione a guarire.\nNon fare come una lettrice di Roma che, nei giorni scorsi, di fronte alle difficoltà eliminative di tipo reumatico-artritico non ha trovato nulla di meglio che accusarmi di dare cattivi consigli, per cui si è rimessa nelle mani dei fidati medici riprendendo farmaci e integratori, ribaltando ignobilmente ogni logica ed ogni raziocinio. Non ha mica detto “Scusami ma non me la sento di proseguire perché al momento non posso interrompere i miei viaggi e i miei intensi impegni di lavoro”, ma ha preteso di scaricare il suo pessimo barile ideologico sulla Scienza Igienistica”. Il massimo della irriconoscenza. Cose da chiodi.\nDopo un privilegiato incontro col dr Alec Burton non si cede alle prime difficoltà\nPrevious ArticleRISOLTO IL PROBLEMA DELLE SUDORAZIONI ECCESSIVE CORRELATE A CARENZA DI FERRO\nNext Article STRATEGIA VINCENTE CONTRO SINUSITE AGGRAVATA DA CUROMANIA OSPEDALIERA SUL SINTOMO\nLETTERA LA MIA SCELTA DI CAMPO L’HO GIÀ FATTA Buon giorno Dr Vaccaro. Ho scoperto…


Assistenza ai disabili gravi, AISLA promuove il "Premio Majori" - FNOPI\nFNOPI / ATTUALITÀ / Assistenza ai disabili gravi, AISLA promuove il "Premio Majori"\nAssistenza ai disabili gravi, AISLA promuove il "Premio Majori"\n01/08/2019 - Iniziativa della Onlus a sostegno della formazione di giovani infermieri laureati: i vincitori avranno accesso a tre borse di studio per partecipare al Master di I livello in presa in carico di persone con grave disabilità a Milano.\nL’Associazione Aisla Onlus, a sostegno della formazione di giovani infermieri laureati che si specializzano nell’assistenza delle persone con grave disabilità, promuove il “Premio Majori”, dedicato all’omonimo professore. I vincitori avranno accesso a tre borse di studio di 4.500 euro ciascuna per partecipare, da novembre prossimo (e per 12 mesi), al "Master di I livello in presa in carico di persone con grave disabilità”, organizzato dal Centro NEMO Milano e dall’Università di Milano.\nIl concorso vuole promuovere la conoscenza e la formazione sulla grave disabilità, con particolare attenzione all’assistenza di persone affette da SLA e i loro familiari. Il Master, infatti, si pone l’obiettivo di accompagnare le persone malate, la famiglia e il contesto sociale nel percorso di cura, allo scopo di riportare al centro la persona assistita, aiutarla e sostenerla nel suo percorso di malattia, potenziando una più fitta rete assistenziale che possa accogliere il paziente e la sua famiglia. Questo, per facilitare il passaggio, dalla fase di presa in carico altamente specialistica in regime di ricovero, a quella domiciliare o territoriale in un rapporto di mutua interazione e non di esclusione. Il corso si ispira al “nurse coach”, figura professionale molto presente nel mondo sanitario USA, che ha il compito di formare le persone che si prendono cura dei malati, con particolare attenzione agli aspetti clinici, assistenziali e organizzativi. Il bando di concorso è rivolto a: laureati in Scienze Infermieristiche (a.a. 2016/2017 o 2017/2018) con meno di 28 anni.\nLe domande di partecipazione devono essere inviate entro e non oltre il 15 settembre 2019 al seguente indirizzo mail: premiomajori@aisla.it. Le selezioni si svolgeranno dal 16 al 22 settembre 2019. I primi sei candidati in graduatoria devono iscriversi, entro il giorno 30 settembre 2019 ore 13, alle prove di selezioni sul sito www.unimi.it pagando la quota di iscrizione di euro 50,- (cinquanta/00). Il 21 ottobre 2019, alle 9, i primi sei candidati in graduatoria dovranno affrontare le prove di selezione presso l’ospedale Niguarda.\nLa graduatoria del Master verrà stilata in base all’esito della prova scritta sotto forma di test (40%), colloquio (40%) e valutazione del CV (20%). AISLA Onlus offrirà la borsa di studio ai tre candidati, dei sei preselezionati, che hanno raggiunto il miglior punteggio alla prova di selezione e un rimborso spese forfettario di 200 euro ai tre candidati che hanno affrontato le prove di selezione senza posizionarsi tra i primi tre. La cerimonia di premiazione si svolgerà il 21 aprile 2020.


Lankenauta In fondo il buio\n“Il Selvaggio West nello spazio profondo. La caccia vi terrà svegli”. L’affermazione (dal Los Angeles Time) presente nella quarta di copertina di “In fondo il buio”, è impegnativa, non è di quelle che passano inosservate. Curiosando qua e là possiamo trovare anche altri commenti – positivi – dove più che di “west” si parla di fantasy, di richiami a Tolkien, di “fantascienza pura”, di immaginario che ricorda la tradizione epica e così via. In realtà, dopo aver terminato il romanzo, molti lettori avranno capito che l’opera di George R.R. Martin non è incasellabile in un filone definito, tipo steampunk fantasy o post apocalittico: gli ingredienti fantasy e quelli fantascientifici si fondono semmai per un racconto che, pur segnato da una particolare malinconia (la vicenda è ambientata in un mondo morente), nel suo scandire azione e drammi fino all’ultima pagina, difficilmente farà conoscere la parola noia. Da questo punto di vista la casa editrice Gargoyle ha avuto fiuto nel recuperare, con nuova traduzione e nuovo titolo italiano, “Dying of the Light” (1977), il primo romanzo di genere scritto da Martin, già edito come “La luce morente” nel 1979 per i tipi di Armenia.\nLa vicenda si svolge sul Worlorn, in un futuro indefinito, dopo che gli esseri umani, sopravvissuti alle guerre con gli alieni, hanno colonizzato una parte della galassia: nuovi mondi e quindi nuove culture per uomini sempre più distanti e alieni tra loro. Worlorn è un pianeta che non orbita stabilmente in un sistema solare, vaga senza una precisa meta, che però in tempi meno remoti è giunto vicino alla Ruota di Fuoco, super-gigante rosso, attorno al quale ruotano altri sei soli più piccoli. Questa circostanza permise agli uomini di quattordici diversi pianeti di colonizzarlo e di costruirci le loro città. Adesso però il pianeta Worlon si sta nuovamente allontanando dalla luce, si dirige pericolosamente verso il “grande mare nero”, lo spazio intergalattico senza stelle, e pochi sono gli uomini rimasti a presidiare il mondo morente. Su Worlorn viene chiamato Dirk t’Larien dalla sua ex amante Gwen, non si capisce bene per quale motivo; non fosse altro che la donna, come “betheyn”, è ormai legata, in maniera subalterna e servile, a due strani personaggi: Jaantony Vikary e al suo “teyn” Lorimar. L’uomo è proveniente da Alto Kavalan, un mondo che, dopo le guerre aliene, è tornato in condizioni primitive e che, ancora dopo secoli, si caratterizza per gli abitanti divisi in clan e pervasi di un’inquietante cultura guerriera e un sanguinario senso dell’onore. Betheyn si scoprirà è un termine che indica il legame di una donna al capo clan, mentre teyn è un legame di amicizia tra due uomini. Legami non subito ben definiti, soprattutto quello tra teyn, che fino all’ultimo conserveranno una particolare ambiguità, tali da scatenare il precipitare degli eventi, scontri all’ultimo sangue tra uomini legati ad una tradizione violenta e uomini che, a costo della vita, da questa tentano di affrancarsi.\nNelle ultime righe del romanzo troviamo t’Larien intento ad affrontare un mortale pericolo, mentre fino a quel momento i suoi sforzi apparivano volti a salvare se stesso e la sua ex amante piuttosto che a mostrarsi eroico guerriero: il cerchio della vicenda non si chiude e rimane invece aperta per un possibile seguito. Un immaginario fantascientifico quello di Martin che si caratterizza da una scrittura piuttosto elegante, con le sue suggestioni epiche e le descrizioni di un pianeta destinato all’oscurità. La tecnologia di questo mondo morente, dove le civiltà aliene sono soltanto ricordate come artefici di antichi massacri, risulta differenziata da città a città, a seconda delle diverse culture umane colonizzatrici. Questa idea consente all’autore di fondere in maniera virtuosa sia elementi più propriamente fantascientifici, sia elementi definibili come fantasy, di modo da far convivere la violenza del medioevo, o di un “west” senza legge, con le meraviglie del futuro.\nSi è scritto anche della presenza di un mix di “epica, sesso e nostalgia”. L’epica e la nostalgia sono elementi che balzano subito agli occhi: non potrebbe essere altrimenti leggendo di un pianeta destinato ad uno spazio intergalattico senza luce, con foreste che pian piano marciscono a causa del sistema solare sempre più debole e lontano, con città quasi disabitate e con guerrieri barbari che vivono per uccidere “falsi uomini” (forse antico ricordo di alieni mutanti), come fossero appartenenti ad un Ku Klux Klan del futuro. Altro discorso il sesso: nessuna ginnastica erotica e nemmeno esercizi di stile su organi inturgiditi, semmai un che di ambiguo che caratterizza i rapporti tra i protagonisti del romanzo ed in particolare tra la betheyn e i teyn. Possiamo affermare che nel romanzo di Martin si coglie una voluta ambiguità, intesa come descrizioni che lasciano sul vago gli usi e costumi di Alto Kavalan: ad esempio i legami tra i teyn, la genesi dei clan dopo le invasioni aliene, la condizione delle poche donne sopravvissute alla mercé della comunità; e non ultimo il grottesco saluto tra guerrieri prima di una sfida all’ultimo sangue. Tradizioni barbare, decadenti e una sessualità sterile di uomini che si ritrovano ultimi colonizzatori di un mondo destinato al buio.\nQuesto è Worlorn: “Un vagabondo, un viaggiatore senza meta, una scoria della creazione; questo era il pianeta. Per un’infinità di secoli aveva continuato nella sua corsa, solitario e senza scopo, precipitando tra i freddi e remoti spazi che si spalancano fra le stelle. Nei suoi cieli sterili, generazioni di astri si erano presentate l’una dopo l’altra in sciami maestosi. E tuttavia non apparteneva a nessuna. Costituiva un mondo completamente racchiuso in se stesso. In certo qual modo non faceva parte nemmeno della galassia, anche se ne intersecava il piano come un chiodo attraversa la tonda superficie di un tavolo. Non faceva parte di niente”.\nGeorge R. R. Martin, In fondo il buio, (traduzione Tarallo & Tintori), Gargoyle, collana Gargoyle Extra, Roma 2012, pag. 364, euro 16,90\ncase editrici Dying of the Light epica fantascienza fantasy gargoyle George R.R. Martin in fondo il buio Letteratura letteratura americana letteratura fantastica Narrativa Tarallo & Tintori