Sei sulla pagina 1di 222

Universita` degli Studi di Torino

Ennio Davide Isaia

Linguaggio R e applicazioni statistiche

a.a. 2000-2001

Dipartimento di Statistica e Matematica Applicata “Diego de Castro”

`

E senza dubbio inevitabile che questi appunti presentino errori materiali; Saro` grato a tutti coloro, e specialmente agli Studenti, che vorranno se- gnalarci qualunque problema, dai piu` banali errori tipografici alle oscurit a` nell’esposizione.

Avvertenza

Tutti i diritti di questa pubblicazione sono degli autori. Viene consentita la riproduzione integrale di questa pubblicazione a titolo gra- tuito. Altres`ı e` permessa, sempre a titolo gratuito, l’utilizzazione di parti di que- sta pubblicazione in altra opera all’inderogabile condizione che ne venga citata la provenienza e che della nuova opera nella sua interezza vengano consenti- te la riproduzione integrale a titolo gratuito e l’utilizzazione di parti a queste stesse condizioni. L’uso di questa pubblicazione in qualsiasi forma comporta l’accettazione integrale e senza riserve di quanto sopra.

Dipartimento di Statistica e Matematica Applicata “Diego de Castro” Corso Unione Sovietica, 218/bis 10134, Torino (Italy) c 2000–2009

Capitolo 1 Intro duzione ad R

R, parente di S-Plus ed erede di S, `e un ambiente integrato che consente di elab orare

dati, eseguire calcoli e creare rappresentazioni grafiche; dotato di un linguaggio di programmazione ad alto livello, con esso `e p ossibile eseguire op erazioni assai complesse con p o che linee di comandi e, p ertanto, si dimostra uno strumento estremamente p otente che p ermette di analizzare e risolvere problemi sp ecifici attinenti a diversi

settori scientifici.

Le sue caratteristiche p eculiari, ai fini statistici, sono rappresentate dalla p ossibilit`a

di elab orazione di grandi quantit`a di dati, la vasta disp onibilit`a di op eratori p er il

calcolo matriciale e vettoriale nonch´e l’enorme disp onibilit`a di librerie (“package”)

matematiche, statistiche e grafiche.

R, inoltre, `e un software completamente gratuito e continuamente aggiornato, disp o-

nibile p er piattaforme Unix (FreeBSD, NetBSD, Linux, Irix, Solaris, OSF/1, AIX, HPUX), Windows 9x/NT nonch´e MacOS. La URL u ciale p er il progetto R `e:

http://www.r-project.org

dove `e p ossibile prelevare l’ultima versione di R, un manuale u ciale di riferimento a cura del R Core Team (2000) nonch´e una vasta gamma di “packages” aggiuntivi; un’in- teressante lista di “Frequently Asked Questions”, The R FAQ a cura di Kurt Hornik, `e rep eribile all’indirizzo http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html.

Una volta acquisito il programma e prescindendo dall’installazione/compilazione a seconda della piattaforma di destinazione, l’applicativo ed altri file, tra cui .Renviron

Home Directory ,

saranno raccolti in un’unica directory, ad esempio <drive>\

la quale, a sua volta, conterr`a altre directory, tra le quali:

\R

\library : contenente le librerie (“package”) di base nonch´e quelle di interesse p er l’utente, ad esempio:

\library\base

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

\library\ctest

\library\modreg

nelle quali sono p osti i file, in formato ACI I, CONTENTS , DESCRIPTION , INDEX e TITLE ; inoltre, ciascuna di esse ha una struttura comune, articolata in altre directory tra cui citiamo:

\R : contenente il file sorgente, in formato ACI I, delle funzioni definite p er il “package” stesso;

\data : contenente alcuni archivi di dati a cui viene sp esso fatto riferimento nelle finestre di “help” di R stesso.

\help : contenente, in formato compresso (.zip, .tar, linea;

\html , \latex : ove sono p osti i file di help in formato html e L A T E X.

) i file di help in

\doc : contenente, organizzati in corrisp ondenti sotto-directory, alcuni do cu- menti di aiuto.

A

tal prop osito `e b ene tenere a mente che essenziale ai fini di un corretto funzionamen-

to

dell’applicativo `e la presenza del “package” base , contenente in \library\base\R il

file di definizione dei principali comandi (base ), nonch´e il file Rprofile di definizione dell’ambiente di lavoro.

1.1 L’ambiente di lavoro

Una volta lanciato il programma compare la finestra R GUI 1 , dove p otranno essere impartiti i comandi e saranno visualizzati i risultati delle elab orazioni o gli eventuali messaggi di errore; tale finestra disp one di menu (File, Edit, Misc, Windows, Help) auto esplicativi. Nel seguito lavoreremo unicamente attreverso la finestra R GUI , cio`e impartiremo, dop o il classico prompt > , i comandi in sequenza oppure li sottop orremo in mo dalit`a “batch”. All’avvio R GUI mostra alcune informazioni, quali la versione di R che si sta usando ed alcuni comandi chiave p er iniziare o chiudere una sessione di lavoro. Un comando, a cui ci abitueremo, `e help(argomento) ; ad esempio help() chiede ad R di aprire una nuova finestra che contiene una breve guida in linea dal titolo

1 Sotto Unix compare la finestra R Console, il cui asp etto `e piuttosto spartanto. Sotto MacOS e Linux-pp c comapre la fienstra R Console, delt tutto analoga alla finestra R GUI che caratterizza i sistemi Windows9x/NT e Linux.

2

E. D. Isaia, Linguaggio R e applicazioni statistiche

“R Information”. Tale finestra ore una descrizione dettagliata del comando e, pi u` imp ortante, rip orta in fondo una serie di esempi che, mediante “copia e incolla”, p ossono essere inseriti sulla Console. Un secondo comando utile p er avvicinarsi ad R `e demo() , il quale, a seconda della versione installata, p otrebb e p orgere:

> demo()

Use ‘demo(topic)’ where choices for argument ‘topic’ are:

topics [1,] "graphics" [2,] "image" [3,] "lm.glm" [4,] "glm.vr" [5,] "nlm"

[6,] "recursion" [7,] "scoping" [8,] "is.things" [9,] "dyn.load"

In sostanza R suggerisce di utilizzare il comando nella forma demo(topics) , dove

topic `e uno degli argomenti prop osti; ad esempio demo(graphics) . Una terza finestra disp onibile `e la Graphics Window ove verranno visualizzati, ap-

punto, i grafici via via richiesti. Questa abitualmente non viene ap erta all’avvio

di R, ma viene attivata allorch´e si impartisce un comando che prevede un out-

put grafico. L’utente pu`o in ogni caso forzare la sua attivazione con il comando X11() , windows() o macintosh() a seconda della piattaforma Unix, Windows9x/NT

o MacOS risp ettivamente.

`

E b ene tenere a mente che p er default l’area di lavoro corrisp onde alla directory \R Home Directory ; tale situazione pu`o essere mo dificata in qualsiasi istante rico- rendo al comando setwd(<directory>) . Cos`ı, ad esempio, immaginando un’instal- lazione su piattaforma Windows, p otremmo avere:

> getwd()

[1] "C:\Programs\R"

> setwd("C:\Progetti") NULL

> getwd()

[1] "C:\Progetti"

> setwd(R.home())

NULL

> getwd()

3

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

[1] "C:\Programs\R"

Al momento di abbandonare R, ci viene richiesto se desideriamo registrare quanto svolto nella corrente sessione di lavoro:

> q() Save workspace image? [y/n/c]:

In

caso aermativo, l’intero “workspace” verr`a registrato, p er default, sul file Rdata ;

in

tal mo do sar`a p ossibile “ritornare al punto” semplicemente lancianto R tramite

Rdata .

1.2 Primi passi in R

Le entit`a con cui lavora R vengono dette oggetti; questi vengono identificati tramite un nome, a discrezione dell’utente, che deve iniziare con un carattere alfab etico e non

pu`o contenere spazi bianchi n`e i caratteri @ , # , $ , _ , mentre `e ammesso l’uso del punto (. ) quale separatore tra i caratteri.

Se gli elementi di un oggetto presentano tutti la stessa mo dalit`a, numerica, alfanume-

rica, logica oppure complessa, l’oggetto stesso viene detto elementare. Tali oggetti, a loro volta, p ossono essere dotati di una struttura di matrice, e ci`o nel senso algebrico

del termine, oppure p ossono concorrere a creare quelli che nel seguito chiameremo oggetti complessi. Ci`o premesso, dedichiamo i paragrafi che seguono alla descrizione di come definire e

manip olare oggetti con struttura elementare, di matrice o complessa ed eseguire su

di essi alcune semplici op erazioni, ricorrendo a funzioni predefinite ovvero creadone

altre ad ho c.

1.2.1 Creazione di oggetti elementari

La creazione di un qualsiasi oggetto avviene ricorrendo al comando di assegnazione <- e non, come `e norma abituale con altri linguaggi di programmazione, tramite il simb olo = , a cui segue, in linea di massima, entro parentesi tonde precedute dal prefisso c , acronimo di combine, l’elenco dei suoi elementi, ciasuno dei quali separato da una virgola. Qualora l’oggetto p ossedesse mo dalit`a alfanumerica, il suoi elementi debb ono essere racchiusi entro virgolette (" ).

Ci`o premesso, la visualizzazione degli elementi di un oggetto pu`o avvenire digitandone

il nome oppure, in fase di definizione, racchiudendone l’istruzione entro parentesi tonde.

Esempio 1.2.1 Ci prop oniamo di creare tre oggetti elementari e di visualizzarne il contenuto; pi u` precisamente:

4

E. D. Isaia, Linguaggio R e applicazioni statistiche

x contenente il solo elemento numerico 17:

> x<-c(17)

> x

[1] 17

y i cui elementi corrisp ondono agli interi 10, 13, 17, 20:

> (y<-c(10,13,17,20))

[1] 10 13 17 20

alpha che conterr`a tre caratteri alfanumerici

> (alpha<-c("Valor medio","Mediana","Varianza"))

[1] "Valor medio" "Mediana"

"Varianza"

A questo punto, p ossiamo intro durre le seguenti istruzioni di utilit`a assai generale:

ls() : visualizza l’elenco degli oggetti definiti in una sessione di lavoro 2 .

ls.str() : p orge un breve“reso conto” circa la struttura degli oggetti definiti nella corrente sessione di lavoro. Informazioni dettagliate circa uno sp ecifico oggetto, si ottengono con il comando str(oggetto) ;

mode(oggetto) : restituisce, sottoforma di stringa, la mo dalit`a dell’oggetto indicato;

: consente la rimozione degli oggetti sp ecificati.

Desiderando rimuovere tutti gli oggetti definiti nel corso di una sessione di lavoro si pu`o ricorrere all’istruzione rm(list=ls()) . La rimozione del solo contenuto di un oggetto avviene tramite l’assegnazione oggetto<-NULL

rm(oggetto1,

,oggetton)

Esempio 1.2.2 Con riferimento ai tre oggetti intro dotti all’Esempio 1.2.1, si osservi il com- p ortamento, auto esplicativo, delle istruzioni:

> ls.str()

alpha : chr [1:3] "Valor medio" "Mediana" "Varianza"

x :

y num [1:4] 10 13 17 20

> mode(alpha) [1] "character"

> (y<-NULL)

num 17

:

2 In alternativa si pu`o ricorrere al comando objects().

5

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

NULL

> ls()

[1] "alpha" "x"

> rm(x)

> ls()

"y"

[1] "alpha" "y"

> rm(y,alpha)

> ls()

character(0)

Pu`o a volte capitare di volere elencare (o rimuovere) solo alcuni degli oggetti definiti durante una sessione di lavoro; ci`o avviene ricorrendo all’opzione pattern= , propria dei comandi ls() , rm() e ls.str() . A tal riguardo, si osservi il comp ortamento delle istruzioni:

> C02<-c(0.011,0.012,0.013,0.012)

> fattoreA<-c(1,2,1,2)

> fattoreB<-c(1,2,1,2)

> ls()

[1] "C02"

"fattoreA"

> ls.str(pattern="fat")

"fattoreB"

fattoreA :

num [1:4] 1 2 1 2

fattoreB :

num [1:4] 1 2 1 2

> rm(list=ls(pattern="fat"))

> ls()

[1] "C02"

L’opzione pattern= , come la maggior parte delle opzioni R, pu`o essere abbreviata, qualora non sussistano ambiguit`a, ai primi tre caratteri; nel seguito tuttavia, p er motivi di chiarezza esp ositiva, ricorreremo sempre alla forma estesa.

1.2.2 Creazione di oggetti contenenti sequenze regolari

La creazione di oggetti contenenti “sequenze regolari” di elementi numerici o alfanu- merici pu`o avvenire ricorrendo ai comandi:

c(n1:n2) : crea una sequenza di interi consecutivi da n1 a n2 , in ordine crescente se n 1 < n 2, in ordine decrescente altrimenti;

seq(n1,n2,by=passo) : crea una sequenza di numeri consecutivi da n1 a n2 con incrementi pari a quanto sp ecificato in passo , in ordine crescente se n 1 < n 2, in

6

E. D. Isaia, Linguaggio R e applicazioni statistiche

ordine decrescente altrimenti. Qualora l’opzione by=passo fosse omessa e n1 e n2 fossero interi, l’istruzione verrebb e ad essere equivalente a c(n1:n2) . Un’al- ternativa a by= `e rappresentata dall’opzione length= , con la quale si stabilisce appunto la lunghezza della sequenza o, meglio, il numero dei suoi elementi;

rep(k:n) : crea un oggetto contenente i valori, numerici o alfanumerici, sp ecifi- cati in k rip etuti n volte;

letters[k:n] o LETTERS[k:n] : creano una sequenza di lettere, minuscole e maiuscole risp ettivamente, dell’alfab eto latino comprese tra k ed n .

Altri comandi sp ecifici, quali gl() , expand.grid() , ppoints() e sequence() , ver- ranno presentati al paragrafo 1.2.6.

Esempio 1.2.3 Creazione e visualizzazione dell’oggetto x che conterr`a i primi dieci interi

p ositivi:

> (x<-c(1:10))

[1]

1

2

3

4

5

6

7

8

9 10

Si noti che saremmo giunti allo stesso risultato ricorrendo all’istruzione seq() :

> (x<-seq(1,10))

[1]

1

2

3

4

5

6

7

8

9 10

Esempio 1.2.4 Creazione e visualizzazione dell’oggetto x che conterr`a 11 numeri progressivi da 20 a 21 con passo 0.10:

> (x<-seq(20,21,by=0.10))

[1] 20.0 20.1 20.2 20.3 20.4 20.5 20.6 20.7 20.8 20.9 21.0

Allo stesso risultato saremmo p ervenuti con il comando:

> (x<-seq(20,21,length=11))

[1] 20.0 20.1 20.2 20.3 20.4 20.5 20.6 20.7 20.8 20.9 21.0

Esempio 1.2.5 Creazione dell’oggetto x che conterr`a, nell’ordine, 3 elementi a valore nullo e 4 elementi a valore unitario.

> (x<-c(rep(0,3),rep(1,4)))

[1]

0 0

0

1

1

1

1

7

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

Esempio 1.2.6 Visualizzazione delle stringhe "Conforme" e "Difettoso" rip etute la prima tre volte e la seconda una sola volta:

> c(rep("Conforme",3),rep("Difettoso",1))

[1] "Conforme" "Conforme" "Conforme" "Difettoso"

Esempio 1.2.7 Creazione e visualizzazione dell’oggetto alfabeto che conterr`a le prime sette lettere, in minuscolo, dell’alfab eto (latino):

> (alfabeto<-letters[1:7])

[1] "a" "b" "c" "d" "e" "f" "g"

Si osservi il comp ortamento delle istruzioni:

> LETTERS[1:7]

[1] "A" "B" "C" "D" "E" "F" "G"

> paste(letters[1:3],sep="",collapse="+")

[1] "a+b+c"

> paste("Fattore",letters[1:3],sep="",collapse="+")

[1] "Fattorea+Fattoreb+Fattorec"

1.2.3 Manip olazione di oggetti elementari

In R esistono svariati comandi che consentono la manip olazione di oggetti, numerici o alfanumerici; tra essi val qui la p ena citare i seguenti di utilit`a generale:

append(x,y) : aggiunge agli elementi dell’oggeto x gli elementi di y ;

c(x,y) : crea un nuovo oggetto a partire da due oggetti x e y ;

paste(x,y) : crea un un nuovo oggetto contenente, sottoforma alfanumerica, gli elementi appaiati degli oggetti x e y ; l’opzione sep="simbolo" consen- te di separare i diversi elementi con il simbolo desiderato, mentre l’opzione collapse="simbolo" p ermette di separare i singoli risultati con il simbolo prescelto;

rev(x) : p osiziona in senso inverso gli elementi di x ;

sort(x) : ordina in senso crescente gli elementi di x ; altrimenti;

8

E. D. Isaia, Linguaggio R e applicazioni statistiche

unique(x) : restituisce gli elementi non rip etuti contenuti in x .

x[posizione1,

,posizionen]:

estrae dall’oggeto x gli elementi che o ccupano

la p osizione sp ecificata in posizione1, ,posizionen;

Altri comandi verranno presentati al paragrafo 1.2.6.

Esempio 1.2.8 Ordinamento in senso crescente degli elementi di x<-c(10:1) :

>

sort(x)

 

[1]

1

2

3

4

5

6

7

8

9 10

o,

equivalentemente:

 

>

rev(x)

 

[1]

1

2

3

4

5

6

7

8

9 10

A

prop osito di rev() , si noti che:

>

rev(c(10,11,9))

 

[1]

9 11 10

 

e ci`o co erentemente con quanto detto a prop osito.

Esempio 1.2.9 Creazione di un nuovo oggetto a partire da due oggetti definiti:

> x<-c(1:5)

 

> y<-rev(x)

> (z<-c(x,y))

[1] 1

2 3 4

5 5 4

3

2 1

 

Esempio 1.2.10 Creazione, a partire da due oggetti, di un nuovo oggetto che contiene, sottoforma alfanumerica, gli elementi appaiati degli oggetti iniziali.

> x<-c(1:5)

> y<-c(-5:-1)

> paste(x,y)

[1] "1 -5" "2 -4" "3 -3" "4 -2" "5 -1"

Si ossservi che, co erentemente:

> paste(x)

[1] "1" "2" "3" "4" "5"

Si noti, ancora, il comp ortamento dei seguenti comandi:

9

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

> paste(y,x,sep="*")

[1] "-5*1" "-4*2" "-3*3" "-2*4" "-1*5"

> paste(y,x,sep="*",collapse="<->")

[1] "-5*1<->-4*2<->-3*3<->-2*4<->-1*5"

Esempio 1.2.11 Estrazione dall’oggetto x , che contiene gli interi consecutivi da 1 a 20, degli elementi che o ccupano la terza e la do dicesima p osizione.

> x<-c(1:20)

> x[3]

[1] 3

> x[12]

[1] 12

Esempio 1.2.12 Creazione, a partire dall’oggetto x , che contiene gli interi consecutivi da

10 a 20, dell’oggetto y che conterr`a i tre elementi che o ccupano la prima, la terza e la sesta

p osizione in x .

> (x<-c(10:20))

[1] 10 11 12 13 14 15 16 17 18 19 20

> (y<-x[c(1,3,6)] ) [1] 10 12 15

Esempio 1.2.13 Creazione dell’oggetto z che conterr`a, nell’ordine, i primi tre elementi di x ,

i due elementi di y quindi i restanti elementi di x .

> (x<-c(10:17))

[1] 10 11 12 13 14 15 16 17

> (y<-c(300,400))

[1] 300 400

> (z<-append(x, y, after=3))

13

[1]

10

11

12 300 400

14

15

16

17

Esempio 1.2.14 Eliminazione ed ordinamento crescente degli elementi rip etuti di un ogget- to.

> (x<-c(c(5:8),c(1:7)))

2 3

> sort(unique(x))

8 1

[1] 5 6 7

4 5

6 7

[1] 1 2

3 4 5

6 7 8

10

E. D. Isaia, Linguaggio R e applicazioni statistiche

Esempio 1.2.15 Creazione, a partire dall’oggetto x che contiene 3 elementi a valore nullo e 4 elementi a valore unitario, dell’oggetto sesso che conterr`a l’etichetta Femmina se x=0 oppure Maschio se x=1 .

> (x<-c(rep(0,3),rep(1,4)))

[1]

0 0 0

1

1

1

1

> (sex<-c(rep("Femmina",3),rep("Maschio",4)))

[1] "Femmina" "Femmina" "Femmina" "Maschio" "Maschio" "Maschio" "Maschio"

Un’alternativa `e o erta dal ricorso al comando names() ; ad esempio:

> (x<-c(rep(0,3),rep(1,4)))

[1] 0 0 0

1

1

1

1

> (names(x)<-c(rep("Femmina",3),rep("Maschio",4)))

[1] "Femmina" "Femmina" "Femmina" "Maschio" "Maschio" "Maschio" "Maschio"

Per maggiori dettagli sul comando names() , cfr. paragrafo 1.2.6.

1.2.4 Op eratori aritmetici e funzioni matematiche

Sugli oggetti elementari con mo dalit`a numerica `e p ossible eseguire le pi u` comuni op e- razioni aritmetiche, quali la somma (+), il pro dotto (* ), la divisione (/ ), l’elevamento a p otenza (^ ), proprie di un qualsiasi linguaggio di programmazione.

Esempio 1.2.16 Dati i due oggetti x e y ad elemeti numerici:

> x<-seq(1:5)

> y<-x^2

le istruzioni che seguono si commentano da s`e:

> x-(1/y)

[1] 0.000000 1.750000 2.888889 3.937500 4.960000

> 100*(x+y)^(-1)

[1] 50.000000 16.666667 8.333333 5.000000 3.333333

> y^(.5)+x

[1]

2

4

6

8 10

Vale qui la p ena accennare alla presenza di due particolari op eratori, %% e %/% , il cui impiego, a volte utile, `e illustrato dagli esempi che seguono.

Esempio 1.2.17 Posto che l’oggetto x contenga gli interi consecutivi da 1 a 10, ci prop oniamo di:

11

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

— individuare quali di essi `e divisibile p er 2. A tal fine p ossiamo considerare il comando x%%2 che p orge il resto della divisione di ciascun elemento di x p er 2:

> x<-c(1:10)

> x%%2

1 0

[1]

1 0

1 0

1 0

1 0

— calcolare la parte intera della divisione tra ciascun elemento di x e 2. A tal fine sopp erisce il comando x%/%2 , infatti:

> x<-c(1:10)

> x%/%2

1 2

[1]

0

1

2 3

3 4 4 5

Quanto alle funzioni matematiche, tra le quali figurano exp() , log() , log10() ,

, p ensabile orirne qui un’elenco seppur parziale; alcune di esse, di interesse sotto il

profilo statistico, sono presentate al paragrafo che segue, mentre altre ancora saranno intro dotte pi u` oltre allorch´e verranno arontati problemi sp ecifici. Accenniamo, infine, alla presenza di particolari funzioni che cosentono di eseguire le pi u` comuni op erazioni su insiemi:

, `e im-

log2() ,

sin() , cos() , tan() , asin() , acos() , atan() , sqrt() , abs()

union(x,y) : restituisce l’insieme costituito dall’unione degli insiemi x e y ;

intersect(x,y) : restituisce l’insieme costituito dall’intersezione degli insiemi x e y ;

setdiff(x,y) : rstituisce l’insieme costituito dalla dierenza tra insiemi x e y ;

setequal(x,y) : restituisce il valore logico TRUE se gli insiemi contengono gli stessi elementi, il valore logico FALSE altrimenti;

is.element(el,set) : restituisce il valore logico TRUE se l’elemento in el `e contenuto in set , il valore logico FALSE altrimenti. Un alias del comando `e %in% .

Esempio 1.2.18 Definiti gli oggetti A<-letters[1:4] e B<-letters[3:7] , abbiamo:

> union(A,B)

[1] "a" "b" "c" "d" "e" "f" "g"

> intersect(A,B) [1] "c" "d"

setdiff(A,B) [1] "a" "b"

>

>

setdiff(B,A)

12

[1] "e" "f" "g"

> is.element(A,setdiff(A,B))

[1]

TRUE TRUE FALSE FALSE

> "f"%in%union(A,B)

[1] TRUE

E. D. Isaia, Linguaggio R e applicazioni statistiche

> is.element("q",setdiff(letters[1:24],union(A,B)))

[1] TRUE

Si noti che tali op eratori in ogni caso rimuovono gli elementi duplicati di un insieme.

1.2.5 Su alcune funzioni statistiche

Tra le innumerevoli funzioni statistiche implementate, p er il momento ci limitiamo a citare le pi u` comuni e precisamente, p osto x un’oggetto elementare con mo dalit`a numerica:

cumsum(x) : restituisce la somma cumulata degli elementi di x ;

length(x) : restituisce il numero degli elementi 3 contneuti in x ;

max(x) , min(oggetto) : p orgono, risp ettivamente, il massimo ed il minimo dei valori contenuti in x ;

mean(x) : calcola la media aritmetica dei valori contenuti in x ;

median(x) : calcola la mediana dei valori contenuti in x ;

prod(x) : restituisce il pro dotto degli elementi di x ;

quantile(x,alpha) : p orge il quantile di ordine alpha degli elementi di x ;

sum(x) : restituisce la somma degli elementi di x ;

summary(x) : visualizza 4 il minimo, il primo quartile, la media aritmetica, la mediana, il terzo quartile ed il massimo degli elementi di x ;

table(x) : p orge la distribuzione di frequenze assolute generata dalle osserva- zioni individuali registrate in x ;

var(x) e sd(x) : calcolano, risp ettivamente, la varianza e lo scarto quadratico

`

medio dei valori contenuti in x . E b ene ricordare, sin da ora, che la varianza, e

di conseguenza lo scarto quadratico medio, `e calcolata come:

1

n 1

n

i=1

(x i µ x ) 2

3 A b ene vedere trattasi di una funzione “primitiva” di impiego assai generale. 4 Tale `e il suo comp ortamento se applicata ad un oggetto numerico elemementare.

13

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

quindi con un numero di gradi di lib ert`a pari a length(x)-1 . Tale grandezza viene abitualmente detta varianza campionaria.

weighted.mean(xi,ni) : calcola la media aritmetica dei valori contenuti in xi con p esi ni .

Esempio 1.2.19 Si immagini che la rilevazione il voto conseguito all’esame di Statistica, espresso in trentesimi, conseguito da un grupp o di 20 studenti abbia fornito i risultati:

18

23

30

25

27

27

30

20

20

25

27

25

27

23

30

25

23

20

25

23

Definito l’oggetto elementare voti.stat :

> voti.stat<-c(18,23,30,25,27,27,30,20,20,25,27,25,27,23,30,25,23,20,25,23)

facilmente p ossiamo ottenere:

— la distribuzione dei voti in termini di frequenze assolute:

> table(voti.stat)

voti.stat 18 20 23 25 27 30

1

3

4

5

4

3

nonch´e relative:

> table(voti.stat)/length(voti.stat)

voti.stat

25

0.05 0.15 0.20 0.25 0.20 0.15

18

20

23

27

30

Si osservi che, dal momento che table(voti.stat) restituisce un oggetto numerico, la media dei voti p otrebb e essere calcolata ricorrendo all’istruzione:

> weighted.mean(sort(unique(voti.stat)),table(voti.stat)/20)

[1] 24.65

— alcune misure di tendenza centrale:

% > summary(voti.stat)

%

Min. 1st Qu.

Median

Mean 3rd Qu.

Max.

%

18.00

23.00

25.00

24.65

27.00

30.00

Visto che summary(voti.stat) restituisce un oggetto comp osto da sei elementi, p os- siamo ottenere la dierenza interquartilica come:

14

E. D. Isaia, Linguaggio R e applicazioni statistiche

> summary(voti.stat)[5]-summary(voti.stat)[2]+.

— la varianza campionaria nonch´e la devianza:

> var(voti.stat)

[1] 12.02895

> var(voti.stat)*(length(voti.stat)-1)

[1] 228.55

1.2.6 Alcune funzioni di utilit`a generale

Dedichiamo questo paragrafo alla presentazione di alcune funzioni, oltre a quelle gi`a citate, a cui sp esso pu`o essere fatto ricorso durante una sessione di lavoro.

abbreviate(oggetto, mln=, dot=FALSE) : abbrevia gli elementi dell’oggetto sp ecificato al una lunghezza minima pari a mln= . Ponendo dot=TRUE viene visualizzato il su sso “.”. Ad esempio:

> x<-c("Ennio","Davide","Isaia")

> abbreviate(x[1:2], minl=1) Ennio Davide

"E"

"D"

> abbreviate(x[1:2], minl=1,dot=TRUE) Ennio Davide

"E."

"D."

all(oggetto) consente di confrontare tutti gli elementi di un oggetto risp etto ad una condizione. Ad esempio:

> x<-c(-2.2,-1.8,-1.5,-1.4,-1.2,-1.0,-0.9,-0.8,-0.7 ,0.2)

> all(x>0)

[1] FALSE

Il suo complemento `e la funzione any(oggetto) .

> x<-c(-2.2,-1.8,-1.5,-1.4,-1.2,-1.0,-0.9,-0.8,-0.7 ,0.2)

> any(x>0)

[1] TRUE

15

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

all.names(expression) e all.vars(expression) p orgono, risp ettivamente, gli elementi e le variabili che compaiono nell’espressione indicata e definita via expression() o quote() .

append(oggetto, valori, after=posizione) : aggiunge gli elementi conte- nuti in valori all’oggetto sp ecificato, eventualmente nella p osizione desiderata. Ad esempio:

> x<-integer(0)

> (x<-append(x,1:10))

[1]

1

2

3

4

5

6

7

8

9 10

>

(x<-append(x,120,after=2))

 

[1]

1

2 120

 

3

4

5

6

7

8

9

10

Si osservi che la situazione di default prevede after=length(x) .

Tale comando pu`o tornare utile qualora si desideri inserire in un oggetto gli elementi via, via generati da sp ecifiche funzioni.

attr(oggetto,attributo): attribuisce all’oggetto indicato un particolare “at- tributo”. Ad esempio:

> x<-c(1:10)

> attr(x,"dim")<-c(2, 5)

> x

[,1] [,2] [,3] [,4] [,5]

[1,]

1

3

5

7

9

[2,]

2

4

6

8

10

> attr(x,"dim")<-NULL

 

> x

[1]

1

2

3

4

5

6

7

8

9 10

cat() : acronimo di “concatenate & print” trasforma gli elementi indicati quale argomento in strighe alfanumeriche e li visualizza. Il su sso "\n" consente al cursore di ritornare in mo dalit`a “prompt” (> ). Ad esempio:

> x<-c(1,2,3)

> a<-c("degli elementi di x")

> cat("La media ",a," e’:",sum(x)/length(x),"\n")

La media degli elementi di x

>

e’: 2

16

E. D. Isaia, Linguaggio R e applicazioni statistiche

date() : restituisce, sottoforma alfanumerica, la data di sistema.

> date()

[1] "Tue Aug 28 05:16:51 2001"

deparse(oggetto) : trasforma la definizione dell’oggetto sp ecificiato in una stringa. Cos`ı, ad esempio:

> a<-letters[1:3]

> deparse(a)

[1] "c(\"a\", \"b\", \"c\")"

diff(oggetto,lag=) : calcola le dierenze tra i diversi elementi di un oggetto. Ad esempio:

> diff(c(10,23,21,30),1)

[1] 13 -2

9

duplicated(oggetto) : indica, in forma logica, quali elementi dell’oggetto sp e- cificato quale argomento sono rip etuti. Ad esempio:

> x<-c(1:4)

> y<-c(2:6)

> duplicated(c(paste(x),paste(rev(y))))

[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE

eval(funzione) : calcola il valore la funzione sp ecificata in corrisp ondenza a determinati valori di interesse. Quali esempi, valgano le seguenti istruzioni:

> eval(3 ^ 2 ^ 3)

[1] 6561

> eval(sin(.25*pi)+cos(.25*pi))

[1] 1.414214

> sin(.25*x)+cos(2*.25*x)

Error: Object "x" not found

> x<-pi/2

> sin(.25*x)+cos(2*.25*x)

[1] 1.089790

17

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

Si vedano anche i comp ortamenti delle funzioni expression() e quote() .

expand.grid(x,y,z,

)

: crea un “data frame” (cfr. paragrafo 1.4.2) con-

tenente tutte le combinazioni degli elementi dei vettori (o fattori) x , y , z , sp ecificati. Ad esempio:

> expand.grid(temperatura=seq(100,120,10),pressione=seq(1,2,1))

temperatura pressione

1 100

1

2 110

1

3 120

1

4 100

2

5

110

2

6

120

2

expression(funzione) : restituisce l’espressione di una funzione senza provve- dere al calcolo automatico. Si ossservi il comp ortamento delle istruzioni:

> (fx<-expression(x^2+2*x))

expression(x^2 + 2 * x)

> eval(fx)

Error in eval(expr, envir, enclos) : Object "x" not found

> x<-seq(-1,1)

> eval(fx)

[1] -1

0

3

> all.names(expression(sin(x+y)))

[1] "sin" "+"

"x"

"y"

> all.vars(expression(sin(x+y))) [1] "x" "y"

Si veda anche il comp ortamento della funzione quote() .

factor(oggetto,levels=(n1,

,nn)):

definisce in mo do diretto l’oggetto

sp ecificato quale fattore a n livelli. Un’alternativa `e il ricorso a as.factor(oggetto) . Sono, p ertanto, comandi validi:

> (temperatura<-factor(c(1,1,1,2,2,2),levels=c(1:2)))

[1]

1

1

1

2 2 2 1 2

Levels:

> trattamento<-c("A","B","B","A","B","A","C","C","C")

18

E. D. Isaia, Linguaggio R e applicazioni statistiche

> (trattamento<-as.factor(trattamento))

[1] A B B A B

Levels:

A B C

A C C C

format(oggetto,

: attribuisce all’oggetto sp ecificato un formato p er una

migliore visualizzazione dei suoi elementi. Per default il comando prevede l’al- lineamento a destra, justify="right" , e un numero di decimali pari a quanto definito (cfr. paragrafo 1.9) in getOption("digits") . A commento:

)

> (x<-c(2,15,21,25)/3)

[1] 0.6666667 5.0000000 7.0000000 8.3333333

> format(x,digits=3)

[1] "0.667" "5.000" "7.000" "8.333"

> format(x^3,digits=3,justify="right")

[1] " 0.296" "125.000" "343.000" "578.704"

> alpha<-c("Valor medio","Mediana","Varianza")

> format(alpha,justify="left") [1] "Valor medio" "Mediana

> format(alpha,justify="right")

" "Varianza

"

[1] "Valor medio" "

Mediana" "

Varianza"

> format(alpha,justify="none")

[1] "Valor medio" "Mediana"

"Varianza"

formula("espressione") : consente di definire un nuovo oggetto con struttura tip o formula il cui impiego `e principalmente riservato alle pro cedure di regres- sione (lm ) e di analisi della varianza (aov ). La trasformazione della struttura di un’opp ortuna stringa in formula avviene con il comando as.formula(striga) . Alcuni esempi sono:

>

(formulayx<-formula("y~x"))

y

~ x

>

nomi.x<-paste("x",c(1:4),sep="")

>

(f<-as.formula(paste("y ~ ", paste(nomi.x, collapse= "+"))))

y

~ x1 + x2 + x3 + x4

gl(n,k) : genera in mo do automatico una sequenza di interi p ositivi da 1 a n , ciascuno dei quali viene rip etuto k volte 5 . Il risultato ha struttura factor . Ad esempio:

5 Si noti che length(gl(n,k))=n*k.

19

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

> (temperatura<-gl(2,3))

2 2 2 1 2

Levels:

[1]

1

1

1

L’opzione labels = , che p er default viene p osta uguale a 1:n , consente di attri- buire, a discrezione dell’utente, etichette ai diversi livelli del fattore di interesse; ad esempio:

> (temperatura<-gl(2,3,labels=c(120,160)))

[1] 120 120 120 160 160 160 Levels: 120 160

> (sesso<-gl(2,3,labels=c("Maschio","Femmina")))

[1] Maschio Maschio Maschio Femmina Femmina Femmina

Levels: Maschio Femmina

levels(fattore) : indica quali sono i livelli del fattore sp ecificato. Infatti:

> temperatura<-gl(2,3,labels=c(120,160))

> sesso<-gl(2,3,labels=c("Maschio","Femmina"))

> levels(temperatura) [1] "120" "160"

> levels(sesso)

[1] "Maschio" "Femmina"

match(x,y,nomatch=NA) : confronta i due oggetti x e y e restituisce l’elenco degli elementi della loro intersezione. Gli elementi diversi sono, p er default, definiti mancanti (NA ). Ad esempio:

> x<-c(1:10)

> y<-c(7:20)

> match(x,y) [1] NA NA NA NA NA NA

1

2

3

4

mentre:

 

>

y[match(x,y,nomatch=0)]

 

[1]

7

8

9 10

 

20

E. D. Isaia, Linguaggio R e applicazioni statistiche

names(oggetto) : trattasi di un comando assai generale che, essenzialmente, consente di attribuire etichette ai diversi elementi di un oggetto. A tal prop osito, si immagini che x contenga 5 elementi numerici di cui tre a valori 0 e due a valore 1 e che si desideri attribuire l’etichetta Maschio qualora x=0 e Femmina altrimenti; le istruzioni necessarie sono:

> (x<-sort(c(0,1,0,1,1)))

1

> (names(x)<-c(rep("Maschio",3),rep("Femmina",2)))

[1] 0 0 1

1

[1] "Maschio" "Maschio" "Maschio" "Femmina" "Femmina"

L’eliminazione delle etichette attribuite ad un’oggetto avviene con il comando names(oggetto)<-NULL .

Si osservi che il semplice comando names(oggetto) consente di visualizzare le etichette asso ciate all’oggetto sp ecificato e, come vedremo nel seguito (cfr. paragrafi 1.4.1 e 1.4.2), qualora l’oggetto fosse una “lista” o un “data frame” ne elencherebb e i nomi degli elementi.

nchar(oggetto) : restituisce il numero di caratteri di ciascun elemento alfanu- merico contenuto nell’oggetto sp ecificato. Cos`ı:

> a<-c("sommatoria","produttoria")

> nchar(a) [1] 10 11

> sum(nchar(a)) [1] 21

noquote(oggetto) : visualizza gli elementi dell’oggetto alfanumerico sp ecificato senza racchiuderli entro le consuete virgolette.

> noquote(c(letters[1:4],rev(letters[1:4])))

[1] a b c

d d c b

a

ppoints(n) : genera una sequenza di n numeri in accordo a (1:n-.5)/n . Quale argomento `e p ossibile indicare un oggetto numerico.

> ppoints(6)

[1] 0.10 0.26 0.42 0.58 0.74 0.90

21

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

Tale funzione torna utile, ad esempio, p er individuare i quantili di una distri- buzione.

pretty(oggetto,n=) : restituisce una sequenza di n numeri tali da suddividere

il range dell’oggetto sp ecificato in altrettanti intervalli di egual ampiezza. A commento:

> x<-c(10,10.5,11,12,13,13.5,16.5,17,18,20)

> pretty(x,n=2)

[1] 10

15

>

pretty(x)

[1] 10

12

20

14

16

18

quote(oggetto) : restituisce l’espressione di una funzione senza provvedere al calcolo automatico. Si ossservi il comp ortamento delle istruzioni:

> (f<-quote((2*pi)^(-.5)*exp(-.5*x^2)))

(2 * pi)^(-0.5) * exp(-0.5 * x^2)

> x<-c(-1,0,1)

> eval(f)

[1] 0.2419707 0.3989423 0.2419707

replace(oggetto,posizione,valori) : rimpiazza gli elementi dell’oggetto sp e- cificato nella p osizione indicata con i valori elencati o con gli elementi di un secondo oggetto. Ad esempio:

> x<-seq(1:10)

> y<-c(100,120)

> replace(x,2:3,y)

[1]

1 100 120

4

5

6

7

8

9

10

round(oggetto,decimali): trasforma gli elementi dell’oggetto ad elementi nu- merici indicato in numeri con tante cifre decimali quante sp ecificate in decimali :

> round(seq(1:10)/seq(1,2,length=10),2)

[1] 1.00 1.80 2.45 3.00 3.46 3.86 4.20 4.50 4.76 5.00

sequence(n1:nmax) : crea delle sequenze di numeri interi del tip o:

n 1 , n 1 , n 2 , n 1 , n 2 , n 3 ,

A tal prop osito:

, n 1 , n 2 ,

22

, n max

E. D. Isaia, Linguaggio R e applicazioni statistiche

> sequence(1:5)

[1] 1

1 2

1 2

3

1 2

3 4

1 2

3 4 5

> sequence(5:1)

 

[1] 1

2 3

4 5

1 2

3

4 1

2 3

1 2

1

sign(oggetto) : rico difica in -1, 0 e 1 gli elementi numerici dell’oggetto sp eci- ficato a seconda che essi siano, risp ettivamente, negativi, nulli o p ositivi.

> (x<-c(seq(-3,2)))

[1] -3 -2 -1

0

1

2

>

sign(x)

[1] -1 -1 -1

0

1

1

> sign(abs(x))

[1]

1

1

1

0 1

1

substr(oggetto,start,stop) : trasforma gli elementi dell’oggetto alfanumeri- co indicato in strighe con un mumero di caratteri compresi tra start e stop ; ad esempio:

> (x<-c("Varianza","Devianza")) [1] "Varianza" "Devianza"

> substr(x,1,3)

[1] "Var" "Dev"

> rev(substr(x, 1,3)) [1] "Dev" "Var"

Per completezza, rip ortiamo i seguenti tre comandi di utilit`a:

apropos(what,mode="any") : p orge un elenco di tutti gli oggetti i cui nomi contengono quanto sp ecificato in what e ci`o, p er default, indip endentemente dalla loro mo dalit`a (mode="any" ):

> apropos(integrate) [1] "integrate"

"print.integrate"

Si badi che digitando apropos(".") si otterrebb e l’elenco completo di tutti gli oggetti predefiniti in R, che sono b en 1456 (length(apropos(".")) ); di questi quelli che p oseggono mo dalit`a di tip o "function" risultano essere 1453 (length(apropos(".",mode="function")) ).

23

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

exists("oggetto",mode="any") : controlla l’esistenza dell’oggetto sp ecificato, indip endentemente dalla sua mo dalit`a; il risultato `e di tip o logico:

> exists("integrate") [1] TRUE

> exists("f")

[1] FALSE

> f<-expression(x+2*x^2)

> exists("f",mode="function") [1] TRUE

find(what,mode="any") : rip orta il nome della librebria in cui si trova l’oggetto indicati in what :

> find(cor)

[1] "package:base"

> find(cor.test)

[1] "package:ctest"

1.3 Vettori e Matrici

Appare del tutto naturale, ora, dedicare la nostra attenzione alla creazione e la ma- nip olazione di oggetti che hanno struttura di vettore o di matrice e ci`o secondo la

comune accezione dell’algebra lineare.

`

E comunque b ene tenere a mente che abitualmente nel linguaggio informatico una qualsiasi stringa di caratteri (numerici o alfanumerici) viene detta vettore. Tutti gli oggetti definiti in R sono dunque vettori, a meno che non abbiano struttura di matrice (cfr. paragrafo 1.5).

I

principali comandi, nella forma pi u` semplice, che utilizzeremo nel seguito p er definire

e

manip olare matrici algebriche sono:

array(oggetto,dim=c(nrow,ncol)) : trasforma l’oggetto indicato in una ma- trice di ordine nrow × ncol (cfr. Osservazione 1.3.1);

cbind(oggetto) : trasforma l’oggetto indicato in un vettore colonna;

matrix(oggetto,nrow=,ncol=): trasforma l’oggetto indicato in una matrice di ordine nrow × ncol ;

rbind(oggetto) : trasforma l’oggetto indicato in un vettore riga;

24

E. D. Isaia, Linguaggio R e applicazioni statistiche

Per como dit`a di esp osizione, a fine paragrafo, riassumiamo in mo do ordinato le principali funzioni predefinite che op erano su oggetti con struttura, appunto, di matrice.

Esempio 1.3.1 Creazione e visualizzazione del vettore riga x e del vettore colonna y che conterranno, entrambi, i primi quattro interi p ositivi:

> (x<-rbind(c(1:4)))

[,1] [,2] [,3] [,4]

[1,]

1

2

3

4

> (y<-cbind(c(1:4)))

 

[,1]

[1,]

1

[2,]

2

[3,]

3

[4,]

4

Un’alternativa p otrebb e essere la seguente:

> x<-matrix(c(1:4),nrow=1,ncol=4)

> y<-matrix(c(1:4),nrow=4,ncol=1)

I precedenti comandi che definiscono le matrici x e y p otrebb ero essere scritti in forma com- patta, omettendo cio`e gli identificativi nrow= e ncol= , ricordando che il numero delle righe dve precedere quello delle colonne; in sostanza avremmo p otuto impartire i comandi:

> x<-matrix(c(1:4),1,4)

> y<-matrix(c(1:4),4,1)

Nel seguito tuttavia, p er motivi di chiarezza esp ositiva, ricorreremo sempre alla forma estesa

del comando.

Esempio 1.3.2 Creazione della matrice X le cui righe corrisp ondono ai vettori x e y sudefiniti:

> (X<-rbind(x,t(y)))

[,1] [,2] [,3] [,4]

[1,]

1

2

3

4

[2,]

1

2

3

4

Si osservi che il comando t(y) p orge la trasp osta del vettore (colonna) y , infatti:

> t(y)

[,1] [,2] [,3] [,4]

[1,]

1

2

3

4

25

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

Esempio 1.3.3 Creazione dell’oggetto z , contenente gli elementi del vettore x = 1 2 3 .

`

E

suciente ricorrere all’istruzione drop() , infatti:

>

(x<-rbind(c(1:3)))

[,1] [,2] [,3]

[1,]

1

2

3

> z<-drop(x)

> z [1] 1 2 3

Esempio 1.3.4 Creazione e visualizzazione della matrice X le cui quattro colonne contengono,

in progressione, gli interi da 1 a 12:

> (X<-matrix(c(1:12),nrow=3,ncol=4))

[,1] [,2] [,3] [,4]

[1,]

1

4

7

10

[2,]

2

5

8

11

[3,]

3

6

9

12

Un’alternativa p otrebb e essere la seguente:

> X<-c(1:12)

> dim(X)<-c(3,4)

oppure:

> Y<-array(c(1:12),dim=c(3,4))

Osservazione 1.3.1 Il comando array() `e assai versatile; con esso, ad esempio si p ossono creare matrici, p er cos`ı dire, “a pi u` dimensioni”. A tal prop osito si immagini di volere creare due matrici, di ordine 3 × 3 ciascuna e contenenti gli interi da 1 a 9 e da 10 a 18 risp ettivamente, da inserire in un’unico oggetto, Y con struttura di matrice. Ci`o pu`o avvenire tramite il comando:

> (Y<-array(c(1:18),dim=c(3,3,2))) ,

,

1

[,1] [,2] [,3]

[1,]

1

4

7

[2,]

2

5

8

[3,]

3

6

9

26

E. D. Isaia, Linguaggio R e applicazioni statistiche

,

,

2

[,1] [,2] [,3]

[1,]

10

13

16

[2,]

11

14

17

[3,]

12

15

18

16 [2,] 11 14 17 [3,] 12 15 18 Esempio 1.3.5 Data la matrice: 1 A

Esempio 1.3.5 Data la matrice:

1

A = 4 3 2

1

1

1

2

2


a ij . In R, gli elementi a ij della matrice A vengono in-

dividuati con la notazione A[i,j] , dove A `e una matrice definita mentre i e j sono gli in-

ci prop oniamo di calcolare 3

2 1 2

dici che ne identificano risp etttivamente le righe e le colonne, e quindi i=1,

,nrow(A)

e

j=1,

,ncol(A)

.

Il calcolo indicato p otrebb e essere risolto, p erlomeno in prima battuta , come:

 

> A<-matrix(c(1,4,1,2,3,2,1,2,1),nrow=3,ncol=3)

> A[2,1]+A[2,2]+A[3,1]+A[3,2]

[1] 10

A

tal prop osito, cfr. Esempio 1.3.14.

 

Esempio 1.3.6 Data la matrice:

A =

1

5

2 3

6

7

ne

estraiamo i due vettori riga e i tre vettori colonna.

In

R la notazione A[1,] e A[,1] indicano, risp ettivamente, gli oggetti costituiti dagli elementi

della prima riga e, risp ettivamente, della prima colonna di A. Ci`o premesso, p ossiamo p ensare

di risolvere il problema mediante le istruzioni:

> A<-matrix(c(1,5,2,6,3,7),nrow=2,ncol=3)

> riga1<-rbind(A[1,])

> riga2<-rbind(A[2,])

> col1<-cbind(A[,1])

> col2<-cbind(A[,2])

> col3<-cbind(A[,3])

infatti, ad esempio:

27

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

> riga1

[,1] [,2] [,3]

[1,]

>

col2

1

[1,]

[2,]

[,1]

2

6

2

3

Esempio 1.3.7 Posto che Y sia una matrice contenente, a sua volta, due matrici di ordine 3 × 3 ciascuna (cfr. Osservazione 1.3.1 ed Esempio 1.3.6), ci prop oniamo di estrarre da essa:

— le singole matrici:

> (Y[,,1])

[,1] [,2] [,3]

[1,]

1

4

7

[2,]

2

5

8

[3,]

3

6

9

> (Y[,,2])

 

[,1] [,2] [,3]

[1,]

10

13

16

[2,]

11

14

17

[3,]

12

15

18

— il vettore corrisp ondente alla prima riga della prima matrice ed il vettore corrisp ondente alla prima colonna della seconda matrice:

> (rbind(Y[1,,1]))

[,1] [,2] [,3]

[1,]

1

4

7

> (cbind(Y[,1,2]))

[1,]

[2,]

[3,]

[,1]

10

11

12

Esempio 1.3.8 Costruzione della matrice A di ordine 4 × 4 con elementi nulli tranne sulla

diagonale principale ove compaiono, in successione, i primi quattro interi. In sostanza dovr`a

essere a ij = 0 p er i = j e a ij = i p er i = j

Desiderando pro cedere, p ossiamo p ensare di creare la matrice A ad elementi nulli e succesi- vamente rimpiazzare gli elementi della sua diagonale principale, cio`e quelli p er cui risulta 6 row(A) ==col(A) , con gli interi 1,2,3,4. In e etti:

e i = 1 , 2 , 3 , 4.

6 Si osservi il ricorso al simb olo ==; cfr. il paragrafo 1.6.

28

> A<-matrix(0,nrow=4,ncol=4)

> A[row(A) == col(A)]<-c(1:4)

> A

[,1] [,2] [,3] [,4]

[1,]

1

0

0

0

[2,]

0

2

0

0

[3,]

0

0

3

0

[4,]

0

0

0

4

E. D. Isaia, Linguaggio R e applicazioni statistiche

Un’alternativa ci `e o erta dal ricorso alla funzione diag() che p orge gli elementi della diago- nale principale della matrice indicata quale argomento; in tal caso

> A<-matrix(0,nrow=4,ncol=4)

> diag(A)<-c(1:4)

> A

[,1] [,2] [,3] [,4]

[1,]

1

0

0

0

[2,]

0

2

0

0

[3,]

0

0

3

0

[4,]

0

0

0

4

Desiderando, quindi, costruire una matrice identit`a di dimensione n × n saranno sucienti le istruzioni:

> X<-matrix(0,nrow=n,ncol=n)

> diag(X)<-c(1)

lasciandone al Lettore la verifica sul camp o.

Esempio 1.3.9 Data la matrice:

2 3

A = 4 1 5

1

1

6

7

definiamo due vettori riga, diciamo x e y , contenenti risp ettivamente gli elementi p osti alla sinistra e alla destra della diagonale principale di A. Se osserviamo che gli elementi a ij di A che giacciono a sinistra della diagonale sono quelli p er cui i > j , cio`e row(A)>col(A) , mentre quelli che stanno alla destra della stessa saranno quelli p er cui i < j , cio`e row(A)<col(A) , abbiamo:

> A<-matrix(c(1,4,6,2,1,7,3,5,1),nrow=3,ncol=3)

> x<-rbind(A[row(A) > col(A)])

> y<-rbind(A[row(A) < col(A)])

ed infatti:

29

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

> x

[,1] [,2] [,3]

[1,]

>

y

4

6

7

[,1] [,2] [,3]

[1,]

2

3

5

Esempio 1.3.10 Dati i vettori:

x

= 3

5

`e noto che:

x · y = 3 6

5

10

y = 1

2

x · y = 13 = x t · y t

In R impartiremo le istruzioni:

> x<-rbind(3,5)

> y<-cbind(1,2)

> x%*%y

[,1] [,2]

[1,]

[2,]

3

5

>

y%*%x

[,1]

[1,]

13

6

10

Il pro dotto tra vettori e/o matrici viene quindi intro dotto mediante l’op eratore %*% . Si noti che, co erentemente:

> t(x)%*%y

Error in x %*% t(y) : non-conformable arguments

Esempio 1.3.11 Ci prop oniamo di risolvere il sistema di equazioni:

2 x + y = 7

x + 2 y = 8

Riscritto il sistema in forma matriciale:

2

1

1

2

x =

y

7 8 A x = b x = A 1 b

in R impartiremo le istruzioni:

30

> A<-matrix(c(2,1,1,2),nrow=2,ncol=2)

> b<-cbind(c(7,8))

> x<-solve(A)%*%b

> x

[1,]

[2,]

[,1]

2

3

o equivalentemente:

> A<-matrix(c(2,1,1,2),nrow=2,ncol=2)

> b<-cbind(c(7,8))

> x<-solve(A,b)

> x

[1,]

[2,]

[,1]

2

3

E. D. Isaia, Linguaggio R e applicazioni statistiche

Esempio 1.3.12 Costruzione di matrice che contiene gli elementi di una semplice “tab ella pitagorica” p er gli interi da 1 a 4. Sono sucienti le istruzioni:

> x<-cbind(c(1:4))

> matrix(outer(x,x,"*"),4,4)

[,1] [,2] [,3] [,4]

[1,]

1

2

3

4

[2,]

2

4

6

8

[3,]

3

6

9

12

[4,]

4

8

12

16

Al Lettore l’interpretazione dell’output dell’istruzione matrix(outer(x,x,"^"),4,4).

Esempio 1.3.13 Calcolo delle somme di riga e di colonna della matrice:

A =

30 25 20 15

10 15 20 7 10 15

5

3

Definita la matrice:

> A<-matrix(c(30,5,3,25,10,7,20,15,10,15,20,15),nrow=3,ncol=4)

i totali di riga e di colonna p ossono essere ottenuti applicando a ciascuna riga e colonna l’op eratore sum() , cio`e impartendo le istruzioni:

31

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

> sum(A[1,]); sum(A[2,]); sum(A[3,])

> sum(A[,1]); sum(A[,2]); sum(A[,3]); sum(A[,4])

Un’alternativa consiste nel ricorso alla funzione 7 apply(.,.,.) i cui argomenti sono, nell’ordi- ne: la matrice su cui op erare, l’identificativo p er i vettori riga o colonna (1=righe, 2=colonne), nonch´e la funzione che si desidera applicare, nel caso in esame sum . Pertanto:

> apply(A, 1, sum) [1] 90 50 35

> apply(A, 2, sum) [1] 38 42 45 50

Proprio sulla funzione apply() `e basata la funzione margin.table(.,.), i cui argomenti sono la matrice di interesse e l’identificativo numerico p er i vettori riga o colonna, che p orge i totali desiderati; infatti:

> margin.table(A,1)

[1] 90 50 35

> margin.table(A,2)

[1] 38 42 45 50

`

Osservazione 1.3.2 E b ene ricordare che, data una matrice A r,s , cio`e di ordine r × s, ed

indicando con 1 α un generico vettore riga unitario di ordine α si ha:

r

i=1

a ij = 1 r A r,s

s

i=1

a ij = A r,s 1 t

s

r

s

i=1 j =1

a ij = 1 r A r,s 1 t

s

Cos`ı, ad esempio, nel caso della matrice A prop osta:

> A<-matrix(c(30,5,3,25,10,7,20,15,10,15,20,15),nrow=3,ncol=4)

> br<-rbind(c(rep(1,nrow(A))))

> bs<-rbind(c(rep(1,ncol(A))))

> tot.col<-br%*%A

> tot.riga<-A%*%t(bs)

> tot<-br%*%A%*%t(bs)

> tot.col [,1] [,2] [,3] [,4]

[1,]

38

42

> tot.riga

 

[,1]

[1,]

90

[2,]

50

[3,]

35

>

tot

 

[,1]

[1,]

175

45

50

7 Funzioni strettamente legate ad apply() sono tapply() (Esempio ?? ) e sapply() (Esempio ?? ).

32

E. D. Isaia, Linguaggio R e applicazioni statistiche

Si noti che i risultati richiesti risultano sottoforma di vettori.

che i risultati richiesti risultano sottoforma di vettori. Esempio 1.3.14 Data la matrice: 1 A =

Esempio 1.3.14 Data la matrice:

1

A = 4 3 2

1

1

1

2

2

calcoliamo 3 abbiamo:

2

2

1

a ij . Anzich´e op erare come illustrato all’Esempio 1.3.5, in mo do diretto

> sum(A[c(2:3),c(1:2)]) [1] 10

A conclusione del paragrafo, ci pare utile prop orre un semplice elenco delle principali funzioni predefinite che op erano su oggetti con struttura di matrice. Con riferimento ad una generica matrice Y si ha:

aperm(Y,k) : consente di eetturare una p ermutazione di Y risp etto all’argo- mento k . Evidentemente con aperm(Y) si ha la trasp osta di Y ;

det(Y) : calcola il determinante della matrice quadrata Y in accordo all’algoritmo QR (cfr. Esempio 1.6.7);

diag(Y) : p orge gli elementi della diagonale principale di Y ;

diag(k) : definisce una matrice identit`a di ordine (kxk);

eigen(Y) : fornisce in forma di “lista” (cfr. 1.4.1) gli autovalori e gli autovettori asso ciati alla matrice simmetrica Y ;

qr(Y) : pro cede alla decomp osizione di Y secondo l’algoritmo QR, cos`ı come sug- gerito da Dongarra et al. (1978); la matrice dei co ecienti della decomp osizione ed altre informazioni quali il rango di Y , sono memorizzati sottoforma di “lista” (cfr. 1.4.1);

solve(Y) : p orge la matrice inversa di Y ;

solve(Y,x) : risolve l’equazione indicata; la soluzione `e, dunque, x Y 1 ;

svd(Y) : pro cede alla decomp osizione di Y secondo l’algoritmo SVD, cos`ı come suggerito da Dongarra et al. (1978); i risultati sono presentati sottoforma di “lista”. Per una semplice applicazione cfr. Esempio 1.6.7;

33

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

t(Y) : p orge la trasp osta di Y ;

outer(x,y,funzione) : costrusice una nuova matrice i cui elementi risultano

essere [i,j]=funzione(x[i],y[i],

) questa deve

obbligatoriamente essere racchiusa entro virgolette, mentre ci`o non si applica se `e una funzione creata ad ho c dall’utente 8 . Per alcune semplici applicazioni, cfr. Esempio 1.3.12 e 2.1.11.

. Se la funzione che si desidera appli-

care `e una funzione predefinita ( ad esempio +, * , / , , sum ,

)

1.4 Oggetti complessi

Come si disse, in R `e p ossibile costruire oggetti a loro volte costituiti da altri oggetti elementari, non necessariamente della stessa mo dalit`a. Tali nuovi oggetti, che abbiamo definito complessi, sostanzialmente evitano il propa-

garsi di variabili (nomi, etichette,

lavoro in R. A seconda della loro natura, si distinguono in “liste” e “data frame”.

) e rendono quindi pi u` chiara una sessione di

1.4.1 Liste

Le “liste” vengono definite mediante l’istruzione:

nomelista<-list(label1=object1,label2=object2,

,labeln=objectn)

dove nomelista `e il nome della “lista” che si intende creare e gli argomenti di list sono oggetti elementari gi`a esistenti a cui si attribuisce un’etichetta (label ) che ser- vir`a successivamente a riconoscerli ed eventualmente estrarli ad uno ad uno. Ci`o avviene semplicemente digitando il nome della lista seguito da quello dell’oggetto che si desidera estrarre, preceduto, questo dal prefisso $ , ad esempio nomelista$label1 . I nomi che identificano gli elementi di una lista p osono essere visualizzati in qualsiasi momento ricorrendo al comando names(nomelista) .

Esempio 1.4.1 Creazione, a partire degli oggetti x<-seq(1:10) e a<-letters[1:5] , della lista mia.lista . Posto di attribuire all’oggetto elementare x l’etichetta dati e all’oggetto a l’etichetta stringa , il problema viene risolto ricorrendo all’istruzione:

> mia.lista<-list(dati=x,stringa=a)

La visualizzazione del contenuto di una lista avviene impartendo il comando mia.lista , il quale p orge:

8 Si noti che il comando outer(x,y,*) pu`o essere sosituito da x %o% y.

34

$dati

3

$stringa [1] "a" "b" "c" "d" "e"

[1]

1

2

4

5

6

7

8

9 10

E. D. Isaia, Linguaggio R e applicazioni statistiche

In altri termini, la lista mia.lista contiene due diversi oggetti elementari, ciascuno dei quali

identificabile dalla risp ettiva etichetta preceduta dal simb olo riservato $ .

Esempio 1.4.2 Visualizzazione degli elementi contenuti in mia.lista e successiva estrazione dell’oggetto $dati . Sono suficienti i comandi:

> names(mia.lista)

[1] "dati"

"stringa"

> mia.lista$dati

4

[1]

1

2

3

5

6

7

8

9 10

`

E

app ena il caso di osservare che con nuova.x<-mia.lista$dati si crea un nuovo oggetto

che conterr`a, appunto, gli elementi di $dati .

Esempio 1.4.3 Si immagini che l’oggetto ms.AB , con struttura di matrice, rappresenti la distribuzione congiunta dei caratteri colore degli o cchi e colore dei cap elli di 290 individui di sesso maschile:

> ms.AB<-array(c(32,38,10,3,11,50,10,30,10,25,7,3,15,7,8,31),dim=c(4,4))

> ms.AB [,1] [,2] [,3] [,4]

[1,]

32

11

10

15

[2,]

38

50

25

7

[3,]

10

10

7

8

[4,]

3

30

3

31

Desiderando attribuire alle mo dalit`a di ciascuna mutabile statistica (m.s.) le appropriate etichette, p ossiamo ricorrere ai comandi dimnames() e list() nel mo do seguente:

> dimnames(ms.AB)<-list(Capelli=c("Neri","Castani","Rossi","Biondi"), Occhi = c("Neri","Castani","Verdi","Azzurri"))

ottenendo, co erentemente:

> ms.AB

Occhi

Capelli

Neri Castani Verdi Azzurri

Neri

32

11

10

15

Castani

38

50

25

7

Rossi

10

10

7

8

Biondi

3

30

3

31

35

Dipartimento di Statistica e Matematica “Diego de Castro”, nota tecnica 2, 2OO1

Osservazione 1.4.1 Molte pro cedure di analisi, oltre alla visualizzazione di un out-

put standard, prevedono la creazione automatica di liste contenenti risultati intermedi

che p ossono essere riacquisiti p er successive elab orazioni.

`

E

buona norma, inoltre, do cumentare, in fase di programmazione, le eventuali liste

create come sottopro dotto dalle funzioni via, via implementate.

come sottopro dotto dalle funzioni via, via implementate. 1.4.2 Data frame Analogamente alle liste, i “data

1.4.2 Data frame

Analogamente alle liste, i “data frame” vengono definiti mediante l’istruzione:

nomedf<-data.frame(label1=object1,label2=object2,

,labeln=objectn)

dove manifestamente nomedf `e il nome del data frame che si intende creare metre gli argomenti di data.frame sono oggetti elementari gi`a esistenti e di egual cardinalit`a

a cui `e p ossibile attribuire un’etichetta (label ) che consente di riconoscerli in mo do

pi u` sp edito. Bench´e i data frame cos`ı creati abbiano struttura list , si dierenziano

dalle “liste” p er come vengono estratti e gestiti i singoli comp onenti.

Definito un data frame, anch´e i suoi elementi siano disp onibili 9 , o ccorre impartire

il comando attach(nomedf) , in seguito al quale i singoli comp onenti si comp ortano

quali comuni variabili. Il comando detach(nomedf) scarica il data frame dall’area di lavoro. Ricordiamo, infine, che i nomi che identificano gli elementi di una data frame p osono essere visualizzati in qualsiasi istante ricorrendo al comando names(nomedf) .

Esempio 1.4.4 Creazione del data frame mydata contenente, in forma compatta, due varia- bili di interesse p er successive elab orazioni:

> rm(list=ls())

> sex<-c("M","M","M","F","M","F","M","M","F","M","F")

> age<-c(21,23,24,21,23,24,25,26,24,25,21)

> mydata<-data.frame(sesso=sex,eta=age)

> rm(sex, age)

> mydata sesso eta

1 M

21

2 M

23

3 M

24

4 F

21

5 M

23

6 F

24

9 Alcune funzioni, quali ad esempio lm() e +aov(), fanno tuttavia eccezione.

36

E. D. Isaia, Linguaggio R e applicazioni statistiche

7 M

25

8 M

26

9 F

24

10 M

25

11 F

21

> ls() [1] "mydata"

> names(mydata) [1] "sesso" "eta"

> str(mydata)

‘data.frame’: 11 obs. of 2 variables:

$ sesso: Factor w/ 2 levels "F","M": 2 2 2 1 2 1 2 2 1 2

$ eta

: num

21 23 24 21 23 24 25 26 24 25

> mode(mydata)

[1] "list"

Si noti che l’area di lavoro contiene il solo oggetto mydata