Sei sulla pagina 1di 222

Universit` a 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;
Sar` o grato a tutti coloro, e specialmente agli Studenti, che vorranno se-
gnalarci qualunque problema, dai pi` u banali errori tipograci alle oscurit` a
nellesposizione.
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, lutilizzazione di parti di que-
sta pubblicazione in altra opera allinderogabile 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 lutilizzazione di parti a queste
stesse condizioni. Luso di questa pubblicazione in qualsiasi forma comporta
laccettazione 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 20002009
Capitolo 1
Introduzione ad R
R, parente di S-Plus ed erede di S, `e un ambiente integrato che consente di elaborare
dati, eseguire calcoli e creare rappresentazioni grache; dotato di un linguaggio di
programmazione ad alto livello, con esso `e possibile eseguire operazioni assai complesse
con poche linee di comandi e, pertanto, si dimostra uno strumento estremamente
potente che permette di analizzare e risolvere problemi specici attinenti a diversi
settori scientici.
Le sue caratteristiche peculiari, ai ni statistici, sono rappresentate dalla possibilit`a
di elaborazione di grandi quantit`a di dati, la vasta disponibilit`a di operatori per il
calcolo matriciale e vettoriale nonche lenorme disponibilit`a di librerie (package)
matematiche, statistiche e grache.
R, inoltre, `e un software completamente gratuito e continuamente aggiornato, dispo-
nibile per piattaforme Unix (FreeBSD, NetBSD, Linux, Irix, Solaris, OSF/1, AIX,
HPUX), Windows 9x/NT nonche MacOS. La URL uciale per il progetto R `e:
http://www.r-project.org
dove `e possibile prelevare lultima versione di R, un manuale uciale di riferimento a
cura del R Core Team (2000) nonche una vasta gamma di packages aggiuntivi; unin-
teressante lista di Frequently Asked Questions, The R FAQ a cura di Kurt Hornik,
`e reperibile allindirizzo http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html.
Una volta acquisito il programma e prescindendo dallinstallazione/compilazione a
seconda della piattaforma di destinazione, lapplicativo ed altri le, tra cui .Renviron
saranno raccolti in ununica directory, ad esempio <drive>\...\R Home Directory,
la quale, a sua volta, conterr`a altre directory, tra le quali:
\library: contenente le librerie (package) di base nonche quelle di interesse
per lutente, ad esempio:
\library\base
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
\library\ctest
...
\library\modreg
nelle quali sono posti i le, in formato ACII, CONTENTS, DESCRIPTION, INDEX
e TITLE; inoltre, ciascuna di esse ha una struttura comune, articolata in altre
directory tra cui citiamo:
\R: contenente il le sorgente, in formato ACII, delle funzioni denite per
il package stesso;
\data: contenente alcuni archivi di dati a cui viene spesso fatto riferimento
nelle nestre di help di R stesso.
\help: contenente, in formato compresso (.zip, .tar, ...) i le di help in
linea;
\html, \latex: ove sono posti i le di help in formato html e L
A
T
E
X.
\doc: contenente, organizzati in corrispondenti sotto-directory, alcuni docu-
menti di aiuto.
A tal proposito `e bene tenere a mente che essenziale ai ni di un corretto funzionamen-
to dellapplicativo `e la presenza del package base, contenente in \library\base\R il
le di denizione dei principali comandi (base), nonche il le Rprofile di denizione
dellambiente di lavoro.
1.1 Lambiente di lavoro
Una volta lanciato il programma compare la nestra R GUI
1
, dove potranno essere
impartiti i comandi e saranno visualizzati i risultati delle elaborazioni o gli eventuali
messaggi di errore; tale nestra dispone di menu (File, Edit, Misc, Windows, Help)
autoesplicativi.
Nel seguito lavoreremo unicamente attreverso la nestra R GUI, cio`e impartiremo,
dopo il classico prompt >, i comandi in sequenza oppure li sottoporremo in modalit`a
batch.
Allavvio R GUI mostra alcune informazioni, quali la versione di R che si sta usando
ed alcuni comandi chiave per 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 nestra che contiene una breve guida in linea dal titolo
1
Sotto Unix compare la nestra R Console, il cui aspetto `e piuttosto spartanto. Sotto MacOS e
Linux-ppc comapre la enstra R Console, delt tutto analoga alla nestra R GUI che caratterizza i
sistemi Windows9x/NT e Linux.
2
E. D. Isaia, Linguaggio R e applicazioni statistiche
R Information. Tale nestra ore una descrizione dettagliata del comando e, pi` u
importante, riporta in fondo una serie di esempi che, mediante copia e incolla,
possono essere inseriti sulla Console.
Un secondo comando utile per avvicinarsi ad R `e demo(), il quale, a seconda della
versione installata, potrebbe porgere:
> 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 proposti; ad esempio demo(graphics).
Una terza nestra disponibile `e la Graphics Window ove verranno visualizzati, ap-
punto, i graci via via richiesti. Questa abitualmente non viene aperta allavvio
di R, ma viene attivata allorche si impartisce un comando che prevede un out-
put graco. Lutente 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 rispettivamente.
`
E bene tenere a mente che per default larea di lavoro corrisponde alla directory
\R Home Directory; tale situazione pu`o essere modicata in qualsiasi istante rico-
rendo al comando setwd(<directory>). Cos`, ad esempio, immaginando uninstal-
lazione su piattaforma Windows, potremmo 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, lintero workspace verr`a registrato, per default, sul le Rdata;
in tal modo sar`a possibile 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 identicati tramite
un nome, a discrezione dellutente, che deve iniziare con un carattere alfabetico e non
pu`o contenere spazi bianchi n`e i caratteri @, #, $, _, mentre `e ammesso luso del punto
(.) quale separatore tra i caratteri.
Se gli elementi di un oggetto presentano tutti la stessa modalit`a, numerica, alfanume-
rica, logica oppure complessa, loggetto stesso viene detto elementare. Tali oggetti, a
loro volta, possono essere dotati di una struttura di matrice, e ci`o nel senso algebrico
del termine, oppure possono concorrere a creare quelli che nel seguito chiameremo
oggetti complessi.
Ci`o premesso, dedichiamo i paragra che seguono alla descrizione di come denire e
manipolare oggetti con struttura elementare, di matrice o complessa ed eseguire su
di essi alcune semplici operazioni, ricorrendo a funzioni predenite ovvero creadone
altre ad hoc.
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 simbolo =, a cui segue, in linea di massima, entro parentesi tonde precedute dal
presso c, acronimo di combine, lelenco dei suoi elementi, ciasuno dei quali separato
da una virgola. Qualora loggetto possedesse modalit`a alfanumerica, il suoi elementi
debbono essere racchiusi entro virgolette (").
Ci`o premesso, la visualizzazione degli elementi di un oggetto pu`o avvenire digitandone
il nome oppure, in fase di denizione, racchiudendone listruzione entro parentesi
tonde.
Esempio 1.2.1 Ci proponiamo 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 corrispondono 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, possiamo introdurre le seguenti istruzioni di utilit`a assai generale:


ls(): visualizza lelenco degli oggetti deniti in una sessione di lavoro
2
.
ls.str(): porge un breveresoconto circa la struttura degli oggetti deniti
nella corrente sessione di lavoro. Informazioni dettagliate circa uno specico
oggetto, si ottengono con il comando str(oggetto);
mode(oggetto): restituisce, sottoforma di stringa, la modalit`a delloggetto
indicato;
rm(oggetto1, ...,oggetton): consente la rimozione degli oggetti specicati.
Desiderando rimuovere tutti gli oggetti deniti nel corso di una sessione di lavoro
si pu`o ricorrere allistruzione rm(list=ls()). La rimozione del solo contenuto
di un oggetto avviene tramite lassegnazione oggetto<-NULL
Esempio 1.2.2 Con riferimento ai tre oggetti introdotti allEsempio 1.2.1, si osservi il com-
portamento, autoesplicativo, delle istruzioni:
> ls.str()
alpha : chr [1:3] "Valor medio" "Mediana" "Varianza"
x : num 17
y : num [1:4] 10 13 17 20
> mode(alpha)
[1] "character"
> (y<-NULL)
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" "y"
> rm(x)
> ls()
[1] "alpha" "y"
> rm(y,alpha)
> ls()
character(0)

Pu`o a volte capitare di volere elencare (o rimuovere) solo alcuni degli oggetti deniti
durante una sessione di lavoro; ci`o avviene ricorrendo allopzione pattern=, propria
dei comandi ls(), rm() e ls.str(). A tal riguardo, si osservi il comportamento 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" "fattoreB"
> ls.str(pattern="fat")
fattoreA : num [1:4] 1 2 1 2
fattoreB : num [1:4] 1 2 1 2
> rm(list=ls(pattern="fat"))
> ls()
[1] "C02"
Lopzione pattern=, come la maggior parte delle opzioni R, pu`o essere abbreviata,
qualora non sussistano ambiguit`a, ai primi tre caratteri; nel seguito tuttavia, per
motivi di chiarezza espositiva, 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 n1 < n2, in ordine decrescente altrimenti;
seq(n1,n2,by=passo): crea una sequenza di numeri consecutivi da n1 a n2 con
incrementi pari a quanto specicato in passo, in ordine crescente se n1 < n2, in
6
E. D. Isaia, Linguaggio R e applicazioni statistiche
ordine decrescente altrimenti. Qualora lopzione by=passo fosse omessa e n1 e
n2 fossero interi, listruzione verrebbe ad essere equivalente a c(n1:n2). Unal-
ternativa a by= `e rappresentata dallopzione 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, speci-
cati in k ripetuti n volte;
letters[k:n] o LETTERS[k:n]: creano una sequenza di lettere, minuscole e
maiuscole rispettivamente, dellalfabeto latino comprese tra k ed n.
Altri comandi specici, quali gl(), expand.grid(), ppoints() e sequence(), ver-
ranno presentati al paragrafo 1.2.6.
Esempio 1.2.3 Creazione e visualizzazione delloggetto x che conterr`a i primi dieci interi
positivi:
> (x<-c(1:10))
[1] 1 2 3 4 5 6 7 8 9 10
Si noti che saremmo giunti allo stesso risultato ricorrendo allistruzione seq():
> (x<-seq(1,10))
[1] 1 2 3 4 5 6 7 8 9 10

Esempio 1.2.4 Creazione e visualizzazione delloggetto 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 pervenuti 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 delloggetto x che conterr`a, nellordine, 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" ripetute 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 delloggetto alfabeto che conterr`a le prime sette
lettere, in minuscolo, dellalfabeto (latino):
> (alfabeto<-letters[1:7])
[1] "a" "b" "c" "d" "e" "f" "g"
Si osservi il comportamento 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 Manipolazione di oggetti elementari


In R esistono svariati comandi che consentono la manipolazione di oggetti, numerici
o alfanumerici; tra essi val qui la pena citare i seguenti di utilit`a generale:
append(x,y): aggiunge agli elementi delloggeto 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; lopzione sep="simbolo" consen-
te di separare i diversi elementi con il simbolo desiderato, mentre lopzione
collapse="simbolo" permette di separare i singoli risultati con il simbolo
prescelto;
rev(x): posiziona 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 ripetuti contenuti in x.
x[posizione1,..,posizionen]: estrae dalloggeto x gli elementi che occupano
la posizione specicata 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 proposito di rev(), si noti che:
> rev(c(10,11,9))
[1] 9 11 10
e ci`o coerentemente con quanto detto a proposito.
Esempio 1.2.9 Creazione di un nuovo oggetto a partire da due oggetti deniti:
> 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, coerentemente:
> paste(x)
[1] "1" "2" "3" "4" "5"
Si noti, ancora, il comportamento 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 dalloggetto x, che contiene gli interi consecutivi da 1 a 20, degli
elementi che occupano la terza e la dodicesima posizione.
> x<-c(1:20)
> x[3]
[1] 3
> x[12]
[1] 12

Esempio 1.2.12 Creazione, a partire dalloggetto x, che contiene gli interi consecutivi da
10 a 20, delloggetto y che conterr`a i tre elementi che occupano la prima, la terza e la sesta
posizione 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 delloggetto z che conterr`a, nellordine, 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))
[1] 10 11 12 300 400 13 14 15 16 17

Esempio 1.2.14 Eliminazione ed ordinamento crescente degli elementi ripetuti di un ogget-


to.
> (x<-c(c(5:8),c(1:7)))
[1] 5 6 7 8 1 2 3 4 5 6 7
> sort(unique(x))
[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 dalloggetto x che contiene 3 elementi a valore nullo e 4
elementi a valore unitario, delloggetto sesso che conterr`a letichetta 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"
Unalternativa `e oerta 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 Operatori aritmetici e funzioni matematiche
Sugli oggetti elementari con modalit`a numerica `e possible eseguire le pi` u comuni ope-
razioni aritmetiche, quali la somma (+), il prodotto (*), la divisione (/), lelevamento
a potenza (^), 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 pena accennare alla presenza di due particolari operatori, %% e %/%, il cui
impiego, a volte utile, `e illustrato dagli esempi che seguono.
Esempio 1.2.17 Posto che loggetto x contenga gli interi consecutivi da 1 a 10, ci proponiamo
di:
11
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
individuare quali di essi `e divisibile per 2. A tal ne possiamo considerare il comando
x%%2 che porge il resto della divisione di ciascun elemento di x per 2:
> x<-c(1:10)
> x%%2
[1] 1 0 1 0 1 0 1 0 1 0
calcolare la parte intera della divisione tra ciascun elemento di x e 2. A tal ne
sopperisce il comando x%/%2, infatti:
> x<-c(1:10)
> x%/%2
[1] 0 1 1 2 2 3 3 4 4 5
Quanto alle funzioni matematiche, tra le quali gurano exp(), log(), log10(),
log2(),..., sin(), cos(), tan(), asin(), acos(), atan(), sqrt(), abs()..., `e im-
pensabile orirne qui unelenco seppur parziale; alcune di esse, di interesse sotto il
prolo statistico, sono presentate al paragrafo che segue, mentre altre ancora saranno
introdotte pi` u oltre allorche verranno arontati problemi specici.
Accenniamo, inne, alla presenza di particolari funzioni che cosentono di eseguire le
pi` u comuni operazioni su insiemi:
union(x,y): restituisce linsieme costituito dallunione degli insiemi x e y;
intersect(x,y): restituisce linsieme costituito dallintersezione degli insiemi
x e y;
setdiff(x,y): rstituisce linsieme 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 lelemento in el `e
contenuto in set, il valore logico FALSE altrimenti. Un alias del comando `e
%in%.
Esempio 1.2.18 Deniti 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
E. D. Isaia, Linguaggio R e applicazioni statistiche
[1] "e" "f" "g"
> is.element(A,setdiff(A,B))
[1] TRUE TRUE FALSE FALSE
> "f"%in%union(A,B)
[1] TRUE
> is.element("q",setdiff(letters[1:24],union(A,B)))
[1] TRUE
Si noti che tali operatori in ogni caso rimuovono gli elementi duplicati di un insieme.
1.2.5 Su alcune funzioni statistiche
Tra le innumerevoli funzioni statistiche implementate, per il momento ci limitiamo
a citare le pi` u comuni e precisamente, posto x unoggetto elementare con modalit`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): porgono, rispettivamente, 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 prodotto degli elementi di x;
quantile(x,alpha): porge 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): porge la distribuzione di frequenze assolute generata dalle osserva-
zioni individuali registrate in x;
var(x) e sd(x): calcolano, rispettivamente, la varianza e lo scarto quadratico
medio dei valori contenuti in x.
`
E bene 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 bene vedere trattasi di una funzione primitiva di impiego assai generale.
4
Tale `e il suo comportamento 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 libert`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 pesi ni.
Esempio 1.2.19 Si immagini che la rilevazione il voto conseguito allesame di Statistica,
espresso in trentesimi, conseguito da un gruppo 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
Denito loggetto 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 possiamo 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
nonche relative:
> table(voti.stat)/length(voti.stat)
voti.stat
18 20 23 25 27 30
0.05 0.15 0.20 0.25 0.20 0.15
Si osservi che, dal momento che table(voti.stat) restituisce un oggetto numerico, la
media dei voti potrebbe essere calcolata ricorrendo allistruzione:
> 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 composto da sei elementi, pos-
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 nonche 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 spesso pu`o essere fatto ricorso durante una sessione di lavoro.
abbreviate(oggetto, mln=, dot=FALSE): abbrevia gli elementi delloggetto
specicato al una lunghezza minima pari a mln=. Ponendo dot=TRUE viene
visualizzato il susso .. 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 rispetto
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) porgono, rispettivamente,
gli elementi e le variabili che compaiono nellespressione indicata e denita via
expression() o quote().
append(oggetto, valori, after=posizione): aggiunge gli elementi conte-
nuti in valori alloggetto specicato, eventualmente nella posizione 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 speciche funzioni.
attr(oggetto,attributo): attribuisce alloggetto 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 susso "\n" consente al
cursore di ritornare in modalit`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 denizione delloggetto speciciato 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 delloggetto spe-
cicato quale argomento sono ripetuti. 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 specicata in corrispondenza 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 comportamenti 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, ...
specicati. 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 lespressione di una funzione senza provve-
dere al calcolo automatico. Si ossservi il comportamento 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 comportamento della funzione quote().
factor(oggetto,levels=(n1,...,nn)): denisce in modo diretto loggetto
specicato quale fattore a n livelli. Unalternativa `e il ricorso a as.factor(oggetto).
Sono, pertanto, comandi validi:
> (temperatura<-factor(c(1,1,1,2,2,2),levels=c(1:2)))
[1] 1 1 1 2 2 2
Levels: 1 2
> 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 A C C C
Levels: A B C
format(oggetto,...): attribuisce alloggetto specicato un formato per una
migliore visualizzazione dei suoi elementi. Per default il comando prevede lal-
lineamento a destra, justify="right", e un numero di decimali pari a quanto
denito (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 " "Varianza "
> format(alpha,justify="right")
[1] "Valor medio" " Mediana" " Varianza"
> format(alpha,justify="none")
[1] "Valor medio" "Mediana" "Varianza"
formula("espressione"): consente di denire un nuovo oggetto con struttura
tipo formula il cui impiego `e principalmente riservato alle procedure di regres-
sione (lm) e di analisi della varianza (aov). La trasformazione della struttura di
unopportuna 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 modo automatico una sequenza di interi positivi da 1 a n,
ciascuno dei quali viene ripetuto 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))
[1] 1 1 1 2 2 2
Levels: 1 2
Lopzione labels =, che per default viene posta uguale a 1:n, consente di attri-
buire, a discrezione dellutente, 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 specicato. 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 lelenco degli
elementi della loro intersezione. Gli elementi diversi sono, per default, deniti
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 proposito,
si immagini che x contenga 5 elementi numerici di cui tre a valori 0 e due a
valore 1 e che si desideri attribuire letichetta Maschio qualora x=0 e Femmina
altrimenti; le istruzioni necessarie sono:
> (x<-sort(c(0,1,0,1,1)))
[1] 0 0 1 1 1
> (names(x)<-c(rep("Maschio",3),rep("Femmina",2)))
[1] "Maschio" "Maschio" "Maschio" "Femmina" "Femmina"
Leliminazione delle etichette attribuite ad unoggetto avviene con il comando
names(oggetto)<-NULL.
Si osservi che il semplice comando names(oggetto) consente di visualizzare
le etichette associate alloggetto specicato e, come vedremo nel seguito (cfr.
paragra 1.4.1 e 1.4.2), qualora loggetto fosse una lista o un data frame ne
elencherebbe i nomi degli elementi.
nchar(oggetto): restituisce il numero di caratteri di ciascun elemento alfanu-
merico contenuto nelloggetto specicato. Cos`:
> a<-c("sommatoria","produttoria")
> nchar(a)
[1] 10 11
> sum(nchar(a))
[1] 21
noquote(oggetto): visualizza gli elementi delloggetto alfanumerico specicato
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 possibile 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, per individuare i quantili di una distri-
buzione.
pretty(oggetto,n=): restituisce una sequenza di n numeri tali da suddividere
il range delloggetto specicato 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 20
> pretty(x)
[1] 10 12 14 16 18
quote(oggetto): restituisce lespressione di una funzione senza provvedere al
calcolo automatico. Si ossservi il comportamento 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 delloggetto spe-
cicato nella posizione 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 delloggetto ad elementi nu-
merici indicato in numeri con tante cifre decimali quante specicate 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 tipo:
n
1
, n
1
, n
2
, n
1
, n
2
, n
3
, . . . , n
1
, n
2
, . . . , n
max
A tal proposito:
22
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): ricodica in -1, 0 e 1 gli elementi numerici delloggetto speci-
cato a seconda che essi siano, rispettivamente, negativi, nulli o positivi.
> (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 delloggetto 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, riportiamo i seguenti tre comandi di utilit`a:
apropos(what,mode="any"): porge un elenco di tutti gli oggetti i cui nomi
contengono quanto specicato in what e ci`o, per default, indipendentemente
dalla loro modalit`a (mode="any"):
> apropos(integrate)
[1] "integrate" "print.integrate"
Si badi che digitando apropos(".") si otterrebbe lelenco completo di tutti
gli oggetti predeniti in R, che sono ben 1456 (length(apropos("."))); di
questi quelli che poseggono modalit`a di tipo "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 lesistenza delloggetto specicato,
indipendentemente dalla sua modalit`a; il risultato `e di tipo 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"): riporta il nome della librebria in cui si trova loggetto
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-
nipolazione di oggetti che hanno struttura di vettore o di matrice e ci`o secondo la
comune accezione dellalgebra lineare.
`
E comunque bene tenere a mente che abitualmente nel linguaggio informatico una
qualsiasi stringa di caratteri (numerici o alfanumerici) viene detta vettore. Tutti gli
oggetti deniti 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 per denire
e manipolare matrici algebriche sono:
array(oggetto,dim=c(nrow,ncol)): trasforma loggetto indicato in una ma-
trice di ordine nrowncol (cfr. Osservazione 1.3.1);
cbind(oggetto): trasforma loggetto indicato in un vettore colonna;
matrix(oggetto,nrow=,ncol=): trasforma loggetto indicato in una matrice
di ordine nrowncol;
rbind(oggetto): trasforma loggetto indicato in un vettore riga;
24
E. D. Isaia, Linguaggio R e applicazioni statistiche
Per comodit`a di esposizione, a ne paragrafo, riassumiamo in modo ordinato le
principali funzioni predenite che operano 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 positivi:
> (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
Unalternativa potrebbe 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 deniscono le matrici x e y potrebbero essere scritti in forma com-
patta, omettendo cio`e gli identicativi nrow= e ncol=, ricordando che il numero delle righe
dve precedere quello delle colonne; in sostanza avremmo potuto impartire i comandi:
> x<-matrix(c(1:4),1,4)
> y<-matrix(c(1:4),4,1)
Nel seguito tuttavia, per motivi di chiarezza espositiva, ricorreremo sempre alla forma estesa
del comando.
Esempio 1.3.2 Creazione della matrice X le cui righe corrispondono ai vettori x e y sudeniti:
> (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) porge la trasposta 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 delloggetto z, contenente gli elementi del vettore x =
_
1 2 3

.
`
E suciente ricorrere allistruzione 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
Unalternativa potrebbe 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


possono creare matrici, per cos` dire, a pi` u dimensioni.
A tal proposito 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 rispettivamente, da inserire in ununico
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
Esempio 1.3.5 Data la matrice:
A =
_
_
1 2 1
4 3 2
1 2 1
_
_
ci proponiamo di calcolare

3
2

2
1
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 denita mentre i e j sono gli in-
dici che ne identicano rispetttivamente le righe e le colonne, e quindi i=1,...,nrow(A) e
j=1,...,ncol(A).
Il calcolo indicato potrebbe essere risolto, perlomeno 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 proposito, cfr. Esempio 1.3.14.
Esempio 1.3.6 Data la matrice:
A =
_
1 2 3
5 6 7
_
ne estraiamo i due vettori riga e i tre vettori colonna.
In R la notazione A[1,] e A[,1] indicano, rispettivamente, gli oggetti costituiti dagli elementi
della prima riga e, rispettivamente, della prima colonna di A. Ci`o premesso, possiamo pensare
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,] 1 2 3
> col2
[,1]
[1,] 2
[2,] 6

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 proponiamo 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 corrispondente alla prima riga della prima matrice ed il vettore corrispondente
alla prima colonna della seconda matrice:
> (rbind(Y[1,,1]))
[,1] [,2] [,3]
[1,] 1 4 7
> (cbind(Y[,1,2]))
[,1]
[1,] 10
[2,] 11
[3,] 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 per i = j e a
ij
= i per i = j e i = 1, 2, 3, 4.
Desiderando procedere, possiamo pensare di creare la matrice A ad elementi nulli e succesi-
vamente rimpiazzare gli elementi della sua diagonale principale, cio`e quelli per cui risulta
6
row(A) ==col(A), con gli interi 1,2,3,4. In eetti:
6
Si osservi il ricorso al simbolo ==; cfr. il paragrafo 1.6.
28
E. D. Isaia, Linguaggio R e applicazioni statistiche
> 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
Unalternativa ci `e oerta dal ricorso alla funzione diag() che porge 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 verica sul campo.
Esempio 1.3.9 Data la matrice:
A =
_
_
1 2 3
4 1 5
6 7 1
_
_
deniamo due vettori riga, diciamo x e y, contenenti rispettivamente gli elementi posti 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
per cui i > j, cio`e row(A)>col(A), mentre quelli che stanno alla destra della stessa saranno
quelli per 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,] 4 6 7
> y
[,1] [,2] [,3]
[1,] 2 3 5

Esempio 1.3.10 Dati i vettori:


x =
_
3
5
_
y =
_
1 2

`e noto che:
x y =
_
3 6
5 10
_
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,] 3 6
[2,] 5 10
> y%*%x
[,1]
[1,] 13
Il prodotto tra vettori e/o matrici viene quindi introdotto mediante loperatore %*%.
Si noti che, coerentemente:
> t(x)%*%y
Error in x %*% t(y) : non-conformable arguments

Esempio 1.3.11 Ci proponiamo 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
_
Ax = b x = A
1
b
in R impartiremo le istruzioni:
30
E. D. Isaia, Linguaggio R e applicazioni statistiche
> A<-matrix(c(2,1,1,2),nrow=2,ncol=2)
> b<-cbind(c(7,8))
> x<-solve(A)%*%b
> x
[,1]
[1,] 2
[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]
[1,] 2
[2,] 3

Esempio 1.3.12 Costruzione di matrice che contiene gli elementi di una semplice tabella
pitagorica per 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 linterpretazione delloutput dellistruzione 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
5 10 15 20
3 7 10 15
_
_
Denita 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 possono essere ottenuti applicando a ciascuna riga e colonna
loperatore 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])
Unalternativa consiste nel ricorso alla funzione
7
apply(.,.,.) i cui argomenti sono, nellordi-
ne: la matrice su cui operare, lidenticativo per i vettori riga o colonna (1=righe, 2=colonne),
nonche 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 lidenticativo numerico per i vettori riga o colonna, che porge 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 bene 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

i=1
s

j=1
a
ij
= 1
r
A
r,s
1
t
s
Cos`, ad esempio, nel caso della matrice A proposta:
> 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 45 50
> tot.riga
[,1]
[1,] 90
[2,] 50
[3,] 35
> tot
[,1]
[1,] 175
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.
Esempio 1.3.14 Data la matrice:
A =
_
_
1 2 1
4 3 2
1 2 1
_
_
calcoliamo

3
2

2
1
a
ij
. Anziche operare come illustrato allEsempio 1.3.5, in modo diretto
abbiamo:
> sum(A[c(2:3),c(1:2)])
[1] 10

A conclusione del paragrafo, ci pare utile proporre un semplice elenco delle principali
funzioni predenite che operano su oggetti con struttura di matrice.
Con riferimento ad una generica matrice Y si ha:
aperm(Y,k): consente di eetturare una permutazione di Y rispetto allargo-
mento k. Evidentemente con aperm(Y) si ha la trasposta di Y;
det(Y): calcola il determinante della matrice quadrata Y in accordo allalgoritmo
QR (cfr. Esempio 1.6.7);
diag(Y): porge gli elementi della diagonale principale di Y;
diag(k): denisce una matrice identit`a di ordine (kxk);
eigen(Y): fornisce in forma di lista (cfr. 1.4.1) gli autovalori e gli autovettori
associati alla matrice simmetrica Y;
qr(Y): procede alla decomposizione di Y secondo lalgoritmo QR, cos` come sug-
gerito da Dongarra et al. (1978); la matrice dei coecienti della decomposizione
ed altre informazioni quali il rango di Y, sono memorizzati sottoforma di lista
(cfr. 1.4.1);
solve(Y): porge la matrice inversa di Y;
solve(Y,x): risolve lequazione indicata; la soluzione `e, dunque, xY
1
;
svd(Y): procede alla decomposizione di Y secondo lalgoritmo 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): porge la trasposta di Y;
outer(x,y,funzione): costrusice una nuova matrice i cui elementi risultano
essere [i,j]=funzione(x[i],y[i],...). Se la funzione che si desidera appli-
care `e una funzione predenita ( ad esempio +, *, /, , sum, ...) questa deve
obbligatoriamente essere racchiusa entro virgolette, mentre ci`o non si applica se
`e una funzione creata ad hoc dallutente
8
. Per alcune semplici applicazioni, cfr.
Esempio 1.3.12 e 2.1.11.
1.4 Oggetti complessi
Come si disse, in R `e possibile costruire oggetti a loro volte costituiti da altri oggetti
elementari, non necessariamente della stessa modalit`a.
Tali nuovi oggetti, che abbiamo denito complessi, sostanzialmente evitano il propa-
garsi di variabili (nomi, etichette, ...) e rendono quindi pi` u chiara una sessione di
lavoro in R. A seconda della loro natura, si distinguono in liste e data frame.
1.4.1 Liste
Le liste vengono denite mediante listruzione:
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 unetichetta (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 delloggetto che
si desidera estrarre, preceduto, questo dal presso $, ad esempio nomelista$label1.
I nomi che identicano gli elementi di una lista posono 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 alloggetto elementare x letichetta dati e alloggetto a letichetta stringa,
il problema viene risolto ricorrendo allistruzione:
> mia.lista<-list(dati=x,stringa=a)
La visualizzazione del contenuto di una lista avviene impartendo il comando mia.lista, il
quale porge:
8
Si noti che il comando outer(x,y,*) pu`o essere sosituito da x %o% y.
34
E. D. Isaia, Linguaggio R e applicazioni statistiche
$dati
[1] 1 2 3 4 5 6 7 8 9 10
$stringa
[1] "a" "b" "c" "d" "e"
In altri termini, la lista mia.lista contiene due diversi oggetti elementari, ciascuno dei quali
identicabile dalla rispettiva etichetta preceduta dal simbolo riservato $.
Esempio 1.4.2 Visualizzazione degli elementi contenuti in mia.lista e successiva estrazione
delloggetto $dati. Sono sucienti i comandi:
> names(mia.lista)
[1] "dati" "stringa"
> mia.lista$dati
[1] 1 2 3 4 5 6 7 8 9 10
`
E appena 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 loggetto ms.AB, con struttura di matrice, rappresenti la
distribuzione congiunta dei caratteri colore degli occhi e colore dei capelli 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 modalit`a di ciascuna mutabile statistica (m.s.) le appropriate
etichette, possiamo ricorrere ai comandi dimnames() e list() nel modo seguente:
> dimnames(ms.AB)<-list(Capelli=c("Neri","Castani","Rossi","Biondi"),
Occhi = c("Neri","Castani","Verdi","Azzurri"))
ottenendo, coerentemente:
> 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 procedure di analisi, oltre alla visualizzazione di un out-


put standard, prevedono la creazione automatica di liste contenenti risultati intermedi
che possono essere riacquisiti per successive elaborazioni.
`
E buona norma, inoltre, documentare, in fase di programmazione, le eventuali liste
create come sottoprodotto dalle funzioni via, via implementate.
1.4.2 Data frame
Analogamente alle liste, i data frame vengono deniti mediante listruzione:
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 possibile attribuire unetichetta (label) che consente di riconoscerli in modo
pi` u spedito. Benche i data frame cos` creati abbiano struttura list, si dierenziano
dalle liste per come vengono estratti e gestiti i singoli componenti.
Denito un data frame, anche i suoi elementi siano disponibili
9
, occorre impartire
il comando attach(nomedf), in seguito al quale i singoli componenti si comportano
quali comuni variabili. Il comando detach(nomedf) scarica il data frame dallarea di
lavoro.
Ricordiamo, inne, che i nomi che identicano gli elementi di una data frame posono
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 per successive elaborazioni:
> 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 larea di lavoro contiene il solo oggetto mydata, i cui componenti, peraltro, non
sono ancora disponibili, infatti:
> sesso
Error: Object "sesso" not found
> eta
Error: Object "eta" not found
Desiderando eettuare alcune elaborazioni sui dati contenuti negli oggetti del data frame, `e
necessario, come gi`a si disse, ricorrere al comando attach(mydata); nel caso proposto, ad
esempio:
> attach(mydata)
> cat("Leta media e:",round(sum(eta)/length(eta),2),"\n")
Leta media e: 23.36
> detach(mydata)

1.5 Modalit`a e struttura di unoggetto


La modalit`a di un oggetto, vericabile, come si `e gi`a detto, con il comando mode(),
pu`o essere modicata, con le dovute cautele, ridenendo loggetto tramite le istruzioni
as.numeric oppure as.character.
Qualora unoggetto possedesse modalit`a numerica, il comando typeof(oggetto), o
equivalentemente storage.mode(oggetto), ci informa circa la rappresentazione in-
terna degli elementi delloggetto indicato, che pu`o presentarsi come integer, real,
double oppure complex, che potrebbe essere modicata con i comandi as.integer,
37
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
as.real, as.double oppure as.complex. Si noti che in tal modo oggetti con struttura
di vettore o di matrice possono essere rideniti quali oggetti elementari.
Esempio 1.5.1 Deniti gli oggetti:
> x<-seq(1:5)
> a<-letters[1:10]
> y<-cbind(x)
> Y<-matrix(log(c(1:5)),log10(c(1:5)),nrow=5,ncol=2)
si osservi il comportamento delle istruzioni:
verica esito verica esito
mode(x) "numeric" storage.mode(x) "integer"
mode(a) "character" storage.mode(a) "character"
mode(y) "numeric" storage.mode(y) "integer"
mode(Y) "numeric" storage.mode(Y) "double"
ed ancora:
> as.character(x)
[1] "1" "2" "3" "4" "5"
> as.integer(as.character(x))
[1] 1 2 3 4 5
> round(as.real(Y),3)
[1] 0.000 0.693 1.099 1.386 1.609 0.000 0.693 1.099 1.386 1.609
> as.integer(Y)
[1] 0 0 1 1 1 0 0 1 1 1

Quanto alla struttura di un oggetto, qusta pu`o esssere vericata con le istruzioni
intuitive is.vector(), is.matrix(), is.list(), is.data.frame().
Esempio 1.5.2 Con riferimento agli oggetti di cui allEsempio 1.5.1, abbiamo:
verica esito verica esito
is.vector(x) TRUE is.matrix(x) FALSE
is.vector(y) FALSE is.matrix(y) TRUE
is.vector(Y) FALSE is.matrix(Y) TRUE
In sostanza solo gli oggetti y e Y hanno struttura di matrice secondo laccezione dellalgebra
lineare; in tale ambito il primo risulta essere un vettore (riga), il secondo una matrice.
In linea di massima, la struttura di un oggetto pu`o eventualmente essere modicata
ricorrendo ai comandi as.vector(), as.matrix(), as.data.frame(), tenendo conto
che:
38
E. D. Isaia, Linguaggio R e applicazioni statistiche
as.matrix() applicato ad un oggetto elementare lo trasforma in un vettore
colonna; quindi il comando equivale a rbind();
se unelemento di un data frame `e alfanumerico, la matrice che si genera con
as.matrix() avr`a modalit`a alfanumerica;
data una matrice di ordine n p, con as.data.frame() si denisce un data
frame i cui elementi corrispondono alle p colonne della matrice specicata.
1.6 Funzioni denibili dallutente
R consente allutente una diretta programmazione di funzioni di qualsiasi natura; in
altri termini egli potr`a, a seconda delle proprie esigenze, arricchire lambiente di lavoro
con speciche funzioni.
Tra laltro, quasi i tutti i comandi R che si utilizzano abitualmente sono funzioni
denite a partire da comandi elementari.
Prima di arontare tale argomento, ci pare utile accennare alla possibilit`a di creare
cicli iterativi ricorrendo, a seconda delle esigenze, ai costrutti autoesplicativi:
for (variabile in (range)) {istruzioni}
while (condizione) {istruzioni}
repeat (condizione) {istruzioni}
Cos` il costrutto retto da for consente di ripetere le istruzioni contenute appunto in
{istruzioni} ntanto che la variabile specicata appartiene allinsieme numerico
denito in range.
Buona norma `e comunque non fare ricorso a cicli iterativi quando esistono funzioni
interne che possono sopperire allo scopo che ci si pregge.
Esempio 1.6.1 Creazione del vettore y che conterr`a il quadrato dei primi dieci interi:
> (y<-integer(10))
[1] 0 0 0 0 0 0 0 0 0 0
> for(i in 1:10) {y[i]<-i^2}
> y
[1] 1 4 9 16 25 36 49 64 81 100
Ovviamente saremmo giunti allo stesso risultato in modo diretto impartendo le istruzioni:
> (y<-(c(1:10))^2)
[1] 1 4 9 16 25 36 49 64 81 100
39
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1

Esempio 1.6.2 Creazione , a partire dalloggetto y<-c("R"), del vettore x che conterr`a la
replicazione "R","R","R".
Ricorrendo ad un ciclo retto da for:
> y<-c("R")
> x<-for(i in 1:3){print(rep(y,i))}
[1] "R"
[1] "R" "R"
[1] "R" "R" "R"
> x
[1] "R" "R" "R"
In modo diretto, ricorrendo alla funzione rep:
> y<-c("R")
> (x<-rep(y,3))
[1] "R" "R" "R"

Come un qualsiasi altro linguaggio di programmazione, R consente il ricorso a condi-


zioni logiche mediante i costrutti:
if (condizione){istruzioni}
if (condizione){istruzioni} else {istruzioni}
if (condizione){istruzioni} elseif {istruzioni}
tenendo a mente la tabella che segue:
simbolo signicato simbolo signicato
== equal to != not equal to
=> greater or equal to <= less or equal to
&& and || or
! not
Esempio 1.6.3 Si immagini che la rilevzione di un carattere quantitativo su un collettivo sta-
tistico abbia fornito in corrispondenza ad un (solo) individuo una mancata risposta (missing
value):
> x<-c(NA,20,21,20,23,27,25,27,25,23,20,21,27)
40
E. D. Isaia, Linguaggio R e applicazioni statistiche
Desiderando sostituire il valore mancante con la mediana delle osservazioni valide, possiamo
ricorrere allistruzione:
> c(median(x[!is.na(x)]),x[!is.na(x)])
[1] 23 20 21 20 23 27 25 27 25 23 20 21 27
dove median(x[!is.na(x)]) calcola appunto la mediana degli elementi di x depurati dal
valore mancante.
Ritornando al problema inizialmente postoci, la sintassi atta alla creazione di una
funzione `e:
nome<-function(parametri){comandi}
dove il nome `e a cura dellutente, in parametri `e acclusa leventuale lista di para-
metri (o meglio oggetti di natura qualsiasi) mentre in comandi sono annotate valide
istruzioni R.
Si noti che tutti gli oggetti deniti entro il corpo della funzione lo sono solo localmente;
al ne di denirli globalmente, con le dovute cautele, si pu`o ricorrere, in fase di
denizione, allassegnazione raorzativa <<-. A tal proposito, tuttavia, `e buona norma
orire loutput sottoforma di lista o, eventualmente, di data frame.
`
E importante, poi, osservare che una funzione pu`o contenere, al suo interno, altre
funzioni che, ovviamente, risulteranno denite solo localmente.
Nel seguito presentiamo, a puro scopo didattico, alcuni esempi di function.
Esempio 1.6.4 Creazione della funzione ipotenusa(a,b) che calcola la misura dellipote-
nusa di un triangolo rettangolo i cui cateti misurano a e b.
> ipotenusa<-function(a,b){sqrt(a^2+b^2)} 1
Il successivo comando ipotenusa(10,12) porge il risultato 15.6205.
Si osservi il comportamento delle istruzioni:
> ipotenusa(1,1)
[1] 1.414214
> ipotenusa(c(1:5),1)
[1] 1.414214 2.236068 3.162278 4.123106 5.099020

Esempio 1.6.5 Creazione della funzione disp.nk che provvede al calcolo delle disposizioni
senza ripetizione n
k
! = n (n 1) (n k + 1). Sono sucienti le istruzioni:
> disp.nk<-function(n,k){prod(n:(n-k+1))} 1
41
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Cos`, ad esempio:
> for (n in 1:4) print(disp.nk(n,n))
[1] 1
[1] 2
[1] 6
[1] 24
Alla luce di quanto sopra, si `e tentati di scrivere una semplice funzione per il calcolo dei coef-
cienti binomiali
_
n
k
_
, con k n; ci`o pu`o essere evitato ricorrendo al comando choose(n,k),
infatti, ad esempio:
> choose(10,c(0:10))
[1] 1 10 45 120 210 252 210 120 45 10 1

Esempio 1.6.6 Creazione della funzione somma che, partendo da una matrice di input, prov-
vede al calcolo della somma generale, nonche delle somme di riga e di colonna; i risutati
verranno inseriti nelloggetto temporaneo con struttura di lista somma.out, che potr`a essere
visualizzato o memorizzato a seconda delle esigenze dellutente:
> somma<-function(X,print=TRUE,print.out=FALSE) 1
{ 2
if(is.data.frame(X)) {X<-as.matrix(X)} 3
if (!is.matrix(X)) {stop("X deve essere una matrice")} 4
t.riga<-apply(X,1,sum) 5
t.col<-apply(X,2,sum) 6
t<-sum(X) 7
somma.out<-list(tot.riga=t.riga,tot.col=t.col,tot=t) 8
if(print==TRUE) {return(somma.out)} 9
if(print.out==TRUE) {somma.out<<-somma.out} 10
} 11
A commento:
in riga [1] viene denita la funzione somma che ha quale unico input loggetto matrice
con struttura di matrice. Le due opzioni print=TRUE e print.out=FALSE ssano la
situazione di default: i risultati vengono visualizzati ma non memorizzati in un oggetto
in uscita dalla funzione;
il corpo della funzione `e racchiuso entro le righe [2] e [11];
le righe [3] e [4] eseguono un controllo sulloggetto X di input, il quale deve avere
struttura di matrice o di data frame; se tale condizione non `e soddisfatta la funzione
visualizza un avviso di errore;
42
E. D. Isaia, Linguaggio R e applicazioni statistiche
le righe [5], [6] e [7] provvedono ai calcoli richiesti ed in riga [8] viene denito loggetto
somma.out con struttura di lista contenente, appunto, i risultati;
in riga [9] a seconda del valore TRUE o FALSE assunto dalla variabile ag print viene
visualizzata la lsita somma.out;
in riga [10] a seconda del valore TRUE o FALSE assunto dalla variabile ag print.out
viene creata la lsita in uscita somma.out. Generalmente tali condizioni vengono scritte
in modo compatto: if(print) e if(print.out).
Cos` con riferimento, ad esempio, alla matrice:
A =
_
1 3
2 4
_
avremo:
> A<-matrix(c(1:4),nrow=2,ncol=2)
> somma(A)
$tot.riga
[1] 4 6
$tot.col
[1] 3 7
$tot
[1] 10
> somma(A,print=FALSE,print.out=TRUE)
> somma.out
$tot.riga
[1] 4 6
$tot.col
[1] 3 7
$tot
[1] 10

Esempio 1.6.7 Come gi`a si disse, il calcolo del determinante di una matrice quadrata Y
pu`o essere svolto tramite la funzione det() che, perlomeno nella situazione di default, ricorre
alla funzione qr(Y). Lo stesso risultato lo si pu`o ottenere tramite la funzione svd(Y), la quale
(Dongarra et al. 1978) procede alla decomposizione di Y come:
Y = UDV
t
dove U e V sono matrici con colonne ortonormali di dimensione pari a ncol(Y) e ncol(Y)
rispettivamente, mentre D `e una matrice diagonale contenente i valori singolari di Y. I risul-
tati di interesse della decomposizione, proposti sottoforma di lista sono $d, vettore contenente
i valori singolari di Y, $u, matrice le cui colonne corrispondono agli autovettori sinistri di Y
e $v, matrice le cui colonne corrispondono agli autovettori destri di Y.
43
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Il valore assoluto del determinante di Y corrisponde dunque al prodotto degli elementi della
diagonale principale di D. Quanto al segno del determinante, esso sar`a negativo se il numero
dei valori singolari di Y `e pari, positivo altrimenti; tale condizione viene vericata tramite
length(diag(Y))%%2. Possiamo, quindi, scrivere la seguente funzione:
> det.new<-function(Y) 1
{ 2
det<-prod(svd(Y)$d) 3
if (length(diag(Y))%%2 == 1) {-det} 4
else {det} 5
} 6
Cos`, ad esempio:
> (M<-matrix(c(1,1,0,1,1,1,0,1,1),nrow=3,ncol=3))
[,1] [,2] [,3]
[1,] 1 1 0
[2,] 1 1 1
[3,] 0 1 1
> det.new(M)
[1] -1
> det(M)
[1] -1

1.7 Su alcune funzioni matematiche


Presentiamo alcune funzioni matematiche che possono tornare utili per la risoluzione
di specici problemi e necessitano in input di oggetti di tipo expression o function.
In forma schematica, abbiamo:
D(funzione,"variabile"): consente il calcolo simbolico della derivata prima
di una funzione, denita quale expression(), rispetto alla variabile di interesse,
che dovr`a essere indicata sottoforma di stringa.
Esempio 1.7.1 Data la funzione f(x, y) = exp((x
2
+y
2
)), ci proponiamo di:
calcolare simbolicamente le derivate prime parziali:
> f<-expression(exp(-(x^2+y^2)))
> D(f,"x")
-exp(-(x^2 + y^2)) * (2 * x)
> D(f,"y")
-exp(-(x^2 + y^2)) * (2 * y)
44
E. D. Isaia, Linguaggio R e applicazioni statistiche
valutare il determinante (f

xx
f

yy
f

xy
) della matrice hessiana in corrispondenza al
punto di coordinate (x = 0, y = 0):
> x<-0
> y<-0
> eval(D(D(f,"x"),"x"))*eval(D(D(f,"y"),"y")) - 2*eval(D(D(f,"x"),"y"))
[1] 4
Per inciso:
> D(D(f,"x"),"x")
-exp(-(x^2 + y^2)) * 2 - exp(-(x^2 + y^2)) * (2 * x) * (2 * x)
> D(D(f,"y"),"y")
-exp(-(x^2 + y^2)) * 2 - exp(-(x^2 + y^2)) * (2 * y) * (2 * y)
> D(D(f,"x"),"y")
exp(-(x^2 + y^2)) * (2 * y) * (2 * x)

uniroot(function(x) espressione,interval=c(a,b),tol=1e-30): ricerca


gli eventuali zeri della funzione f(x) denita quale function, nellintervallo
(a, b).
Esempio 1.7.2 A commento della funzione uniroot, proponiamo i seguenti problemi:
data la funzione f(x) = x
2
1, ricerchiamone gli zeri nellintervallo (0, 2):
> str(uniroot(function(x) x^2-1,interval=c(0,2),tol=1e-30))
List of 4
$ root : num 1
$ f.root : num 0
$ iter : int 8
$ estim.prec: num 6.51e-05
data la funzione f(x) = (x 1)
2
(x + 1)
2
, ricerchiamo gli zeri della sua derivata prima
nellintervallo
10
(.5, .5). Il problema sarebbe di semplice soluzione se immettessimo
direttamente la derivata prima di f(x); qui, tuttavia, preferiamo calcolare (simboli-
camente) f

x
e passarne lespressione alla funzione uniroot. A tal ne sfruttiamo le
istruzioni:
> f<-expression((x-1)^2 * (x+1)^2) 1
> dfdx<-as.function(list(x="x",D(f,"x"))) 2
> uniroot(dfdx,low=-.5,up=.5)$root 3
[1] 0 4
10
In eetti, come si pu`o facilmente vericare algebricamente, f

x
si annulla in corrispondenza a tre
distinti punti in (2, 2).
45
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
A commento `e bene notare che, denita f(x) quale expression ai ni della derivazione,
in riga [2] trasformiamo lespressione ottenuta per f

x
in function, con argomento x, :
cio`e:
> dfdx
function (x = "x")
2 * (x - 1) * (x + 1)^2 + (x - 1)^2 * (2 * (x + 1))
quindi passiamo loggetto dfdx alla funzione uniroot.
data la funzione f(x) = exp(x), ricerchiamo il pi` u piccolo valore di x per cui f(x)
pu`o considerarsi numericamente nulla, cio`e, ad esempio, se f(x) = 10
300
. A tal ne
`e suciente listruzione:
> str(uniroot(function(x) exp(-x)-10^(-300),interval=c(0,1000),
tol=1e-30))
List of 4
$ root : num 691
$ f.root : num 2.37e-314
$ iter : int 21
$ estim.prec: num 3.41e-13

optimize(function(x) espressione,interval=c(a,b),maximum=FALSE): ri-


cerca un eventuale punto di minimo (o di massimo, ponendo maximum=TRUE)
della funzione f(x) denita quale function, nellintervallo (a, b).
Esempio 1.7.3 Data la funzione f(x) = sin(x), ci proponiamo di calcolarne il minimo ed il
massimo nellintervallo (0, 2 ). A tal ne sopperiscono le istruzioni:
> optimize(function(x) sin(x),interval=c(0,2*pi),tol=1e-30,maximum=FALSE)
$minimum
[1] 4.712389
$objective
[1] -1
> optimize(function(x) sin(x),interval=c(0,2*pi),tol=1e-30,maximum=TRUE)
$maximum
[1] 1.570796
$objective
[1] 1
Si noti che, data ad esempio la funzione f(x) = x
3
, la ricerca di un punti di minimo (!) in
(2, 2) mediante optimize porgerebbe:
46
E. D. Isaia, Linguaggio R e applicazioni statistiche
> optimize(function(x) x^3,interval=c(-2,2),tol=1e-30,maximum=FALSE)
$minimum
[1] -2
$objective
[1] -8
risultato evidentemente privo di senso.
integrate(funzione,lower=, upper=,subdivisions=100): consente il cal-
colo, per quadratura numerica, dellintegrale della funzione f(x) denita quale
function nellintervallo (a, b), nito o innito.
Esempio 1.7.4 Data la funzione integranda f(x) =
1

2
exp(
x
2
2
):
> f<-function(x) (2*pi)^(-.5)*exp(-.5*x^2)
ci proponiamo di:
calcolare il suo integrale nellintervallo (3, 3):
> str(integrate(f,lower=-3,upper=3))
List of 5
$ value : num 0.997
$ abs.error : num 9.25e-07
$ subdivisions: int 1
$ message : chr "OK"
$ call : language integrate(f = f, lower = -3, upper = 3)
- attr(*, "class")= chr "integrate"
Ovviamente, per la simmetria di f(x), risulta
_
3
3
f(x) dx = 2
_
3
0
f(x) dx; numerica-
mente, infatti:
***
calcolare il suo integrale nellintervallo (, t), con t = 3, 2.5, . . . , 0; ricorrendo ad
un semplice ciclo retto da for, abbiamo:
> for(b in seq(-3,0,by=.5)){
cat(integrate(f, lower = -Inf, upper = b)$value,"\n")}
0.001349899
0.006209665
0.02275013
0.0668072
0.1586553
0.3085375
0.5

47
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
1.8 Lettura e registrazione di archivi
In R vi sono sostanzialmente due modi per leggere e/o registrare archivi di dati e
questi si basano sui comandi scan() - write() e read.table() - write.table()
rispettivamente. A questi `e giocoforza aancare il particolare comando data() che
permette di acquisire dati registrati in formato particolare che abitualmente fanno
parte integrante dei package di base o aggiuntivi di R.
Ricordiamo che comunque `e possibile importare e/o esportare dati in formati ricono-
scibili da altri pacchetti, ad esempio Excell, Oracle, SAS, Spss, ...; a tal ne, tuttavia,
occorre disporre di funzioni o package ad hoc, facilmente reperibili consultando
il sito http://www.r-project.org.
1.8.1 I comandi scan() e write()
Lettura di un le di dati con struttura blank or tab delimited pu`o avvenire riccor-
rendo al comando scan() la cui sintassi `e:
nomelista<-scan("filename",list(label1=type,...,labeln=type))
dove filename `e larchivio dati di interesse, label sono le etichette attribuite a ciascun
oggetto denito implicitamente per ciascuna colonna del le in lettura, mentre type
indica la modalit`a dei singoli oggetti che verranno inclusi nella lista (type=0 e type=""
per oggetti con modalit`a numerica o alfanumerica rispettivamente). Si osservi che
loggetto nomelista ha struttura list.
Esempio 1.8.1 La lettura del le di dati Mydata.dat con struttura blank or tab delimited
170 77 M
182 81 M
172 55 F
........
176 67 F
avverr`a previa denizione della lista mieidati ed estraendo da essa i singoli oggetti di
interesse. In pratica:
> mieidati<-scan("Mydata.dat",list(x=0,y=0,sex=""))
> altezza<-mieidati$x
> peso<-mieidati$y
> sesso<-mieidati$sex
Una forma alternativa, meno elegante, ma forse pi` u chiara, potrebbe essere la creazione di una
lista priva di etichette e lattribuzione delle stesse in seconda battuta; ad esempio la lettura
del le Mydata.dat potrebbe avvenire in accordo alle istruzioni:
48
E. D. Isaia, Linguaggio R e applicazioni statistiche
> mieidati<-scan("Mydata.dat",list(0,0""))
> x<-mieidati[[1]]
> y<-mieidati[[2]]
> sex<-mieidati[[3]]

La scrittura, o registrazione, su le in formato blank delimited delle variabili di


interesse avviene con il semplice comando:
write(oggetto1,oggetto2,...,oggetton,file="filename")
Esempio 1.8.2 La scrittura sul le Mydata.dat degli oggeti x, y e w avviene con il comando
> write(x,y,w,file="Mydata.dat")

1.8.2 I comandi read.table() e write.table()


Mediante il comando read.table() `e possibile acquisire in memeoria, sottoforma di
data frame, i dati contenuti in archivi con struttura tab delimited. La sintassi
minima del comando `e:
nomedf<-read.table("filename",header = FALSE)
Gli oggetti, con struttura factors, del data frame acquisito in memoria vengono
indicati per default in V1,V2,V3,...
Qualora la prima riga dellarchivio contenesse il nome delle variabili, una corretta
lettura si avrebbe ponendo header = TRUE e gli oggetti del data frame assumerebbero
tali nomi.
Esempio 1.8.3 La lettura del le di dati Mydata.tab con struttura tab delimited:
altezza peso sesso
170 77 M
182 81 M
172 55 F
... ... ...
176 67 F
avviene tramite il semplice comando:
49
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> mieidati<-read.table(file="Mydata.tab",header=TRUE)
> mieidati
altezza peso sesso
1 170 77 M
2 182 81 M
3 172 55 F
4 176 67 F
5 170 77 M
6 182 81 M
7 170 77 M
8 171 65 F
9 170 77 M
10 165 55 F
11 180 77 M
12 172 81 M
13 160 77 M
14 192 81 M
15 170 77 M
16 172 67 F
A questo punto con attach(mieidati) si rendono disponibili i tre oggetti altezza, peso e
sesso per succcessive elaborazioni.
In modo del tutto naturale, la scrittura su le di un generico data frame avviene con
il comando write.table(dataframe,file="filename").
1.8.3 Il comando data()
Sfruttando tale comando `e possibile accedere in modo diretto agli archivi di dati
registrati direttamente sottoforma di lista o di data frame che, quale parte integrante
dei package di base o aggiuntivi di R, sono abitualmente posti nelle corrispondenti
directory \library\<package>\data.
A tal proposito, alcuni comandi utili sono:
data(package=<package>): visualizza lelenco ed eventualmente una breve de-
scrizione degli archivi disponibili per il package specicato. Con data() si ot-
tiene lelenco del (o dei) package attualmente in uso, ad esempio base, ctest,
modreg ..., mentre con data(package=.packages(all.available=TRUE)) si ha
lelenco completo degli archivi di dati relativi a tutti i package presenti nella
directory \library di R.
help(package=<package>,<nome del file>): fornisce, se previsto, una breve
descrizione dellarchivio di dati specicato;
50
E. D. Isaia, Linguaggio R e applicazioni statistiche
data(package=<package>,<nome del file>): carica in memoria larchivio di
dati specicato.
Naturalmente lutente pu`o creare *** non so dove inserirlo *** qui o, penso meglio,
in un capitolo/paragrafo ad hoc sulle librerie.
1.9 Personalizzazione dellambiente di lavoro
Lambiente di lavoro pu`o essere personalizzato, a seconda delle esigenze dellutente,
semplicemente modicando i valori di default delle diverse opzioni che deniscono ad
esempio il prompt, il numero di decimali visualizzati, la dimensione ed il layout
della pagina in fase di stampa e molte cose ancora.
Le modiche, in linea di massima, possono essere attuate seguendo diverse vie, e pi` u
precisamente:
nel corso di una sessione di lavoro. In tal caso esse avranno unicamente valore
temporaneo a meno che non si salvi lambiente stesso, creando cos` il le Rdata;
lanciando successivamente R tramite questo, si ritroveranno modicate;
direttamente sul le Rprofile, s` che esse divengono, per cos` dire, permanenti;
Senza entrare in dettagli, la creazione del le Rdata ci pare la soluzione migliore,
anche perche in tal modo, lasciando integro il le Rprofile, si possono creare diverse
congurazioni di R poste, ad esempio, in altrettante directory di lavoro.
Desiderando ottenere lelenco completo dei nomi delle opzioni su cui `e possibile
intervenire, `e suciente digitare names(.Options), infatti:
> names(.Options)
[1] "prompt" "continue" "editor"
[4] "expressions" "width" "digits"
[7] "contrasts" "echo" "verbose"
[10] "check.bounds" "keep.source" "keep.source.pkgs"
[13] "error.messages" "ts.eps" "na.action"
[16] "show.signif.stars" "show.coef.Pvalues" "warn"
[19] "help.try.all.packages" "CRAN" "timeout"
[22] "download.info" "encoding" "papersize"
[25] "device" "pager" "unzip"
[28] "mailer"
Per visualizzare i valori di default di ciascun parametro occorre digitare options()
oppure str(options()); questultimo porge
11
:
11
Ovviamente a seconda della piattaforma su cui `e installato R.
51
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> str(options())
List of 28
$ prompt : chr "> "
$ continue : chr "+ "
$ editor : chr "Nedit"
$ expressions : int 500
$ width : int 79
$ digits : int 7
$ contrasts : Named chr [1:2] "contr.treatment"
"contr.poly"..- attr(*, "names")= chr [1:2] "unordered" "ordered"
$ echo : logi TRUE
$ verbose : logi FALSE
$ check.bounds : logi FALSE
$ keep.source : logi TRUE
$ keep.source.pkgs : logi FALSE
$ error.messages : logi TRUE
$ ts.eps : num 1e-05
$ na.action : chr "na.omit"
$ show.signif.stars : logi TRUE
$ show.coef.Pvalues : logi TRUE
$ warn : num 0
$ help.try.all.packages: logi FALSE
$ CRAN : chr "http://cran.r-project.org"
$ timeout : num 60
$ download.info : num 2
$ encoding : int [1:256] 0 1 2 3 4 5 6 7 8 9 ...
$ papersize : chr "a4"
$ device : chr "X11"
$ pager : chr "nedit"
$ unzip : chr "tar"
Prima di procedere a modiche dei parametri di default conviene creare una copia
degli stessi s` da poter ripristinare in qualsiasi istante la situazione di default; ci`o pu`o
avvenire, ad esempio, impartendo le istruzioni:
> default.opt<-options()
> ... modifiche dei parametri ...
> ... elaborazioni ...
> options(default.opt)
52
E. D. Isaia, Linguaggio R e applicazioni statistiche
Le modiche dei parametri avvengono con il comando options(opzione=valore);
ad esempio
12
:
> default.opt<-options()
> pi
[1] 3.141593
> options(digits=20)
> pi
[1] 3.141592653589793
> options(prompt="@->")
@-> options(digits=2)
@-> pi
[1] 3.1
@-> options(default.opt)
> pi
[1] 3.141593
1.10 Le librerie e loro gestione
Come si `e detto, a seconda delle esigenze dellutente,pu`o a volte capitare di dover di-
sporre di particolari librerie matematiche, statistiche e/o grache aggiuntive, reperibili
al sito uciale http://www.r-project.org oppure costruite ad hoc.
Comunque sia, per un corretto funzionamento, i package dovranno essere posti nella
directory \library, la quale potrebbe assumere la seguente struttura:
\library
\base
\ctest
\modreg
... ...
\personale
... ...
\ts
Ci`o premesso, lelenco che segue riporta in modo schematico alcuni comandi atti alla
gestione dei diversi package presenti \library:
(.packages()): indica quali package sono attualmente in uso. Abitualmente,
la congurazione di Rprofile prevede il caricamento della sola libreria \base;
infatti:
12
Si ricordi che nel numero di decimali da visualizzare `e compreso il separatore.
53
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> (.packages())
[1] "base"
.packages(all=TRUE): fornisce la lista dei package disponibili in \library.
Nel caso dello scrivente:
> .packages(all=TRUE)
[1] "KernSmooth" "MASS" "base" "boot"
[5] "bootstrap" "class" "cluster" "ctest"
[9] "eda" "foreign" "integrate" "lqs"
[13] "modreg" "mva" "nlme" "nls"
[17] "nnet" "rnotes" "rpart" "scatterplot3d"
[21] "spatial" "splines" "stepfun" "survival"
[25] "ts" "xtable"
dove rnotes `e una libreria creata ad hoc e contenente la maggior parte delle
funzioni introdotte nel corso del presente lavoro.
library(): visualizza, in una nestra ad hoc, lelenco di tutti i package
disponibili con, a anco, una breve descrizione degli stessi;
library(help=<package>): porge, in una nestra apposita, un breve resoconto
circa il package specicato;
library(<package>): carica in memoria il package indicato. Cos`, ad esem-
pio, desideando disporre delle funzioni denite in rnotes sar`a suciente il
comando:
> library(rnotes)
Library rnotes; Copyright (C) 2001 E.D.Isaia
type help(package=rnotes) for summary information
> (.packages())
[1] "rnotes" "base"
detach(package:<package>): scarica dalla memoria il package specicato.
Ad esempio:
> detach(package:rnotes)
> (.packages())
[1] "base"
54
Capitolo 2
Cenni sulle procedure grache
Dedichiamo, ora, la nostra attenzione alla descrizione, seppur sommaria, delle prin-
cipali funzioni che consentono, a partire da oggetti deniti, la creazione di graci
standard, precisando sin da ora che lutente pu`o ridenire tali funzioni o crearne
nuove secondo le proprie necessit`a.
`
E bene suddividere, perlomeno idealmente, le funzioni grache nelle seguenti due
categorie:
funzioni grache di primo livello: generano il graco specicato corredato di
assi, etichette, legende, titoli. Tali funzioni, `e bene ricordalo, reinizializzano la
nestra graca;
funzioni grache di secondo livello: consentono di sovraimporre al graco
corrente alcune informazioni aggiuntive, quali, nuovi punti, linee, commenti od
altro.
In R, inoltre, `e possibile intervenire in modo diretto sui parametri di default dellam-
biente graco, modicandone a piacere laspetto.
2.1 Funzioni grache di primo livello
Si tratta essenzialmente di una serie di funzioni predenite che consentono la realiz-
zazione di graci standard. Tra esse val qui la pena citare le seguenti:
2.1.1 Funzione plot(x,y)
Si tratta di una funzione assai generica e il risultato `e condizionato dalla modalit`a del
primo oggetto posto quale argomento.
Infatti:
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
se x e y sono oggetti o vettori numerici, plot(x,y) porge il classico diagramma
a dispersione di y in funzione di x. Allo stesso risultato si perviene con plot(z),
posto z sia una matrice (nx2) ad elementi numerici oppure una lista;
se y rappresenta una serie storica, con plot(y) viene rappresentata la serie
stessa, con in ascissa i valori dellindice di y, cio`e c(1:lenght(n)), salvo altra
specicazione.
qualora x e y siano due oggetti con modalit`a factor il primo e numerica il
secondo, plot(x,y) produce un diagramma a dispersione di y per ciascun livello
di x.
se y `e un vettore con modalit`a complessa, plot(y) produce un diagramma a
dispersione con in ordinata la parte immaginaria degli elementi di y ed in ascissa
quella reale.
Tali sono gli argomenti obbligatori della funzione plot(). Il graco oerto, con le
avvertenze di cui sopra, provvede in modo automatico (situazione di default
1
.) alla
rappresentazione dei punti di coordinate (x, y) mediante il simbolo , alla suddivisione
degli assi x e y in intervalli uguali tra il massimo ed il minino dei valori osservati,
nonche alla visualizzazione delle etichette per gli assi x e y e di un titolo che nella
forma standard `e del tipo Plot of ....
Tale situazione di default pu`o essere modicata dallutente ricorrendo ad un ventaglio
piuttosto esteso di opzioni; tra queste val la pena menzionare:
opzione che modica la presentazione degli assi cartesiani:
frame.plot=TRUE graco racchiuso in una scatola (default);
frame.plot=FALSE visualizzati i soli assi delle ascisse e delle ordinate
opzioni che alterano il campo di escursione degli assi x e/o y:
xlim(c(min,max)) ylim(c(min,max));
opzioni che modicano il tipo di rappresentazione dei punti di coordinate (x, y).
Per default essi vengono rappresentati mediante un punto (); tale situazione
pu`o essere modicata ricorrendo a diverse opzioni; tra esse menzioninamo le
seguenti:
1
Salvo diversa congurazione dei prametri graci; a tal proposito cfr. paragrafo 2.3
56
E. D. Isaia, Linguaggio R e applicazioni statistiche
type="l" coppie (x, y) congiunte da una linea;
type="b" coppie (x, y) congiunte da una spezzata;
type="s" coppie (x, y) congiunte da una spezzata a gradini;
type="h" congiunge con un segmento x con il corrispondente y;
type="n" coppie (x, y) non rappresentate;
opzioni che modicano la natura degli assi x e/o y:
log="x" dati in ascissa in forma logaritmica;
log="y" dati in ordinata in forma logaritmica;
log="xy" entrambi gli assi in forma logaritmica;
opzioni, valide per tutte le procedure grache, che permettono di modicare
titoli ed etichette:
main="stringa" il titolo presenta lespressione in striga;
xlab="stringa" lasse x etichettato con lespressione in striga;
ylab="stringa" lasse y etichettato con lespressione in striga.
Evidentemente tutte le etichette scompaiono con le opzioni main="", xlab=""
e ylab="". A volte pu`o essere utile sopprimere del tutto, con il comando
ann=FALSE, le annotazioni ed inserirle successivamente a piacere tramite il co-
mando title (cfr. paragrafo 2.2).
2.1.2 Funzione matplot(x,y)
Tale funzione, del tutto identica a plot per quanto concerne le diverse opzioni, se ne
dierenzia poiche permette di rappresentare pi` u curve su uno stesso graco.
2.1.3 Funzione hist(x)
Tale funzione consente la creazione di un istogramma delloggetto numerico indicato
quale argomento.
Nella situazione di default il numero delle classi dellistogramma `e calcolato suddi-
videndo il campo di escursione di x in n intervalli di ugual ampiezza, avendo cura
di porre n = {1 + log
2
[length(x)]}. Infatti la funzione plot() contiene listruzione
pretty(range(x),1+log2(length(x))).
Tale situazione pu`o essere modicata a piacere dallutente ricorrendo allopzione
breaks=n, con n intero positivo. Ricorrendo a tale opzione, in R `e possibile crea-
re istogrammi di frequenze per dati raccolti in classi di modulo non costante; a tal
proposito, posto che x contenga 100 osservazioni comprese tra 10.5 e 29.7, listruzione:
> hist(x,breaks=c(10,15,20,30))
57
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
porge un istogramma con classi (10 - 15], (15 - 20] e (20 - 30] ed in ordinata le
corrispondenti densit`a, ovvero i rapporti tra le frequenze assolute di classe ed il modulo
della classe stessa. Una semplice applicazione `e riportata allEsempio ??.
Sempre per default, in ordinata vengono riportate, per ciascuna classe, le frequenze as-
solute; lopzione freq=FALSE consente di riportare sullasse delle ordinate le frequenze
relative
2
.
Osserviamo, ancora, che il comando hist(...,plot=FALSE) non visualizza alcun
istogramma ma crea una lista contenene i seguenti oggetti:
$breaks $counts $intensities
$density $mids $xname
il cui signicato `e intuitivo. Per inciso, tale comportamento `e proprio delle principali
funzioni grache, tranne plot().
2.1.4 Funzione boxplot(x,y,z,...)
Tale funzione consente di creare un diagramma a scatola e ba degli oggetti nu-
merici indicati quale argomento. Questi potrebbero alternativamnte corrispondere
ai diversi elementi di una lista o di un data.frame, a patto, in questultimo caso,
che essi abbiamo tutti la medesima cardinalit`a. A tal proposito, si immagini che gli
oggetti mate e stat contengano, rispettivamente, i voti di Matematica e di Statistica
ottenuti da 10 studenti di un corso universitario:
> mate<-c(23,24,23,18,25,27,30,27,23,29)
> stat<-c(24,27,21,20,27,20,30,25,18,30)
Ai ni della costruzione dei diagrammi a scatola e ba di cisacuna variabile si
possono impartire i seguenti comandi del tutto equivalenti nel risultato:
> boxplot(mate,stat)
> boxplot(list(mate,stat))
> boxplot(data.frame(mate,stat))
> boxplot(data.frame(cbind(mate,stat)))
Osserviamo, che in alcune situazioni pu`o accadere di avere a disposizione due oggetti
elementari, il primo dei quali contenente le osservazioni individuali di una variabile di
interesse, il secondo le corrispondenti modalit`a di un certo fattore di straticazione; in
tali siuazioni, senza dovere modicare la struttura dei dati, si pu`o ricorrere, in fase di
denizione, allespressione x~g, che indica che le osservazioni individuali contenute in
x debbono essere straticate in funzione delle modalit`a di g. Riprendendo lesempio
precedente, potremmo impartire i comandi:
2
Unalternativa `e rappresentata dallopzione probability=TRUE.
58
E. D. Isaia, Linguaggio R e applicazioni statistiche
> voti<-c(mate,stat)
> materia<-c(rep(1,10),rep(2,10))
> boxplot(voti~materia)
Tra le numerose sono le opzioni, ci limitamo alle seguenti di carattere assai generale:
range=n: consente di modicare la lunghezza dei ba, che per default hanno
una lughezza pari a 1.5 volte la dierenza interquartile
3
. Ponendo range=0 essi
si dimensionano in modo da includere i valori estremi;
border=colori: colora i bordi del diagramma in accordo a quanto specicato
nel vettore colori;
col=colore: la scatola viene riempita con il colore indicato;
horizontal=FALSE: rappresenta la situazione di default; con horizontal=TRUE
i diagrammi vengono ruotati di 90 gradi.
2.1.5 Funzioni qqplot(x,y) e qqnorm(x)
Il ricorso a qqplot(x,y) consente di ottenere il diagramma a dispersione dei quantili
della variabile x rispetto a quelli della variabile y, con, ovviamente, length(x) non
necessariamente uguale a length(y).
Se si ha cura di porre y<-qnorm(ppoints(length(x)),mean(x),sd(x)), allora i
quantili di x sono rarontati con quelli di una N(
X
,
X
). Unalternativa consiste nel
ricorso al comando qqnorm(x), il quale porge il diagramma a dispersione dei quantili
della variabile x rispetto a quelli di una distribuzione normale standardizzata.
Le opzioni di tali funzioni sono del tutto analoghe a quelle presentate a proposito di
plot(x,y). Per una semplice applicazione, cfr. Esempio 4.2.3.
2.1.6 Funzione barplot(x) e piechart(x)
Tali funzioni permettono la creazione di semplici diagrammi a barre e a torta rispet-
tivamente.
Il loro output graco pu`o essere arricchito, ad esempio,attribuendo delle etichette a
ciascun elemento delloggetto speccato quale argomento.
2.1.7 Funzione polygon(x,y)
Tramite tale funzione `e possibile visualizzare poligoni i cui vertici sono contenuti negli
oggetti x e y. A titolo di esempio:
3
In altri termini,lasciano alla loro sinistra e destra circa il 5% delle osservazioni.
59
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> x<-c(9.154932,11.374214,9.313423,11.044401,8.634460,11.176227)
> y<-c(12.66062,31.05207,17.42724,15.11586,22.99784,18.09190)
> plot(x,y, type="n", xlab="", ylab="")
> polygon(x,y,col="red")
2.1.8 Funzione curve(espressione)
Il ricorso a tale funzione consente di rappresentare gracamente sul piano cartesiano
di riferimento (x, y) una qualsiasi funzione indicata in espressione, scritta quale
funzione in x. La sintassi completa, peraltro di facile interpretazione `e:
curve(espressione,from,to,n = 101,add=FALSE)
Ponendo add=TRUE `e possibile sovraimporre una seconda curva al graco corrente.
Un esempio di comando valido `e, pertanto, curve(x^2*(1-x^2)), che potrebbe essere
migliorato denendo un intervallo in ascissa entro cui visualizzare la funzione stessa,
ad esempio porre curve(x^2*(1-x^2),-1,1). In alternativa avremmo potuto denire
la funzione f e successivamente rappresentarla gracamente con i comandi:
> f<-function(x) (x^2*(1-x^2))
> curve(f,-1,1)
2.1.9 Funzione grid(nx,ny)
Tale funzione consente di aggiungere ad un graco una griglia composta da nxny
celle delimitate da altrettante linee tratteggiate. La situazione di default, ottenibile
con grid(), prevede un numero di celle pari al numero di tick marks presenti su
entrambi gli assi.
2.1.10 La funzione rect(xmin,xmax,ymin,ymax)
Ricorrendo a tale funzione possiamo costruire e visualizzare rettangoli con vertici i
punti di coordinate (x
min
, y
min
) e (x
max
, y
max
) denite dallutente.
Quale esempio, suggeriamo allutente di osservare il comportamento delle istruzioni:
> plot(c(0, 22), c(0, 22), type = "n")
> k<-4*(0:5)
> rect(0+k, 0+k, 2+k, 2+k)
Per inciso, `e la funzione primitiva per la costruzione di istrogrammi.
60
E. D. Isaia, Linguaggio R e applicazioni statistiche
2.1.11 Funzione persp(x,y,z)
Tramite tale funzione possiamo rappresentare gracamente nello spazio cartesiano
(x, y, z) una qualsiasi funzione z = f(x, y) che verr`a passata quale argomento. Argo-
menti obbligatori di persp sono:
i vettori x e y contenentI i punti (x, y) in corrispondenza ai quali calcolare i
valori di z = f(x, y);
la matrice quadrata z, di dimensione length(x)length(y), contenente ap-
punto i valori di z = f(x, y).
Desiderando, ad esempio, rappresentare gracamente la funzione:
z =
x
2
y
2
_
(x
2
+y
2
)
per x (10, 10) e y (10, 10), saranno sucienti le istruzioni:
> x<-seq(-10, 10, length=50) 1
> y<-x 2
> f<-function(x,y){fz<-x^2*y^2/sqrt(x^2+y^2)} 3
> z<-outer(x,y,f) 4
> persp(x,y,z,theta=35,phi=35,col="lightgreen") 5
A commento:
in riga [1] e [2] si deniscono gli intervalli per x e y entro cui visualizzare la
funzione z;
la riga [3] denisce in modo chiaro la funzione f(x, y) di interesse;
in riga [4], per ogni coppia (x, y), calcoliamo i valori della funzione f che risul-
teranno inseriti, tramite il comando outer(x,y,f), nella matrice z di ordine
dim(z)=length(x)length(x), ovvero 50 50;
in riga [5] il comando persp(...) visualizza il graco richiesto.
Se osserviamo che la sintassi completa del comando `e:
persp(x=seq(0,1,len=nrow(z)),y=seq(0,1,len=ncol(z)),z,
xlim=range(x),ylim=range(y),zlim=range(z,na.rm=TRUE),
xlab=NULL,ylab=NULL,zlab=NULL,main=NULL,sub=NULL,
theta=0,phi=15,r=sqrt(3),d=1,scale=TRUE,expand=1,
col=NULL,border=NULL,ltheta=-135,lphi=0,shade=NA,
box=TRUE,axes=TRUE,nticks=5,ticktype="simple",...)
61
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
la sintassi minima sar`a dunque persp(z). Per ulteriori applicazioni, cfr. Esempi ??
e **.
2.1.12 Funzione pairs(x)
Ricorrendo a tale funzione `e possibile, partendo da una matrice x contenente poniamo
s 2 colonne che rappresentano altrettante variabili di interesse, creare i diagrammi
a dispersione tra tutte le (s
2
s) combinazioni delle variabili oggetto di studio. La
sintassi per accedere a tale funzione `e, nella sua veste pi` u dimessa, pairs(x).
Tra le diverse opzioni, vale la pena menzionare:
panel=function(x,y,...): consente di sovraimprimere ai diagrammi a di-
spersione una particolare funzione graca denita dallutente, ad esempio la
seguente, che sovraimpone a ciascun diagramma a dispersione la corrispondente
retta di regressione:
panel.fit<-function(x,y,col=par("col"),pch=par("pch"),cex=1)
{
points(x,y,pch=pch,col=col,cex=cex)
lines(x,lm(y~x)$coef[1]+lm(y~x)$coef[2]*x,col="red")
}
che pu`o essere attivata con il comando pairs(x,panel=panel.fit). Lasciamo
al Lettore il commento della funzione proposta alla luce di quanto esposto ai
paragra 2.2 e 2.3 e 6.2.1.
Una funzione predenita in R `e panel.smooth, la quale aggiunge, a ciascun
graco, una particolare curva di regressione cos` come proposto da Cleveland
(1981);
diag.panel=function(x,y,...): permette di inserire sulla diagonale princi-
pale della matrice dei diagrammi a dispersione, in luogo dei nomi delle s
variabili coinvolte (situazione di default), particolari funzioni grache a secon-
da delle esigenze dellutente. A tal proposito, pensando di rappresentare le s
distribuzioni marginali mediante semplici istogrammi di frequenze, potremmo
denire la seguente funzione
4
:
>panel.hist<-function(x, ...)
{
4
Per ragioni di comodo, le altezze degli istogrammi corrispondono alle frequenze assolute divise
per il massimo di esse.
62
E. D. Isaia, Linguaggio R e applicazioni statistiche
usr<-par("usr")
par(usr=c(usr[1:2],0,1.5) )
istogramma<-hist(x,plot=FALSE)
tagli<-istogramma$breaks
ntagli<-length(tagli)
y<-istogramma$counts/max(istogramma$counts)
rect(tagli[-ntagli],0,tagli[-1],y,col="lightblue")
par(usr=c(0,1,0,1))
}
che pu`o essere attivata con il comando pairs(x,diag.panel=panel.hist). La-
sciamo al Lettore il commento della funzione proposta, e ci`o alla luce di quanto
esposto ai paragra 2.2 e 2.3. Per una semplice applicazione, cfr. Esempio 3.2.6.
lower.panel=function(x,y,...) e upper.panel=function(x,y,...): con-
sentono di inserire nelle celle, rispettivamente, a sinistra e a destra della diago-
nale principale della matrice dei diagrammi a disersione, particolari funzionide-
nite dallutente. Per unapplicazione, cfr. Esempio 3.2.6.
2.1.13 Altre funzioni grache
Oltre a quelle citate, in R sono implementate diverse altre funzioni grache utili
qualora si aronti lo studio di particolari problemi. Senza entrare in dettaglio, ci
limitano a fornirne un mero elenco, invitando il Lettore a consultare laiuto in linea
o il manuale di riferimento R Core Team (2000):
contour(x,y,z) coplot(...) dotplot(x)
image(x,y,z) stripplot(x) sunflowerplot(x,y)
2.2 Funzioni grache di secondo livello
A volte i graci ottenuti in modo automatico mediante le funzioni di primo livel-
lo non corrispondono a quanto desiderato, nel senso che possono mancare dettagli,
informazioni aggiuntive, ...
Le funzioni di secondo livello possono esserci di aiuto, dal momento che esse vengono
semplicemente sovraimposte alloutput graco corrente. Di esse ci limitamo a citare
le seguenti:
abline(a,b): aggiunge un segmento di retta di equazione y = a +bx al graco
corrente;
63
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
abline(h=y), abline(v=x): permettono di aggiungere un segmento di ret-
ta orrizontale e verticale rispettivamente a partire dalle coordinate y e/o x
specicate;
arrows(x0,y0,x1,y1,code=k,length=n,angle=m): disegna una freccia tra i
punti di coordinate (x
0
, y
0
) e (x
1
, y
1
). Quanto al parametro code: se code=1 la
freccia `e disegnata nel punto (x
0
, y
0
), se code=2 nel punto (x
1
, y
1
) mentre se si
specica code=3 si hanno due frecce, la prima in (x
0
, y
0
) e la seconda in (x
1
, y
1
).
Il parametro length indica la lunghezza (in pollici) dei segmenti della freccia,
mentre angle ne determina la divaricazione.
lines(x,y): permette di tracciare una linea, secondo i valori contenuti in x
e y, al graco corrente;
points(x,y): consente di aggiungere punti, in accordo alle coordinate speci-
cate, al graco corrente;
segments(x0,y0,x1,y1): traccia un segmento di retta congiungente i punti di
coordinate (x
0
, y
0
) e (x
1
, y
1
);
text(x,y,stringa): permette di inserire, a partire dalle coordinate (x, y) spe-
cicate, il testo contenuto in stringa. Consigliamo allutente di osservare
loutput generato dalle istruzioni:
> plot(1:20,type="n")
> for (i in (1:20)){text(i,i, letters[i])}
title(main="...",xlab="...",ylab="...",): consente di inserire etichette
per il titolo del graco, per lasse della ascisse e per quello delle ordinate. Si noti
che occorre porre, al momento della creazione del graco stesso, ann=FALSE.
2.3 Parametri graci
Non sempre i graci prodotti in modo automatico ed eventualmente arricchiti me-
diante le funzioni di secondo livello soddisfano le esigenze, ad esempio tipograche,
dellutente.
Egli, tuttavia, pu`o agire direttamente sui parametri di default delle funzioni grache
di R, che, identicate da un nome proprio, deniscono ad esempio il tipo di caratteri,
lo stile delle linee e/o dei punti, la giusticazione del testo, il layout della nestra
graca e molte cose ancora.
Lelenco completo dei nomi dei 68 parametri graci si ottinene digitando .Pars:
64
E. D. Isaia, Linguaggio R e applicazioni statistiche
> .Pars
[1] "adj" "ann" "ask" "bg" "bty"
[6] "cex" "cex.axis" "cex.lab" "cex.main" "cex.sub"
[11] "cin" "col" "col.axis" "col.lab" "col.main"
[16] "col.sub" "cra" "crt" "csi" "cxy"
[21] "din" "err" "fg" "fig" "fin"
[26] "font" "font.axis" "font.lab" "font.main" "font.sub"
[31] "gamma" "lab" "las" "lty" "lwd"
[36] "mai" "mar" "mex" "mfcol" "mfg"
[41] "mfrow" "mgp" "mkh" "new" "oma"
[46] "omd" "omi" "pch" "pin" "plt"
[51] "ps" "pty" "smo" "srt" "tck"
[56] "tcl" "tmag" "type" "usr" "xaxp"
[61] "xaxs" "xaxt" "xlog" "xpd" "yaxp"
[66] "yaxs" "yaxt" "ylog"
mentre con par() si ottiene corrispondente lista dei valori di default. Desiderando
ottenere informazioni circa un parametro di interesse, possiamo impartire il comando
par("parametro"); ad esempio con:
> par("type")
[1] "p"
veniamo a sapere che per default la rappresentazione dei punti avviene in accordo
allopzione type="p". Uneventuale modica dei parametri graci pu`o avvenire con
il comando par(parametro=nuovi valori); ad esempio:
> par(type="l")
> par("type")
[1] "l"
Prima di procedere a modiche dei parametri di default, che come si `e detto sono
contenuti in par(), conviene creare una copia degli stessi, s` da ripristinarne, a ne
sessione, loriginale; ci`o pu`o avvenire, ad esempio, impartendo le istruzioni:
> default.par<-par
> ... modifiche dei parametri ...
> ... rappresentazioni grafiche ad hoc ...
> par(default.par)
Data la complessit`a dellargomento, ci limitiamo ad elencare il comportamento dei
seguenti parametri:
65
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
bg="colore": modica il colore dello sfondo (background). Per default si
ha bg="white". I colori possibili, identicati da un nome e/o da un numero
progressivo, sono ben 657; il loro elenco si pu`o ottenere con colors() oppure,
pi` u elegantemente, con colours();
cex=n: riduce o aumenta loutput graco nella poporzione n specicata. Per
default cex=1;
col="colore": modica il colore delloutput graco (linee, punti, ...); per
default si ha bg="white";
fin=c(x,y): determina la dimensione, in pollici, delloutput graco. La situa-
zione di default prevede fin=c(5,5);
font.lab=1, font.main=2: tipo dei caratteri per la rappresentazione delle
etichette per gli assi cartesiani e del titolo. Generalmente 1=testo normale,
2=grassetto, 3=corsivo e 4=corsivo grassetto;
cex.lab=1, cex.main=1.2: ingrandimento dei caratteri per la rappresentazione
delle etichette per gli assi cartesiani e del titolo;
lab=c(nx,ny): consente di modicare il numero delle etichette, tickmarks,
da apporre su entrambi gli assi di un graco;
lty="tipo": modica il tipo di tratteggio nella rappresentazione di linee (line
type); la situazione di default prevede lty="solid". I tipi di tratteggio pre-
visti, identicabili da un nome e/o da un numero progressivo da 0 a 6, sono,
nellordine, "blank", "solid", "dashed", "dotted" "dotdash", "longdash" e
"twodash";
mfrow=c(r, s) consente di suddividere la nestra graca in una matrice r x
s, i cui elementi saranno gli output generati dalle funzioni hist(), plot(), ...
La situazione di default viene ristabilita mediante mfrow=c(1, 1). Il compor-
tamento di mfcol=c(r, s) `e del tutto analogo;
pch=n: modica il tipo di simbolo impiegato per la rappresentazione delle coppie
di punti (x, y) della funzione plot(); n `e un intero compreso tra 0 e 20. Per
default si ha pch=1;
tmag=n: modica la dimensione dei caratteri dei titoli, annotazioni, etichette,...
Per default si ha tmag=1.
usr=c(x1, x2, y1, y2): indica le coordinate estreme della regione graca;
per default si ha usr=c(0,1,0,1).
66
Capitolo 3
Argomenti di statistica descrittiva
Nel seguito vedremo come arontare in R alcuni semplici argomenti di Statistica de-
scrittiva quali la costruzione di istogrammi, diagrammi a barre, diagrammi a disper-
sione, diagrammi a scatola e ba, la creazione di tabelle di frequenze per variabili
e/o mutabili statistiche sia univariate che bivariate, il calcolo alcuni indici di posizione
e/o di variabilit`a,
lindividuazione dei coecienti di un modello di interpolazione a minimi quadrati,
il calcolo del coeciente di correlazione lineare, lindividuazione dei parametri di una
retta di regressione, ...
Per comodit`a presenteremo i diversi problemi sottoforma di paragrafo *** comandi e
funzioni ad hoc*** , poi, faremo riferimento, di volta in volta, alle variabili contenute
negli archivi:
stat1.txt: misurazioni della statura (cm) e del peso (Kg) di 100 coscritti;
stat2.txt: numero di televisori e numero di autovetture posseduti da 50 fami-
glie;
stat3.txt: reddito netto mensile, espresso in euro, percepito da 110 individui,
di cui 50 lavoratori autonomi e 60 lavoratori dipendenti;
stat4.txt: titolo di studio (licenza elementare, licenza media superiore, diplo-
ma universitario e laurea), posizione professionale (operaio, impiegato e quadro)
e sesso di 50 dipendenti di una grande azienda;
stat5.txt: numero (in migliaia di unit`a) degli occupati, suddivisi per sesso, in
Italia negli anni 1982 1990, fonte ISTAT;
stat6.txt: voti, espressi in trentesimi, degli esami di Matematica Generale
e di Statistica di un gruppo di 40 studenti iscritti ad un corso di Diploma in
Economia.
che verranno acquisite in memoria via read.table(file="<nome del file>").
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
3.1 Mutabili e variabili statistiche univariate
Nel seguito vedremo come arontare in R alcuni semplici argomenti di Statistica de-
scrittiva quali la costruzione di istogrammi, diagrammi a barre, diagrammi a disper-
sione, diagrammi a scatola e ba, la creazione di tabelle di frequenze per variabili
e/o mutabili statistiche sia univariate che bivariate, il calcolo alcuni indici di posizione
e/o di variabilit`a,
3.1.1 Costruzione di semplici tabelle di frequenze
La costruzione di semplici distribuzioni di frequenze, in termini assoluti e/o relativi,
per una mutabile o variabile statistica, le cui osservazioni individuali sono contenute
nelloggetto x, avviene semplicemente utilizzando il comando table(x).
Tale modo di procedere pu`o dare luogo a tabelle di dicile lettura e tale `e il caso
qualora la mutabile o la variabile statistica in esame presenti un elevato numero di
modalit`a. In tali situazioni, com`e noto, si suole procedere ad una classicazione delle
modalit`a, ovvero raccogliere le osservazioni individuali in classi. In R ci`o `e possibile
ricorrendo al comando cut, la cui sintassi `e:
cut(x,breaks=ncl,right=TRUE)
dove ncl indica appunto il numero delle classi desiderate
1
o, in alternativa, i limiti
superiori di classe, mentre con right=TRUE, ciascuna classe viene ad essere chiusa a
destra.
Esempio 3.1.1 Acquisite in memoria le due variabili contenute in stat1.txt mediante i
comandi:
> stat1<-read.table(file="stat1.txt")
> names(stat1)
[1] "altezza" "peso"
> attach(stat1)
ci proponiamo di visualizzarne la distribuzione di frequenze assolute. Con riferimento alla
sola variabile altezza, abbiamo:
> table(altezza)
altezza
164.7 166.3 167.2 167.4 167.8 167.9 168.5 169.1 169.2 169.3 169.4 170.6 170.8
1 1 1 1 1 1 1 1 1 1 1 1 1
171 171.3 171.4 172 172.6 173.6 173.8 174.2 174.5 174.6 174.9 175 175.4
1
In tal caso spetta ad R individuare lampiezza, costante, delle singole classi nonche i limiti inferiore
e superiore delle stesse.
68
E. D. Isaia, Linguaggio R e applicazioni statistiche
1 1 1 1 1 1 2 1 1 1 1 2 4
175.6 175.9 176 176.2 176.5 176.7 177 177.2 178.1 178.2 178.5 178.6 178.9
3 1 1 2 2 1 1 2 3 1 1 1 1
179.2 179.3 179.5 179.9 180 180.1 180.3 180.4 180.8 180.9 181.1 181.3 181.4
1 2 2 2 1 1 1 1 2 1 1 1 1
181.5 181.9 182 182.4 182.5 182.8 183.1 183.6 184.2 184.8 184.9 185 185.1
1 1 2 1 1 1 2 2 2 1 1 2 1
185.2 185.3 185.5 186.4 186.7 186.9 187.1 187.3 187.4 188.4 190.9 191 192.5
1 1 1 1 1 1 1 2 1 1 1 1 1
manifestamente di dicile lettura. Una migliore leggibilit`a la si ottiene raccogliendo i dati
individuali in classi, ad esempio, di egual ampiezza; scelto di raccogliere i dati individuali in
7 classi e lasciando a R individuare lampiezza ed i limiti di ciascuna di esse, avremo:
> table(cut(altezza,breaks=7))
(165,169] (169,173] (173,177] (177,181] (181,185] (185,189] (189,193]
7 11 22 22 19 16 3
Una via alternativa consiste nellindicare il limite inferiore della prima classe, lampiezza di
classe ed il loro numero. Nel caso dellaltezza possiamo porre immaginare di raccogliere i dati
individuali in 7 classi di modulo 5 cm a partire da 165 cm. In tal caso:
> table(cut(altezza,breaks=160+5*(0:7)))
(160,165] (165,170] (170,175] (175,180] (180,185] (185,190] (190,195]
1 10 16 32 26 12 3
In sostanza, per le variabili in esame, deniti per chiarezza espositiva gli oggetti:
> (classi.alt<-160+5*(0:7))
[1] 160 165 170 175 180 185 190 195
> (classi.peso<-70+5*(0:5))
[1] 70 75 80 85 90 95
abbiamo:
> table(cut(altezza,breaks=classi.alt))
(160,165] (165,170] (170,175] (175,180] (180,185] (185,190] (190,195]
1 10 16 32 26 12 3
> table(cut(peso,breaks=classi.peso))
(70,75] (75,80] (80,85] (85,90] (90,95]
12 31 41 15 1
69
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Qualora si operi su variabili statistiche, potrebbe essere interessante ripartire i valori indivi-
duali in tre classi a seconda che essi cadano entro il primo quartile, tra il primo ed il terzo,
oltre il terzo; a tal ne, abbiamo approntato la seguente funzione ad hoc:
> classi.speciali<-function(x)
{
as.real(c(min(x),quantile(x,prob=.25),
quantile(x,prob=.75),max(x)))
}
la quale ci consente di ottenere, per le variabili in esame, le seguenti distribuzioni di frequenze:
> table(cut(altezza,breaks=classi.speciali(altezza)))
(165,175] (175,183] (183,192]
24 50 25
> table(cut(peso,breaks=classi.speciali(peso)))
(70.6,76.8] (76.8,84.1] (84.1,91.5]
25 49 25
Ci`o facendo possono evidentemente ottenersi distribuzioni di frequenze con classi di modulo
non necessariamente costante.
A volte capita che alle osservazioni di un carattere di interesse sia asssociata una
variabile di straticazione; ad esempio:
la statura in funzione del sesso;
il reddito annuo lordo in funzione del numero dei componenti il nucleo familiare;
il rapporto tra prezzo ed utile di titoli azionari su diverse borse;
...
Se tale `e il caso, possiamo immaginare di suddividere le osservazioni individuali del
carattere in tanti gruppi quanti indicato dalle modalit`a assunte dalla variabile di
straticazione f; a ci`o sopperisce, appunto, il comando split, la cui sintassi `e:
split(x,f)
dove f `e generalmente un oggetto a valori numerici interi consecutivi di lunghezza
pari a length(x), ovvero esso protrebbe possedere modalit`a factor.
In ogni caso con split viene creata una lista i cui elementi sono gli elementi contenuti
in x in corrispondenza a ciascuna modalit`a della stessa.
70
E. D. Isaia, Linguaggio R e applicazioni statistiche
Esempio 3.1.2 Larchivio stat3.dat contiene, sottoforma di data frame, i valori del reddito
netto mensile, espresso in euro, percepito da 110 individui, di cui 50 lavoratori autonomi e
60 lavoratori dipendenti. Larchivio in questione `e strutturato in modo che la prima colonna
riporti le misurazioni dei redditi e la seconda una variabile di tipo ag che assume valore 1
se il reddito proviene da lavoro autonomo e valore 2 se esso proviene da lavoro dipendente.
Aquisiti i dati individuali mediante le istruzioni:
> redditi<-read.table(file="stat3.txt")
> names(redditi)
[1] "reddito" "posizione"
> attach(redditi)
e desiderando, nel seguito, analizzare separatamente la distribuzione dei redditi dei lavoratori
autonomi e quella dei lavoratori dipendenti, sfruttando la funzione split, che porgerebbe:
> split(reddito,posizione)
$"1"
[1] 1949 1967 1797 1812 1855 1698 1855 1703 1989 1865 2099 2054 2080
[14] 1801 1810 2020 2105 1767 2011 1986 1977 1882 1911 1868 1672 1963
[27] 1929 1909 1868 2079 1793 1897 1977 1672 2012 1875 1689 1820 1631
[40] 1906 2103 1616 1939 1703 1593 1782 1979 1630 1761 1761
$"2"
[1] 1182 1652 1495 1770 1654 1430 1479 1357 1559 1625 1420 1858 1400
[14] 1688 1475 1386 1750 1629 1548 1468 1532 1435 1535 1306 1228 1191
[27] 1532 1084 1602 1524 1563 1551 1202 1285 1177 1886 1604 1785 1428
[40] 1249 1720 1098 1600 1301 1624 1392 1239 1492 1078 1530 1443 1566
[53] 1396 1524 1418 1548 1367 1371 1419 1178
possiamo creare i due nuovi oggetti:
> reddito.aut<-split(reddito,posizione)$"1"
> reddito.dip<-split(reddito,posizione)$"2"
su cui sar`a possibile operare, ad esempio:
> table(cut(reddito.aut,breaks=1550+150*(0:4)))
(1550,1700] (1700,1850] (1850,2000] (2000,2150]
8 12 21 9

71
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
3.1.2 Rappresentazioni grache
Parallelamente alla presentazione di tabelle di frequenze, il comportamento del carat-
tere statistico sotto esame pu`o essere riassunto mediante opportuni graci, ricordando
che in linea di massima:
per le mutabili statistiche si fa ricorso a semplici diagrammi a barre ovvero a
diagrammi circolari o a torta;
per le variabili statistiche si ricorre ad istogrammi o a diagrammi a bastoncini,
a seconda che la variabile sia di tipo continuo o discreto.
Inlotre, nel caso si operi su variabili statistiche, pu`o essere interessante evidenziare
landamento della funzione delle frequenze cumulate oppure ricorrere a semplici bo-
xplot, o diagrammi a scatola e ba; com`e noto, tali rappresentazioni grache
orono informazioni intuitive circa i quantili, la variabilit`a e leventuale simmetria
della distribuzione del carattere in esame.
Esempio 3.1.3 Con riferimento alla variabile statistica altezza di cui allEsempio 3.1.1,
mantenendo il raggruppamento in classi:
> (classi.alt<-160+5*(0:7))
[1] 160 165 170 175 180 185 190 195
listogramma di frequenze relative e la funzione delle frequenze relative cumulate, riportati in
gura (3.1), sono ottenuti mediante le istruzioni:
> fcum.classi.alt<-c(0,cumsum(table(cut(altezza,breaks=classi.alt))) 1
/length(altezza)) 2
> par(mfrow=c(1, 2)) 3
> hist(altezza,breaks=classi.alt,probability=TRUE,col="light yellow", 4
main="",xlab="Classi di altezza",ylab="Frequenze relative") 5
> plot(classi.alt,fcum.classi.alt,col="blue",xlab="Classi di altezza", 6
ylab="Frequenze relative cumulate",main="",frame.plot=FALSE) 7
> lines(classi.alt,fcum.classi.alt,col="red") 8
> grid() 9
> par(mfrow=c(1, 1)) 10
A commento, si noti che:
al ne della rappresentazione graca della funzione delle frequenze relative cumulate
della variabile statistica in esame, occorre dapprima procedere al calcolo
2
delle frequenze
relative cumulate, calcolate, linee [1]-[2], ricorrendo alle funzioni cumsum(variabile) e
length(variabile);
2
Perlomeno per motivi di chiarezza espositiva.
72
E. D. Isaia, Linguaggio R e applicazioni statistiche
Classi di altezza Classi di altezza
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e
160 160 170 170 180 180 190 190
0
.
0
0
0
.
0
2
0
.
0
4
0
.
0
6
160 160 170 170 180 180 190 190
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
Classi di altezza Classi di altezza
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e

c
u
m
u
l
a
t
e
Figura 3.1: Istogramma e funzione di frequenze cumulate Esempio 3.1.2
desiderando rappresentare sul piano cartesiano anche i punti di coordinate del tipo
(u, w), dove u rappresentano gli estremi superiori di classe e w i valori delle frequenze
relative cumulate, converr`a dapprima rappresentare tali punti e successivamente, trami-
te il comando lines(), tracciare la spezzata che li congiunge. Si osservino le istruzioni
in linea [6], [7] e [8].
A risultati simili a quelli sopra descritti saremmo potuti giungere mediante listruzione:
> plot(classi.alt,fcum.classi.alt,type="b")
lasciandone al Lettore la verica sul campo.
Esempio 3.1.4 Con riferimento alle variabile statistica reddito.aut denita allEsempio
3.1.2, i comandi che seguono producono gli istogrammi proposti in gura (3.2):
> par(mfrow=c(1,2))
> hist(reddito.aut,probability=TRUE,col="light yellow",
main="",xlab="Calssi di reddito",ylab="Frequenze relative")
> hist(reddito.aut,breaks=c(1500,1700,1800,2000,2150),col="light yellow",
main="",xlab="Calssi di reddito",ylab="Frequenze relative")
> par(mfrow=c(1,1))
di immediata interpretazione.
73
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Calssi di reddito Calssi di reddito
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e
1500 1500 1700 1700 1900 1900 2100 2100
0
.
0
0
0
0
0
.
0
0
1
0
0
.
0
0
2
0
Calssi di reddito Calssi di reddito
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e
1500 1500 1700 1700 1900 1900 2100 2100
0
.
0
0
0
0
0
.
0
0
1
0
0
.
0
0
2
0
Figura 3.2: Istogrammi con classi a modulo costante e non costante Esempio 3.1.3
Esempio 3.1.5 Sempre con riferimento alle variabili reddito.aut e reddito.dip introdotte
allEsempio 3.1.2, il graco a scatola e ba riprodotto in gura (3.3) ed ottenuto mediante
le istruzioni:
> boxplot(reddito.aut,reddito.dip,reddito,col="light yellow",
names=c("Autonomo","Dipendente","Autonomo+Dipendente"))
evidenzia come ci si trovi in presenza di due diverse distribuzioni dei redditi. In particolare,
si noti come la distribuzione dei redditi da lavoro autonomo sia tutta spostata verso lalto
rispetto a quella dei redditi da lavoro dipendente. Inoltre, mentre entrambe le distribuzioni
tendano ad essere simmetriche (si noti la posizione delle rispettive mediane allinterno della
scatola), i redditi da lavoro dipendente mostrano una maggiore variabilit`a.
Volutamente il graco di gura (3.3) riporta anche il boxplot relativo alla variabile reddito.
I diagrammi a scatola e ba delle sole due variabili reddito.aut e reddito.dip possono
essere ottenuti in modo diretto tramite il comando:
> boxplot(reddito.aut,reddito.dip,names=c("Autonomo","Dipendente"))
o, alternativamente:
74
E. D. Isaia, Linguaggio R e applicazioni statistiche
Autonomo Autonomo Dipendente Dipendente Autonomo+Dipendente Autonomo+Dipendente
1
2
0
0
1
4
0
0
1
6
0
0
1
8
0
0
2
0
0
0
Figura 3.3: Diagramma a scatola e ba Esempio 3.1.5
> boxplot(split(reddito,posizione),names=c("Autonomo","Dipendente"))
cio`e senza dovere introdurre le variabili reddito.aut e reddito.dip
Esempio 3.1.6 Per cose ormai note, introdotto per comodit`a loggetto:
> x<-nchar(apropos(".",mode="function"))
il successivo comando table(x) porge la distribuzione, in termini di frequenze assolute, del
numero di caratteri delle funzioni denite in R:
> table(x)
x
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
24 34 59 85 115 122 129 104 114 91 90 82 70 51 42 32 25
18 19 20 21 22 23 24 26
29 14 18 13 3 2 1 1
La distribuzione di tale variable discreta pu`o essere riassunta gracamente mediante un dia-
gramma a bastoncini e, per completezza, la corrispondente funzione delle frequenze relative
cumulate; a tal ne sono sucienti le istruzioni:
75
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
0
2
0
4
0
6
0
8
0
1
0
0
1
2
0
Numero di caratteri Numero di caratteri
F
r
e
q
u
e
n
z
e

a
s
s
o
l
u
t
e
11 44 77 10 10 14 14 18 18 22 22 26 26 00 55 10 10 15 15 20 20 25 25
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
Classi di altezza Classi di altezza
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e

c
u
m
u
l
a
t
e
Figura 3.4: Diagramma a bastoncini e funzione cumulativa Esempio 3.2.1
> fcum.x<-cumsum(table(x))/length(x)
> par(mfrow=c(1,2))
> plot(table(x),type="h",main="",xlab="Numero di caratteri",
ylab="Frequenze assolute",col="blue")
> plot(sort(unique(x)),fcum.x,main="",xlab="Classi di altezza",
ylab="Frequenze relative cumulate",type="s",col="blue")
> par(mfrow=c(1,1))
che producono i graci desiderati riportati in gura (3.4).
A conclusione del paragrafo, osserviamo che qualora si operi con variabili statistiche
continue, listogramma costituisce unapprossimazione della curva di densit`a, dicia-
mo f(x), che caratterizza la variabile in esame; immaginando che le classi abbiano
ampiezza costante h, tale approssimazione avviene attribuendo a tutti i punti x IR
appartenenti alla i-esima classe, il medesimo valore n
i
/nh. Sotto tale prolo, appa-
re evidente come la determinazione del numero delle classi sia quanto mai delicata;
un numero di classi esiguo comporta in genere una perdita di informazione mentre
un numero elevato di classi pu`o produrre graci incoerenti, ad esempio alcune classi
potranno avere frequenze nulle o quasi.
Un diverso approccio al problema ci `e oerto da quelle tecniche che in Statistica vanno
sotto il nome di teoria della stima non parametrica di una densit`a; su tal argomento
76
E. D. Isaia, Linguaggio R e applicazioni statistiche
si possosno consultare i testi introduttivi di Bowman, Azzalini (1997) e Wand, Jones
(1995).
Senza entrare in dettagli, vale qui la pena accennare, perlomeno dal punto di vista
operativo, al cosidetto metodo della nestra mobile o della stima a kernel, secondo il
quale in corrispondenza ad un pressato x IR si costruisce una classe ]x
h
2
; x+
h
2
[,
di ampiezza appunto h e, indicando con n
x
il numero delle osservazioni individuali che
cadono nella classe stessa, lapprossimazione di f(x) verr`a data dal rapporto n
x
/nh;
naturalmente iterando tale processo su tutto IR si perverr`a allapprossimazione

f(x)
di f(x). Generalizzando, si potrebbe dimostrare che

f(x) soddisfa la relazione:

f(x) =
1
nh
K(
x x
i
h
)
dove K, detta funzione kernel, `e la funzione indicatrice in ] 1/2; 1/2[ e pertanto
K(u) = 1 per 1/2 u < 1/2.
In pratica, si preferisce ricorrere a funzioni kernel che orano una migliore lisciatura
per

f(x); tra queste citiamo il kernel gaussiano, per cui K(u) = (2 )
1
exp u
2
/2.
Ovviamente, resta aperto, come nel caso dellapprossimazione mediante un istogram-
ma, il problema della scelta di h. A tal proposito la letteratura specialistica abbonda
di proposte di metodi analitici ed empirici; per dettagli si rimanda ancora ai testi di
Bowman, Azzalini (1997) e Wand, Jones (1995) ed alla bibliograa ivi citata.
In R `e possibile eseguire una siatta analisi ricorrendo alla funzione density, la cui
sintassi minima, supponendo che le osservazioni individuali del carattere continuo in
esame siano raccolte nelloggetto x, `e:
density(x)
che, ricorrendo per default ad una funzione kernel gaussiana, e visualizza alcune in-
formazioni circa la variabile di input, il valore proposto per h, nonche alcune misure
riassuntive sui 512 valori x e i corrispondenti valori di ordinata y =

f(x). Questi, in
particolare, possono essere estratti dalla lista creata dalla funzione stessa con i con-
sueti comandi density(x)$x e density(x)$y ed utilizzati per altri ni, ad esempio
la visualizzazione della funzione

f(x) mediante listruzione:
> plot(density(x)$x,density(x)$y)
Esempio 3.1.7 Riprendendo i dati relativi ai redditi e contenuti in stat3.txt:
> redditi<-read.table(file="stat3.txt")
> attach(redditi)
77
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
(a) 6 classi - modulo = 200 (a) 6 classi - modulo = 200
Classi di reddito Classi di reddito
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e
1000 1000 1400 1400 1800 1800 2200 2200
0
.
0
0
0
0
0
.
0
0
0
6
0
.
0
0
1
2
(b) 8 classi - modulo = 150 (b) 8 classi - modulo = 150
Classi di reddito Classi di reddito
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e
1000 1000 1400 1400 1800 1800 2200 2200
0
.
0
0
0
0
0
.
0
0
0
6
0
.
0
0
1
2
(c) 12 classi - modulo = 100 (c) 12 classi - modulo = 100
Classi di reddito Classi di reddito
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e
1000 1000 1400 1400 1800 1800 2200 2200
0
.
0
0
0
0
0
.
0
0
0
6
0
.
0
0
1
2
(d) 15 classi - modulo = 80 (d) 15 classi - modulo = 80
Classi di reddito Classi di reddito
F
r
e
q
u
e
n
z
e

r
e
l
a
t
i
v
e
1000 1000 1400 1400 1800 1800 2200 2200
0
.
0
0
0
0
0
.
0
0
0
6
0
.
0
0
1
2
Figura 3.5: Istogrammi della distribuzione dei redditi Esempio 3.2.2
la gura (3.5) riporta alcuni istogrammi per la variabile reddito costruiti ipotizzando quattro
diversi raccoglimenti in classi dei dati individuali; in particolare listogramma (c) suggerisce un
comportamento bimodale della distribuzione in esame, il che fa supporre di essere in presenza
di due diverse distribuzioni quanto a parametri di scala e, probabilmente, di variabilit`a.
Alle stesse conclusioni saremmo giunti eettuando una stima a kernel mediante la funzione
density; infatti il comportamento bimodale della distribuzione dei redditi viene evidenziato
dai graci riportati in gura (3.6), ottenuti mediante le istruzioni:
> par(mfrow=c(1,2)) 1
> plot(density(reddito),main="Kernel normale - h = 92.55",xlab="Reddito", 2
ylab="",col="red",cex.main=1,font.main=1,frame.plot=FALSE) 3
> hist(reddito,breaks=12,probability=TRUE,main="", 4
xlab="Classi di reddito",ylab="",col="light yellow",cex.main=1, 5
font.main=1,xlim=c(min(density(reddito)$x),max(density(reddito)$x))) 6
> lines(density(reddito)$x,density(reddito)$y,type="l",col="red") 7
> par(mfrow=c(1,1)) 8
78
E. D. Isaia, Linguaggio R e applicazioni statistiche
1000 1000 1500 1500 2000 2000
0
.
0
0
0
0
0
.
0
0
0
4
0
.
0
0
0
8
0
.
0
0
1
2
Kernel normale - h = 92.55 Kernel normale - h = 92.55
Reddito Reddito Classi di reddito Classi di reddito
1000 1000 1500 1500 2000 2000
0
.
0
0
0
0
0
.
0
0
0
4
0
.
0
0
0
8
0
.
0
0
1
2
Figura 3.6: Stima a kernel della distribuzione dei redditi Esempio 3.2.2
a commento delle quali, ci limitiamo ad osservare che, a parte alcune consuete opzioni di
formato (main="...", xlab="...", ..., frame.plot=...):
in riga [2] e [3] si richiede il graco di

f(x) nella forma plot(density(reddito)), in
alternativa a:
plot(density(reddito)$x,density(reddito)$y,type="l",...)
le righe [4], [5] e [6] consentono di visualizzare listogramma, articolato su 12 classi a
modulo costante, della variabile in esame, nellintervallo:
xlim=c(min(density(reddito)$x),max(density(reddito)$x))
in riga [7], inne, allistogramma viene sovraimposto il graco di

f(x).
Si noti che, in modo automatico, R propone quale valore per h:
> density(reddito)$bw
[1] 92.54717
Valori maggiori o minori di h produrrebbero, come emerge dai graci riportati in gura (3.7),
curve o troppo liscie o troppo aderenti alle osservazioni individuali.
79
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
500 500 1000 1000 1500 1500 2000 2000 2500 2500
0
.
0
0
0
0
0
.
0
0
0
5
0
.
0
0
1
0
0
.
0
0
1
5
Kernel normale - h = 200 Kernel normale - h = 200
Reddito Reddito
1000 1000 1400 1400 1800 1800 2200 2200
0
.
0
0
0
0
0
.
0
0
0
5
0
.
0
0
1
0
0
.
0
0
1
5
Kernel normale - h = 30 Kernel normale - h = 30
Reddito Reddito
Figura 3.7: Stime a kernel della distribuzione dei redditi Esempio 3.2.2
3.1.3 Su alcune misure di sintesi
Sulle principali funzioni statistiche, per cos` dire primitive, si `e gi`a detto in (1.2.5),
pertanto nel seguito aronteremo alcuni problemi specici che porteranno alla crea-
zione di funzioni ad hoc o allimpiego di particolari funzioni predenite.
La funzione stat.base
In molti casi, potrebbe essere di qualche utilit`a, perlomeno nella prima fase di descri-
zione di un carattere statistico quantitativo, disporre di una semplice funzione che,
a seconda del vettore di dati in ingresso, calcoli e visualizzi le principali misure di
posizione e di variabilit`a. Tale funzione, a cui daremo il nome stat.base, potrebbe
assumere la forma:
stat.base <-function(x,digits=4) 1
{ 2
n.oss<-length(x) 3
ris<-c(1:10) 4
ris[1]<-round(mean(x),digits) 5
ris[2]<-round(median(x),digits) 6
ris[3]<-round(quantile(x,0.25),digits) 7
80
E. D. Isaia, Linguaggio R e applicazioni statistiche
ris[4]<-round(quantile(x,0.75), digits) 8
ris[5]<-round(quantile(x,0.75)-quantile(x,0.25),digits) 9
ris[6]<-round(max(x)-min(x), digits) 10
ris[7]<-round(var(x)*(sum(x)-1)/(sum(x)),digits) 11
ris[8]<-round((var(x)*(sum(x)-1)/(sum(x)))^.5,digits) 12
ris[9]<-round(sum(x),digits) 13
ris[10]<-round(var(x)*(sum(x)-1),digits) 14
ris<-matrix(ris,ncol=1) 15
dimnames(ris)<-list(c("Media","Mediana:","I quartile:", 16
"III quartile:","Diff. Interquartile:","Range:","Varianza:", 17
"S.q.m.:","Somma:","Devianza"),"") 18
cat("Vettore dei dati individuali: ", deparse(substitute(x)), 19
"\nOsservazioni: ", n.oss, 20
"\n--------------------","\nStatistiche:","\n") 21
return(ris) 22
} 23
A commento, si osservi:
il ricorso alla denizione del vettore ris i, cui elementi sono ris[i] con eviden-
temente i = 1, 2, . . . , 10;
limpiego della funzione dimnames(ris) quale lista contenente le stringhe di
identicazione di ciascun risultato proposto;
luso della funzione deparse(substitute(x)) che fa apparire a anco delleti-
chetta "Vettore dei dati individuali:" il vero nome della variabile oggetto
di studio;
limpiego di round(oggetto,digits) dove, per default, si ha digits=4; situa-
zione che potrebbe essere modicata ricorrendo a stat(oggetto,digits=n),
con n intero positivo.
Esempio 3.1.8 Con riferimento alla sola variabile altezza contenuta in stat1.txt, il ricorso
alla funzione stat.base produrrebbe:
> stat1<-read.table(file="stat1.txt")
> attach(stat1)
> stat.base(altezza)
Vettore dei dati individuali: altezza
Osservazioni: 100
--------------------
Statistiche:
81
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Media 178.5150
Mediana: 178.7500
I quartile: 174.9750
III quartile: 182.8750
Diff. Interquartile: 7.9000
Range: 27.8000
Varianza: 36.8736
S.q.m.: 6.0724
Somma: 17851.5000
Devianza 658248.4568
> detach(stat1)

Le dierenze assolute medie


In R non `e implementata alcuna funzione che permetta il calcolo delle dierenze
assolute medie con (o senza) ripetizione, sicche lutente `e obbligato a ricorrere ad una
funzione creata ad hoc.
Ricordando che, operando sui dati individuali x

, = 1, 2, . . . n, le dierenze assolute
medie sono denite come:

R
=

n
=1

n
=1
|x

|
n
2
=

n
=1

n
=1
|x

|
n(n 1)
a seconda che esse siano, rispettivamente, con o senza ripetizione, a ni operativi sar`a
suciente calcolare la quantit`a posta a numeratore, la quale pu`o essere posta nella
forma:
1D1
t
(3.1)
dove D indica la matrice quadrata delle dierenze in modulo |x

|, cio`e:
D =
_

_
|x
1
x
1
| . . . |x
1
x

| . . . |x
1
x
n
|
. . . . . . . . . . . .
|x

x
1
| . . . |x

| . . . |x

x
n
|
. . . . . . . . . . . .
|x
n
x
1
| . . . |x
n
x

| . . . |x
n
x
n
|
_

_
mentre 1 `e un vettore riga ad elementi unitari.
Ci`o premesso, osservando che la (3.1) equivale al calcolo della somma degli elementi di
D ed ipotizzando che le n osservazioni individuali del carattere quantitaivo in esame
siano raccolte nelloggetto x, si possono impartire direttamente i comandi:
82
E. D. Isaia, Linguaggio R e applicazioni statistiche
x<-rbind(x) 1
s.dif<-sum(abs(matrix(outer(x,x,"-"),ncol(x),ncol(x)))) 2
s.dif/length(x)^2 3
s.dif/(length(x)*(length(x)-1)) 4
a commento dei quali osserviamo:
in riga [1] si ridenisce x quale vettore riga;
in riga [2] si procede al calcolo della (3.1), il cui risultato viene inserito nellog-
getto s.dif. Si noti che la matrice D viene individuata mediante la semplice
istruzione:
abs(matrix(outer(x,x,"-"),ncol(x),ncol(x)))
le righe [3] e [4] porgono, rispettivamente, le dierenze assolute medie con
ripetizione e senza ripetizione.
Esempio 3.1.9 Posto che x contenga gli interi consecutivi da 1 a 4, abbiamo:
> x<-rbind(1:4)
> s.dif<-sum(abs(matrix(outer(x,x,"-"),ncol(x),ncol(x))))
> s.dif/length(x)^2
[1] 1.25
> s.dif/(length(x)*(length(x)-1))
[1] 1.666667
In particolare:
> abs(matrix(outer(x,x,"-"),ncol(x),ncol(x)))
[,1] [,2] [,3] [,4]
[1,] 0 1 2 3
[2,] 1 0 1 2
[3,] 2 1 0 1
[4,] 3 2 1 0
> sum(abs(matrix(outer(x,x,"-"),ncol(x),ncol(x))))
[1] 20
come il Lettore pu`o facilmente vericare.
Qualora lutente non disponesse dei dati individuali x

, ma unicamente della distri-


buzione di frequenze {x
i
, n
i
}
i=1,2,...,k
del carattere quantitativo in esame, allora la
83
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
quantit`a posta a numeratore delle dierenze assolute medie con o senza ripetizione
risulterebbe:
k

i=1
k

j=1
|x
i
x
j
| n
i
n
j
e in tal caso si tratter`a di calcolare:
nDn
t
(3.2)
dove D indica la matrice quadrata, di dimensione k k, delle dierenze in modulo
|x
i
x
j
|, mentre n `e un vettore riga i cui k elementi corrispondono alle frequenze
assolute n
i
. Quindi, ipotizzando che gli oggetti xi e ni contengano, rispettivamente,
le k modalit`a quantitative del carattere in esame e le corrispondenti frequenze assolute,
si possono impartire direttamente i comandi:
> xi<-rbind(xi)
> ni<-rbind(ni)
> s.dif<-ni%*%abs(matrix(outer(xi,xi,"-"),ncol(xi),ncol(xi)))%*%t(ni)
> s.dif/sum(ni)^2
> s.dif/(sum(ni)*(sum(ni)-1))
Ci`o premesso, la funzione difemedie che segue si occupa del calcolo delle dierenze
assolute medie con e senza ripetizione e ci`o indipendentemente dal fatto che quale
input si immetta il solo vettore x delle osservazioni individuali oppure i due vettori, x
e ni contenenti, rispettivamente, le k modalit`a rilevate del carattere e le corrispondenti
frequenze assolute:
difmedie<-function(x,ni,decimali=4,print.out=TRUE) 1
{ 2
if (!is.matrix(x)){x<-rbind(x)} 3
if (missing(ni)){ni<-rep(1,length(x))} 4
if (!missing(ni) && !is.matrix(ni)){ni<-rbind(ni)} 5
s.dif<-ni%*%abs(matrix(outer(x,x,"-"),ncol(x),ncol(x)))%*%t(ni) 6
delta.cr<-s.dif/sum(ni)^2 7
delta.sr<-s.dif/(sum(ni)*(sum(ni)-1)) 8
if (print.out) 9
{ 10
cat(" Dif. medie CR -> ",round(delta.cr,decimali),"\n") 11
cat(" Dif. medie SR -> ",round(delta.sr,decimali),"\n") 12
} 13
invisible(list(D.cr=as.real(delta.cr),D.sr=as.real(delta.sr))) 14
} 15
84
E. D. Isaia, Linguaggio R e applicazioni statistiche
A commento della funzione proposta:
in riga [3] si controlla che loggetto in entrata sia un vettore; in caso contrario
si provvede alla sua trasformazione locale;
in riga [4], si crea, qualora non sia stato denito in modo esplicito, il vettore
unitario ni, mentre in riga [5], vericata lesistenza delloggetto in entrata ni
contenente le frequenze assolute, lo si trasforma, se `e il caso, in un vettore;
in riga [6] si procede al calcolo della (3.2), mentre le righe [7] e [8] si occupano
del calcolo delle dierenze assolute medie con ripetizione (delta.cr) e senza
ripetizione (delta.sr);
in riga [9] il controllo if (print.out) consente di visualizzare i risultati, a
patto che print.out=TRUE (situazione di default);
le righe [11] e [12] visualizzano i risulati desiderati;
in riga [14] viene creata una lista contenente i risultati che pu`o servire a visua-
lizzare, e se `e il caso utilizzare per successive elaborazioni, uno dei due oggetti
delta.cr o delta.cr.
Esempio 3.1.10 A puro scopo didattico, si immagini che da unindagine eettuata su 60
automobilisti italiani, al ne di indagare circa il numero di infrazioni al Codice della Strada
commesse nel corso dellanno corrente, risultino i seguenti valori individuali:
0 1 0 0 4 4 0 7 0 1 0 0 0 1 1 0 2 0 0 0
1 0 3 1 0 4 0 0 1 0 2 0 3 0 0 0 0 0 0 0
0 0 0 3 0 1 0 0 2 0 0 0 1 0 0 4 0 0 1 0
Denito loggetto x contenente le 60 osservazioni e sfruttando la funzione difemedie, abbiamo:
> x<-c(0,1,0,0,4,4,0,7,0,1,0,0,0,1,1,0,2,0,0,0,1,0,3,1,0,4,0,0,1,0,
2,0,3,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,2,0,0,0,1,0,0,4,0,0,1,0)
> difmedie(x)
Dif. medie CR -> 1.2367
Dif. medie SR -> 1.2576
Dal momento che la distribuzione di frequenze del carattere in esame `e:
> table(x)
x
0 1 2 3 4 7
39 10 3 3 4 1
85
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
saremmo giunti agli stessi risultati denendo gli oggetti xi e ni contenenti le k = 6 modalit`a
del carattere e le corrispondenti frequenze assolute, infatti:
> (xi<-sort(unique(x)))
[1] 0 1 2 3 4 7
> (ni<-as.real(table(x)))
[1] 39 10 3 3 4 1
> difmedie(xi,ni)
Dif. medie CR -> 1.2367
Dif. medie SR -> 1.2576
Si noti che, desiderando visualizzare unicamente la dierenza assoluta media con ripetizione,
potremmo, a questo punto, impartire indierentemente i comandi:
> difmedie(x,print.out=FALSE)$D.cr
[1] 1.236667
> difmedie(xi,ni,print.out=FALSE)$D.cr
[1] 1.236667
ottenendo, coerentemente, gli stessi risultati.
Sulla straticazione
Come gi`a si osserv`o, a volte capita che le n osservazioni individuali di un carattere
possano essere ripartite in pi` u gruppi (o strati) a seconda dalle modalit`a assunte
da una variabile di straticazione.
Nel seguito vedremo come sia possibile, qualora di operi con un carattere quantitativo,
ottenere le pi` u comuni misure di posizione e di variabilit`a per ciascun strato. A tal ne,
per scioltezza espositiva, supporremo che le n osservazioni individuali del carattere
in esame siano raccolte nelloggetto x e che flag contenga le k n modalit`a, non
necessariamente numeriche, della variabile di straticazione.
Un primo modo di procedere consiste ovviamente nel creare, ricorrendo al comando
split, tante nuove variabili quante indicato dalla variabile di straticazione e su
ciascuna di esse applicare la funzione statistica di interesse.
Agli stessi risutlati, ma in modo pi` u elegante, si pu`o giungere sfruttando le funzioni
tapply o sapply, le cui sintassi, perlomeno nella veste pi` u dimessa, si presentano:
tapply(x,flag,funzione)
sapply(split(x,flag),funzione)
dove funzione `e, in linea di massima, una qualsiasi funzione predenita o eventual-
mente denita dallutente.
Un terzo modo di risolvere il problema consiste nel ricorso alla funzione aggregate,
la cui sintassi minima `e:
86
E. D. Isaia, Linguaggio R e applicazioni statistiche
aggregate(x,list(flag),funzione)
la quale, sfruttando la funzione tapply, porge i risultati desiderati in forma tabellare.
Lesempio che segue illustra i tre diversi approcci teste descritti.
Esempio 3.1.11 A puro scopo didattico, si immagini che su un un collettivo costituito 14 stu-
denti universitari, di cui 8 di sesso maschile, si sia rilevato il voto conseguito ad un particolare
esame di protto; deniti gli oggetti elementari:
voto<-c(23,27,27,30,25,20,27,27,18,27,27,30,30,23)
sesso<-c("M","M","M","M","M","M","M","M","F","F","F","F","F","F")
aggregate(stat,list(sex),mean)
ci proponiamo di calcolare il voro medio in funzione del sesso:
introducendo due nuove varibili:
> (femmine<-split(voto,sesso)$"F")
[1] 18 27 27 30 30 23
> (maschi<-split(voto,sesso)$"M")
[1] 23 27 27 30 25 20 27 27
> mean(femmine)
[1] 25.83333
> mean(maschi)
[1] 25.75
ricorrendo alla funzione tapply:
> tapply(voto,sesso,mean)
F M
25.83333 25.75000
per cui il voto medio dei maschi `e:
> as.real(tapply(voto,sesso,mean)[2])
[1] 25.75
sfruttando la funzione sapply:
> sapply(split(voto,sesso),mean)
F M
25.83333 25.75000
per cui il voto medio delle femmine risulta:
> as.real(sapply(split(voto,sesso),mean)[1])
[1] 25.83333
87
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
ricorrendo alla funzione aggregate:
> aggregate(voto,list(sesso),mean)
Group.1 x
1 F 25.83333
2 M 25.75000
per cui il voto medio dei maschi `e:
> as.real(aggregate(voto,list(sesso),mean)[2,2])
[1] 25.75

Sui valori mancanti


Se un oggetto contiene valori mancanti, classicati come NA (acronimo di Not Avai-
lable) lapplicazione delle funzioni statistiche comporta alcuni problemi poiche essi,
per default, vengono conteggiati in length(oggetto). In eetti le funzioni in que-
stione tengono conto della possiblit`a di escludere i valori mancanti; ad esempio la
funzione mean `e denita:
mean<-function(x,na.rm=FALSE)
{
if(na.rm) {x<-x[!is.na(x)]}
else if(any(is.na(x))) {return(NA)}
sum(x)/length(x)
}
sicche `e suciente modicare la situazione di default na.rm=FALSE in na.rm=TRUE.
Ad esempio:
> x<-c(NA,12,NA,14,15,17,21)
> mean(x)
[1] NA
> mean(x,na.rm=TRUE)
[1] 15.8
Nel seguito proponiamo due semplici alternative che a nostro avviso permettono un
maggior controllo dei valori mancanti.
Le funzioni off.na(x) e rep.na(x) consentono di modicare un oggetto che presenta
elementi mancanti (NA). La prima funzione si limita ad eliminarli, mentre la seconda
sostituisce tali valori con il valor medio o, a discrezione dellutente, con la mediana di
x. *** Per comodit`a i nuovi valori in uscita sono messi negli oggetti w.off e w.rep
rispettivamente. I listati delle due funzioni sono:
88
E. D. Isaia, Linguaggio R e applicazioni statistiche
off.na<-function(x){x<-x[!is.na(x)]} 1
Cos` ad esempio:
> x<-c(NA,12,NA,14,15,17,21)
> mean(off.na(x))
[1] 15.8
rep.na<-function(x, media=TRUE) 1
{ 2
if (!media){valore<-median(x[!is.na(x)])} 3
else {valore<-mean(x[!is.na(x)])} 4
for (i in (1:length(x))){if (is.na(x[i])==TRUE) {x[i]<-valore}} 5
x<-x 6
} 7
> rep.na(x)
The new w.rep object has been created
> w.rep
[1] 15.8 12.0 15.8 14.0 15.0 17.0 21.0
> rep.na(x,media=FALSE)
The new w.rep object has been created
> w.rep
[1] 15 12 15 14 15 17 21
3.1.4 Sulla concentrazione
3.2 Mutabili e variabili statistiche bivariate
3.2.1 Tabelle di frequenze doppie
3.2.2 Lindice di dipendenza chi-quadro
3.2.3 Lindice di dipendenza in media
3.2.4 Sulla correlazione lineare
Esempio 3.2.1 Con riferimento alle variabili qualitative contenute in stat4.dat, ci propo-
niamo di costruire la distribuzione congiunta del titolo di studio (studio) e della posizione
professionale (posizio) dei 50 individui intervistati. Acquisiti i dati mediante le consuete
istruzioni:
> esempio4<-read.table(file="stat4.txt")
> names(esempio4)
89
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
[1] "studio" "posizio" "sex"
> attach(esempio4)
la distribuzione congiunta di frequenze assolute desiderata la si ottiene mediante listruzione:
> table(studio,posizio)
posizio
studio 0 1 2
0 10 1 1
1 6 14 1
2 0 10 3
3 0 1 3
Desiderando migliorare la leggibilit`a della tabella proposta, possiamo ricorrere ai comandi
array() e dimnames(); infatti, impartite le istruzioni:
>tutti<-array(table(studio,posizio),c(length(unique(studio)),
length(unique(posizio))))
> dimnames(tutti)<-list(studio = c("L.Elem.", "M.Sup.", "Dipl.",
"Laurea"),posizio = c("Operaio", "Impiegato", "Quadro"))
L.Elem. L.Elem.
M.Sup. M.Sup.
Dipl. Dipl.
Laurea Laurea
Titolo di studio Titolo di studio
Operaio Operaio
Impiegato Impiegato Quadro Quadro
Posizione professionale Posizione professionale
Figura 3.8: Diagrammi a torta Esempio 3.1.1
otteniamo la seguente tabella:
90
E. D. Isaia, Linguaggio R e applicazioni statistiche
> tutti
posizio
studio Operaio Impiegato Quadro
L.Elem. 10 1 1
M.Sup. 6 14 1
Dipl. 0 10 3
Laurea 0 1 3
di cui in gura (3.8) riportiamo i diagrammi delle rispettive distribuzioni marginali.
Esempio 3.2.2 Con riferimento alla situazione di cui allEsempio 3.2.1, ci proponiamo di
individuare le distribuzioni congiunte i frequenze assolute del titolo di studio (studio) e della
posizione professionale (posizio) condizionatamente al sesso.
A tal ne (cfr. Esempio 3.1.4) possiamo ricorrere al comando split(variabile,flag); le
istruzioni:
> studio.f<-split(matrice[,1],matrice[,3])$"0"
> studio.m<-split(matrice[,1],matrice[,3])$"1"
> posizio.f<-split(matrice[,2],matrice[,3])$"0"
> posizio.m<-split(matrice[,2],matrice[,3])$"1"
ci consentono, infatti, di generare le seguenti due tabelle
> table(studio.m,posizio.m)
posizio.m
studio.m 0 1 2
0 7 1 1
1 2 7 0
2 0 5 1
3 0 0 2
> table(studio.f,posizio.f)
posizio.f
studio.f 0 1 2
0 3 0 0
1 4 7 1
2 0 5 2
3 0 1 1
Anche in questo caso (cfr. Esempio 3.2.1) possiamo migliorare la leggibilit`a delle tabella
ricorrendo ai comandi array() e dimnames(); tuttavia ci pare utile disporre di una sola lista,
che chiameremo ms.sex, contenente le tabelle in esame sottoforma di matrice. A tal ne:
creiamo loggetto ms.sex i cui elementi sono le frequenze assolute delle distribuzioni
congiunte table(studio.m,posizio.m) e table(studio.m,posizio.m); cio`e:
> ms.sex<-c(c(table(studio.m,posizio.m)),c(table(studio.f,posizio.f)))
91
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
trasformiamo loggetto ms.sex in array(), con dimensioni pari al numero delle moda-
lit`a di ciascuna m.s. considerata, mediante listruzione:
> ms.sex<-array(ms.sex,dim=c(length(unique(studio)),
length(unique(posizio)),length(unique(sex)))
miglioriamo la leggibilit`a della matrice attribuendo le appropriate etichette alla sue
modalit`a con il comando:
> dimnames(ms.sex)<-list(studio = c("L.Elem.","M.Sup.","Dipl.",
"Laurea"),posizio = c("Operaio","Impiegato","Quadro"),
sesso =c("Maschi","Femmine"))
In denitiva in ms.sex avremo:
> ms.sex
, , sesso = Maschi
posizio
studio Operaio Impiegato Quadro
L.Elem. 7 1 1
M.Sup. 2 7 0
Dipl. 0 5 1
Laurea 0 0 2
, , sesso = Femmine
posizio
studio Operaio Impiegato Quadro
L.Elem. 3 0 0
M.Sup. 4 7 1
Dipl. 0 5 2
Laurea 0 1 1
Osservazione 3.2.1 Desiderando estrarre, per ulteriori elaborazioni, le distribuzioni con-
giunte condizionate alla mutabile sesso, possiamo ricorrere ai consueti comandi, ricordando
che ms.sex `e un array a tre dimensioni; ad esempio:
> ms.sex.maschi<-ms.sex[,,sesso="Maschi"]
> ms.sex.femmine<-ms.sex[,,sesso="Femmine"]

Esempio 3.2.3 Con riferimento alla situazione descritta agli Esempi 3.2.1 e 3.2.2, ci propo-
niamo ora il calcolo, per ciascuna delle due distribuzioni congiunte presenti in ms.sex, del-
lindice di dipendenza globale
2
del Pearson nonche dellindice normalizzato V del Cramer,
deniti, con ovvio signicato dei simboli:

2
=
r

i=1
r

i=1
(n
ij
n
2
ij
)
n
2
ij
V =
_

2
Max(
2
)
_
0.5
=
_

2
inf [n(r 1); n(s 1)]
_
0.5
92
E. D. Isaia, Linguaggio R e applicazioni statistiche
A tal ne, possiamo creare una funzione ad hoc, di nome ad esempio chi.sqr, che potr`a
assumere la forma:
chi.sqr<-function(x,decimali=4,print.out=TRUE) 1
{ 2
if (!is.matrix(x)){ 3
stop("X ust be a matrix")} 4
rig.tot<-apply(x, 1, sum) 5
col.tot<-apply(x, 2, sum) 6
tot<-sum(col.tot) 7
Teor<- outer(rig.tot, col.tot, "*")/sum(x) 8
Teor.out<-round(Teor,decimali) 9
C<-round(x-Teor,decimali) 10
Chi<-round(sum((x-Teor)^2/Teor),decimali) 11
VCr<-round(Chi/(min(c(tot*(nrow(x)-1),tot*(ncol(x)-1)))),decimali) 12
if (print.out) 13
{ 14
cat("X =", Chi, "\n") 15
cat("V =", VCr, "\n") 16
} 17
invisible(list(chi.sq=Chi,V=VCr,teorici=Teor.out,cont=C)) 18
} 19
A commento:
input della funzione `e un oggetto con struttura di matrice; in caso contrario (riga [3] e
[4]) viene visualizzato un messaggio di errore. Si noti il valore di default attribuito alla
variabile logica print.out;
i comandi in riga [5], [6] e [7] si calcolano le somme di riga, di colonna nonche la somma
totale;
il comando outer(rig.tot, col.tot, "*")/sum(x) calcola la matrice delle frequenze
teoriche (Teor);
le righe [9] e [10] calcolano la matrice delle frequenze teoriche (Teor.out) e la matrice
delle contingenze (C.out) che verranno inserite nella lista dei risultati in uscita;
le righe [11] e [12] si occupano del calcolo dei due indici richiesti;
in riga [13] il controllo if (print.out) consente di procedere alla visualizzazione (in
riga [15] e [16]) dei risultati, a patto che print.out=TRUE; in riga [18] si crea, non
visualizzandola, una lista che contiene i due indici richiesti, la matrice delle matrice
delle frequenze teoriche e la matrice delle contingenze.
Osservazione 3.2.2 Si noti che nella funzione chi.sqr proposta non si `e fatto ricorso ad
alcun ciclo di calcolo iterativo.
Tornando al problema postoci, abbiamo:
93
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> x.m<-taglio[,,sesso="Maschi"]
> x.f<-taglio[,,sesso="Femmine"]
> chi.sqr(x.m)
X = 25.2623
V = 0.4858
> chi.sqr(x.f)
X = 12.8407
V = 0.2675
Desiderando visualizzare il contenuto della lista in uscita dalla funzione chi.sqr, `e suciente
digitare print(chi.sqr() o print(chi.sqr(...,print.out=FALSE))). Qualora si desideri
estrarre alcuni risultati per successive elaborazioni si `e obbligati ad assegnare loutput di
chi.sqr ad una nuova variabile (di tipo list) e successivamente da questa estrarre gli oggetti
di interesse; ad esempio:
> contingenze.m<-chi.sqr(x.m,print.out=FALSE)$cont
> contingenze.m
posizione
studio Operaio Impiegato Quadro
L.Elem. 3.8846 -3.5 -0.3846
M.Sup. -1.1154 2.5 -1.3846
Dipl. -2.0769 2.0 0.0769
Laurea -0.6923 -1.0 1.6923

Esempio 3.2.4 Larchivio stat5.dat contiene il numero, espresso in migliaia di unit`a, de-
gli occupati totali e suddivisi per sesso in Italia negli anni 1982 1990; come di consueto
acquisiamo tali dati mediante le istruzioni:
> esempio5<-read.table(file="stat5.txt")
> names(esempio5)
[1] "tempo" "maschi" "femmine" "mf"
> attach(esempio5)
Volendo in qualche modo evidenziare leventuale diversit`a della dinamica del fenomeno in
esame, conviene ragionare, pi` u che in valori assoluti, in termini di numeri indice a base ssa.
A tal ne trasformiamo le serie maschi femmine e mf nelle corrsipondenti serie di numeri
indice percentuali, ponendo quale base la situazione dellanno iniziale, mediante i comandi:
> ind.m<-(maschi/maschi[1])*100
> ind.f<-(femmine/femmine[1])*100
> ind.mf<-(mf/mf[1])*100
In gura (3.9) `e evidenziato landamento delle tre serie sia in termini di valori assoluti sia in
termini di numeri indici, in base al quale si nota una esplosione delloccupazione femminile.
Per inciso, che il numero degli occupati di sesso femminile `e aumentato, nei nove anni
considerati, del 12.7%, mentre quello dei maschi rimasto allincirca costante; infatti:
94
E. D. Isaia, Linguaggio R e applicazioni statistiche
1982 1982 1984 1984 1986 1986 1988 1988 1990 1990
5
0
0
0
1
0
0
0
0
1
5
0
0
0
2
0
0
0
0
2
5
0
0
0
(a) - Valori assoluti (a) - Valori assoluti
anni anni
Femmine Femmine
Maschi Maschi
Entrambi Entrambi
1982 1982 1984 1984 1986 1986 1988 1988 1990 1990
1
0
0
1
0
2
1
0
4
1
0
6
1
0
8
1
1
0
1
1
2
(b) - Numeri indice (base 1982) (b) - Numeri indice (base 1982)
anni anni
Femmine Femmine
Maschi Maschi
Entrambi Entrambi
Figura 3.9: Occupazione italiana nel periodo 1982-1990 Esempio 3.2.4
> ind.f[length(ind.f)]-100
[1] 12.70693
> ind.m[length(ind.m)]-100
[1] -0.1288568
Procedendo, ci pare corretto adottare, per ciascuna serie di numeri indice, un modello inter-
polante del tipo y
i
= a
0
+ a
1
t
i
, con i = 1, 2, . . . , n, dove, ricorrendo al metodo dei minimi
quadrati:
a
1
=
Cov(T, Y )

2
T
a
0
=
Y
a
1

T
Possiamo, dunque, ricorrere
3
ai comandi cov(x,y) e var(x):
> n<-length(tempo)
> a1<-cov(ind.m,tempo)*((n-1)/n)/var(tempo)*((n-1)/n)
> a0<-mean(ind.m)-a1*mean(tempo)
> a0
[1] 208.1988
> a1
[1] -0.05458331
3
Si rammenta che, come nel caso del calcolo della varianza (cfr Osservazione??), la covarianza tra
due o pi` u v.s. viene calcolata ponendo a denominatore n 1 in luogo di n.
95
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
s` che il modello interpolante a minimi quadrati risulta
Maschi
y
i
= 208.1988 0.0546 t
i
.
Operando in modo analogo per le altre serie di numeri indici otteniamo:
Femmine
y
i
= 2771.763 + 1.4488 t
i
Femmine+Maschi
y
i
= 740.4797 + 0.4240 t
i
I valori teorici in base ai modelli sono stati raccolti nel vettori modello.m, modello.f e
modello.mf ottenuti mediante le semplici istruzioni:
> a1<-cov(ind.m,tempo)*((n-1)/n)/var(tempo)*((n-1)/n)
> a0<-mean(ind.m)-a1*mean(tempo)
> modello.m<-a0+a1*tempo
> a1<-cov(ind.f,tempo)*((n-1)/n)/var(tempo)*((n-1)/n)
> a0<-mean(ind.f)-a1*mean(tempo)
> modello.f<-a0+a1*tempo
> a1<-cov(ind.mf,tempo)*((n-1)/n)/var(tempo)*((n-1)/n)
> a0<-mean(ind.mf)-a1*mean(tempo)
> modello.mf<-a0+a1*tempo
Per completezza, in gura (3.10) `e riportato landamento delle tre rette interpolanti.
Osservazione 3.2.3 I passi necessari ai ni della costruzione del graco proposto in gura
(3.10) sono stati:
introduzione della variabile yrange che denisce il campo di variazione (a, b) dei valori
in ordinata:
> a<-min(min(ind.f),min(ind.m),min(ind.mf))
> b<-max(max(ind.f),max(ind.m),max(ind.mf))
> yrange<-c(a,b)
> rm(a,b)
costruzione del graco di base vuoto (opzione type="n") con suddivisione (opzione
ylim=) dellasse delle ordinate in accordo ai valori posti in yrange, munito di titolo
(opzione main=) e etichette per lasse delle ascisse (opzione xlab=) e quello delle ordinate
(opzione ylab=):
> plot(tempo,modello.m,,type="n",ylim=yrange,
xlab="anni",ylab="",main="(b) - Numeri indice (base 1982)")
rappresentazione delle coppie di punti (

Y , t) con i comandi:
> points(tempo,modello.m,col="red")
> points(tempo,modello.f,col="black")
> points(tempo,modello.mf,col="blue")
96
E. D. Isaia, Linguaggio R e applicazioni statistiche
1982 1982 1984 1984 1986 1986 1988 1988 1990 1990
1
0
0
1
0
2
1
0
4
1
0
6
1
0
8
1
1
0
1
1
2
(b) - Numeri indice (base 1982) (b) - Numeri indice (base 1982)
anni anni
Femmine Femmine
Maschi Maschi
Femmine+Maschi Femmine+Maschi
Figura 3.10: Occupazione italiana nel periodo 1982-1990 Esempio 3.2.4
rappresentazione delle tre rette interpolanti ricorrendo alla funzione lines(x,y); per
migliorarne la leggibilit`a impieghiamo altrettanti tipi di tratteggio (opzione lty=). I
comandi impartiti sono:
> lines(tempo,modello.m,col="red",lty=3)
> lines(tempo,modello.f,,col="black",lty=1)
> lines(tempo,modello.mf,,col="blue",lty=5)
introduzione della variabile testo, contenente il testo della legenda, e visualizzazione
della legenda stessa a partire dai punti di coordinate indicati in coord.leg:
> coord.leg<-c(min(tempo),max(ind.f))
> testo<-c("Femmine","Maschi","Femmine+Maschi")
> legend(coord.leg,legend=testo,col=seq(testo),lty = c(1,3,5))
`
E superuo osservare che la maggior parte dei comandi presentati potrebbere essere inserita
in una funzione ad hoc, s` da automatizzare le procedure.
97
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Esempio 3.2.5 Con riferimento alle due variabili contenute in stat6.dat, che acquisiamo
mediante i consueti comandi:
> esempio6<-read.table(file="stat6.txt")
> names(esempio6)
[1] "mate" "stat"
> attach(esempio6)
pu`o essere interessante evidenziare ed analizzare leventuale legame di dipendenza tra le v.s.
Y =voto conseguito in Statistica e X =voto di ottenuto in Matematica.
A tal ne, iniziamo con la presentazione della distribuzione congiunta delle v.s. in esame, che,
come di consueto, otteniamo ricorrendo al comando table(); pertanto:
> table(mate,stat)
stat
mate 18 19 20 21 22 23 25 26 27 29 30
18 2 0 1 0 0 0 0 0 0 0 0
19 0 0 1 1 0 1 0 0 0 0 0
20 0 1 3 0 0 1 0 0 0 0 0
21 0 0 0 1 1 1 0 0 0 0 0
23 0 0 1 1 0 1 2 0 0 0 0
25 0 0 1 0 0 0 2 0 1 0 0
26 0 0 0 0 0 0 1 0 4 0 0
27 0 0 0 0 0 0 0 1 3 0 1
28 0 0 0 0 0 0 0 0 1 1 1
30 0 0 0 0 0 0 0 0 0 1 3
`
E suciente una rapida lettura della tabella per accorgersi di una dipendenza (in senso
statistico) tra le variabili oggetto di studio. A tal proposito
4
:
> chi.sqr(table(mate,stat))
X = 129.637
V = 0.3601
Anzi, la circostanza che buona parte delle frequenze osservate giaccia sulla diagonale principale
pu`o indurci a ritenere il legame di dipendenza positivo e di tipo, approssimativamente, lineare.
Per sincerarsene, possiamo costruire un semplice diagramma a dispersione tra le variabili
originarie mate e stat oppure ricorrere ad un diagramma a dispersione dei voti medi di
Statistica condizionati a ciascun voto riportato in Matematica.
Prima di presentare i risultati, occupiamoci del calcolo delle medie della v.s. condiziona-
ta Y |X, in simboli
Y |X=xi
. A tale scopo, ricorriamo alla ormai nota funzione split() e
successivamente al nuovo comando
5
sapply(). In particolare:
4
Si tratta dell funzione presentata allEsempio 3.2.3.
5
Il cui comportamento `e simile a quello dei comandi apply() e tapply(). Argomenti sonologgetto
su cui operare e la funzione che si desidera applicare.
98
E. D. Isaia, Linguaggio R e applicazioni statistiche
deniamo loggetto stat.m che conterr`a, sottoforma di lista, i voti di Statistica in
corrispondenza a ciascuna modalit`a (o livello) del voto di Matematica;
calcoliamo le medie di ciascun oggetto contenuto in stat.m, cio`e le medie condizio-
nate
Y |X=xi
, con il comando sapply(stat.m,mean); i risultati, utili per successive
elaborazioni, verranno inseriti nel nuovo oggetto medie.cond.
18 18 20 20 22 22 24 24 26 26 28 28 30 30
1
8
2
0
2
2
2
4
2
6
2
8
3
0
Voti di Matematica Voti di Matematica

V
o
t
i

m
e
d
i

d
i

S
t
a
t
i
s
t
i
c
a
Figura 3.11: Medie condizionate e spezzata di regressione Esempio 3.2.5
Ci`o premesso, le istruzioni
6
:
> stat.m<-split(stat, mate)
> media.cond<-round(sapply(stat.m, mean),4)
In denitiva le medie condizionate
Y |X=xi
, espresse a solo due decimali, risultano:
> round(media.cond,2)
18 19 20 21 23 25 26 27 28 30
18.67 21.33 20.40 22.00 22.80 24.25 26.60 27.40 28.67 29.75
A questo punto possiamo procedere alla costruzione di un diagramma a dispersione dove
rappresenteremo le coppie (x
i
,
Y |X=xi
); le istruzioni:
6
Sarebbe suciente la sola istruzione: medie.cond<-sapply(split(stat, mate), mean).
99
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> plot(unique(sort(mate)),media.cond,type="p",cex=2.5,pch=20,col="red",
frame.plot=FALSE,ann=FALSE,cex.main=1,font.main=1,ylim=c(18,30))
> lines(unique(sort(mate)),media.cond,col="blue")
> title(main="",xlab="Voti di Matematica",ylab=" Voti medi di Statistica")
porgono il graco riportato in gura (3.11).
A questo punto, evidenziata lesistenza, perlomeno gracamente, di un legame lineare tra
le variabili considerate possiamo quantizzarla. Innanzitutto possiamo procedere al calcolo
del coeciente di correlazione lineare del Pearson () che a occhio dovr`a risultare prossimo
allunit`a
7
; infatti abbiamo:
> (rho<-cor(stat,mate))
[1] 0.9052952
18 18 20 20 22 22 24 24 26 26 28 28 30 30
1
8
2
0
2
2
2
4
2
6
2
8
3
0
Voti di Matematica Voti di Matematica

V
o
t
i

m
e
d
i

d
i

S
t
a
t
i
s
t
i
c
a
Figura 3.12: Retta di regressione Esempio 3.2.5
7
Nel caso di adozione di un modello lineare esso viene a coincidere, com`e noto, con il coeciente
di determinazione.
100
E. D. Isaia, Linguaggio R e applicazioni statistiche
Inoltre possiamo individuare i parametri della retta di regressione y
i
= a
0
+a
1
x
i
. Ricordando
che:
a
1
=
Cov(X, Y )

2
X
=

Y

X
a
0
=
Y
a
1

X
le istruzioni:
> a1<-rho*sqrt(var(stat))/sqrt(var(mate))
> a0<-mean(stat)-a1*mean(mate)
> modello<-a0+a1*mate
porgono:
> a1
[1] 0.9078971
> a0
[1] 2.605864
s` che la retta di regressione viene ad assumere la forma y
i
= 2.6059 + 0.9079 x
i
, il cui
andamento `e riportato in gura (3.12), ottenuto mediante le istruzioni:
> plot(unique(sort(mate)),media.cond,type="p",cex=2.5,pch=20,col="red",
frame.plot=FALSE,ann=FALSE,cex.main=1,font.main=1,ylim=c(18,30))
lines(mate,modello,col="blue")

Esempio 3.2.6 Si immagini di avere rilevato, su gruppo di n = 10 autovetture europee


medio-piccole ad alimentazione a benzina, la cilindrata (x
1
), la potenza espressa in CV-Din
(x
2
), la velocit`a massima dichiarata (x
3
) ed il consumo di carburante (x
4
), ottenendo i risultati
che seguono:
x
1
1100 1200 1000 1300 1400 1000 1100 1200 1400 1250
x
2
45 54 45 50 60 45 50 54 70 60
x
3
135 145 140 140 150 140 140 145 165 155
x
4
5 5.5 4.8 6.2 6.7 5 4.8 5.2 6.7 6.2
Denito
8
il data frame auto, contenente tutte le informazioni:
> x1<-cbind(c(11, 12, 10, 13, 14, 10, 11, 12, 14, 12)*100)
> x2<-cbind(c(45, 54, 45, 50, 60, 45, 50, 54, 70, 60))
> x3<-cbind(c(135, 145, 140, 140, 150, 140, 140, 145, 165, 155))
> x4<-cbind(c(5, 5.5, 4.8, 6.2, 6.7, 5, 4.8, 5.2, 6.7, 6.2))
8
Meno elegantemente avremmo potuto denire la matrice X<-cbind(x1,x2,x3,x4) ed operare su
di essa attribuendo nomi appropriati ai suoi vettori colonna.
101
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> (auto<-data.frame(Cilindrata=x1,CV.Din=x2,Vel.max=x3,Consumo=x4))
Cilindrata CV.Din Vel.max Consumo
1 1100 45 135 5.0
2 1200 54 145 5.5
3 1000 45 140 4.8
4 1300 50 140 6.2
5 1400 60 150 6.7
6 1000 45 140 5.0
7 1100 50 140 4.8
8 1200 54 145 5.2
9 1400 70 165 6.7
10 1200 60 155 6.2
calcoliamo la matrice dei coecienti di correlazione lineare tramite il semplice comando
9
:
> round(cor(auto),4)
Cilindrata CV.Din Vel.max Consumo
Cilindrata 1.0000 0.8305 0.6889 0.9194
CV.Din 0.8305 1.0000 0.9637 0.8282
Vel.max 0.6889 0.9637 1.0000 0.7661
Consumo 0.9194 0.8282 0.7661 1.0000
Per avere unidea globale delle relazioni tra le variabili conteute in auto, possiamo pensare di
creare i diagrammi a dispersione tra tutte le 4
2
4 = 12 combinazioni delle variabili oggetto
di studio. Ci`o pu`o essere attuato ricorrendo alla funzione pairs(). Tuttavia desiderando
migliorare la situazione di default, scegliamo di:
rappresentare sulla diagonale principale gli istogrammi delle variabili x1,x2,x3 e x4; a
tal ne ricorriamo alla funzione panel.hist presentata in 2.1.12;
visualizzare, nelle celle a destra della diagonale principale, i diversi coecienti di cor-
relazione lineare; a tal ne consideriamo la nuova funzione:
panel.cor <- function(x, y, digits=2,pch=20)
{
par(usr = c(0, 1, 0, 1))
r <- cor(x, y)
txt <- paste(format(r, digits=digits),sep="")
text(0.5, 0.5, txt, cex = 2)
}
A questo punto il comando:
> pairs(auto,pch = 20,diag.panel=panel.hist,upper.panel=panel.cor)
9
Si osservi che stiamo operando sullintero data frame e non sui suoi singoli componenti, per il
momento non disponibili (cfr. paragrafo 1.4.2).
102
E. D. Isaia, Linguaggio R e applicazioni statistiche
Cilindrata Cilindrata
45 45 50 50 55 55 60 60 65 65 70 70
0.83 0.83 0.69 0.69
5.0 5.0 5.5 5.5 6.0 6.0 6.5 6.5
1
0
0
0
1
2
0
0
1
4
0
0
0.92 0.92
4
5
5
5
6
5CV-Din CV-Din
0.96 0.96 0.83 0.83
Vel. max. Vel. max.
1
3
5
1
4
5
1
5
5
1
6
5
0.77 0.77
1000 1000 1200 1200 1400 1400
5
.
0
5
.
5
6
.
0
6
.
5
135 135 145 145 155 155 165 165
Consumo Consumo
Figura 3.13: Matrice dei diagrammi a dispersione Esempio 3.2.6
porge il graco riportato in gura (3.13). Lasciamo al Lettore la verica sul campo del
comando:
> pairs(auto,pch = 20,diag.panel=panel.hist,lower.panel=panel.cor)

Esempio 3.2.7 A volte capita, nel caso di analisi di una variabile statistica doppia, di di-
sporre non gi`a dei singoli dati individuali, bens` degli stessi raccolti in distribuzione congiunta
di frequenze. In tali situazioni `e sempre possibile procedere ad analisi statistiche dei dati in
R, purche questi vengano acquisiti in modo corretto.
Distinguiamo i casi:
abbiamo a disposizione una tabella a doppia entrata per due caratteri qualitativi, ad
esempio:
103
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
m.s. B b
1
b
2
m.s. A
a
1
200 150
a
2
400 100
a
3
100 250
I dati potranno essere correttamente acquisiti in R tramite le istruzioni:
> ms.AB<-array(c(200,400,100,150,100,250),dim=c(3,2))
> dimnames(ms.AB)<-list(A = c("a1", "a2", "a3"),B = c("b1", "b2"))
infatti:
> ms.AB
B
A b1 b2
a1 200 150
a2 400 100
a3 100 250
abbiamo a disposizione una tabella a doppia entrata per due caratteri quantitativi, ad
esempio:
v.s. Y 0 1
v.s. X
0 10 20
1 30 10
I dati potranno essere correttamente acuisiti in R tramite le istruzioni:
> vs.XY<-array(c(10,30,20,10),dim=c(2,2))
> vs.XY
> vs.XY
Y
X 0 1
0 10 20
1 30 10
e, per ulteriori elaborazioni:
> XY<-array(c(0,0,1,1,0,1,0,1,10,20,30,10),dim=c(4,3))
> XY
[,1] [,2] [,3]
[1,] 0 0 10
[2,] 0 1 20
[3,] 1 0 30
[4,] 1 1 10
104
E. D. Isaia, Linguaggio R e applicazioni statistiche

Esempio 3.2.8 Se un oggetto contiene valori mancanti (NA) lapplicazione delle funzioni
statistiche standard elencate, ad esempio, in (3.1.3) comporta alcuni problemi poiche essi, per
default, vengono conteggiati in length(oggetto). In eetti le funzioni in questione tengono
conto della possiblit`a di escludere i valori mancanti; ad esempio la funzione mean `e denita:
mean<-function (x,na.rm = FALSE) 1
{ 2
if(na.rm) {x <- x[!is.na(x)]} 3
else if(any(is.na(x))) {return(NA)} 4
sum(x)/length(x) 5
} 6
sicche `e suciente modicare la situazione di default na.rm = FALSE in na.rm = TRUE. Ad
esempio:
> x<-c(NA,12,NA,14,15,17,21)
> x
[1] NA 12 NA 14 15 17 21
> mean(x)
[1] NA
> mean(x,na.rm=TRUE)
[1] 15.8
Nel seguito proponiamo due semplici alternative che a nostro avviso consentono un maggior
controllo dei valori mancanti.
Le funzioni off.na(x) e rep.na(x) consentono di modicare un oggetto che presenta elementi
mancanti (NA). La prima funzione si limita ad eliminarli, mentre la seconda sostituisce tali
valori con il valor medio o, a discrezione dellutente, con la mediana di x. Per comodit`a i
nuovi valori in uscita sono messi negli oggetti w.off e w.rep rispettivamente. I listati delle
due funzioni sono:
off.na<-function(x) 1
{ 2
w.off<<-x[!is.na(x)] 3
cat("The new w.off object has been created","\n") 4
} 5
Cos` ad esempio:
> x<-c(NA,12,NA,14,15,17,21)
> x
[1] NA 12 NA 14 15 17 21
> off.na(x)
The new w.off object has been created
105
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> w.off
[1] 12 14 15 17 21
> mean(w.off)
[1] 15.8
rep.na<-function(x, media=TRUE) 1
{ 2
if (!media){valore<-median(x[!is.na(x)])} 3
else {valore<-mean(x[!is.na(x)])} 4
for (i in (1:length(x))) 5
{ 6
if (is.na(x[i])==TRUE) {x[i]<-valore} 7
} 8
w.rep<<-x 9
cat("The new w.rep object has been created","\n") 10
} 11
> rep.na(x)
The new w.rep object has been created
> w.rep
[1] 15.8 12.0 15.8 14.0 15.0 17.0 21.0
> rep.na(x,media=FALSE)
The new w.rep object has been created
> w.rep
[1] 15 12 15 14 15 17 21

106
Capitolo 4
Elementi di calcolo delle probabilit`a
In ambiente R sono implementate le principali distribuzioni di probabilit`a univariate.
Esse sono identicate da un nome proprio che deve obbligatoriamente essere preceduto
da un susso che indica quale aspetto di esse si desidera, ed inne dalla lista dei
parametri che contraddistinguono ciascuna v.c..
Quanto ai sussi, comuni a tutte le v.c.:
d porge i valori della densit`a in corrispondenza ai valori specicati in x;
p porge i valori della funzione di ripartizione in corrispondenza ai valori indicati
in x;
q porge i valori dei quantili in corrispondenza ai valori elencati in prob;
r estrae casualmente noss elementi dalla densit`a specicata;
Quanto alle distribuzioni di probabilit`a implementate, citiamo:
binomiale
f (x) =
_
n
x
_
p
x
(1 p)
nx
dbinom(x,n, p) pbinom(x, n, p)
qbinom(prob, n, p) rbinom(noss, n, p)
binomiale negativa
f(x) =
_
x +r 1
x
_
p
r
(1 p)
x
dnbinom(x, r, p) pnbinom(x, r, p)
qnbinom(prob, r, p) rnbinom(noss, r, p)
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
geometrica
f(x) = p(1 p)
x
dgeom(x, p) pgeom(x, p)
qgeom(prob, p) rgeom(noss, p)
ipergeometrica
f(x) =
_
N
1
x
__
N
2
n x
_
_
N
1
+N
2
n
_
dhyper(x, N1, N2) phyper(x, N1, N2)
qhyper(prob, N1, N2) rhyper(noss, N1, N2)
di Poisson
f(x) =

x
e

x!
dpois(x, lambda) ppois(x, lambda)
qpois(prob, lambda) rpois(noss, lambda)
Chi-Quadro
f(x) =
1
2
n/2
(n/2)
x
n/21
e
x/2
dchisq(x, df) pchisq(x, df)
qchisq(prob, df) rchisq(noss, df)
esponenziale
f(x) = e
x
dexp(x, rate) pexp(x, rate)
qexp(prob, rate) rexp(noss, rate)
F di Snedecor
f(x) =
(n
1
/2 +n
2
/2)
(n
1
/2) (n
2
/2)
(
n
1
n
2
)
n
1
2
x
n
1
/21
(1 +
n
1
x
n
2
)
(n
1
+n
2
)/2
df(x, n1, n2) pf(x, n1, n2)
qf(prob, n1, n2) rf(noss, n1, n2)
108
E. D. Isaia, Linguaggio R e applicazioni statistiche
gamma
f(x) =
1
b
a
(a)
x
a1
e
x/b
dgamma(x, shape, scale) pgamma(x, shape, scale)
qgamma(prob, shape, scale) rgamma(noss, shape, scale)
normale
f(x) =
1

2
e
(x)/2
2
dnorm(x, mean, sd) pnorm(x, mean, sd)
qnorm(prob, mean, sd) rnorm(noss, mean, sd)
t di Student
f(x) =
(n + 1/2)
(n/2)

n
_
1 +x
2
_
2
_
(n+1)/2
dt(x, df) pt(x, df)
qt(prob, df) rlt(noss, df)
uniforme
f(x) =
1
max min
dunif(x, min, max) punif(x, min, max)
qunif(prob, min, max) runif(noss, min, max)
Osservazione 4.0.4 La v.c. Chi-Quadro precedentemente introdotta non `e altro che
un particolare caso della distribuzione Chi-Quadro non centrale. Questa rappresenta
la distribuzione della somma dei quadrati di n v.c. indipendenti e normalmente
distribuite ciascuna con varianza unitaria e valor medio
i
, i = 1, 2, . . . , n. La densit`a
di una v.c. Chi-Quadro non centrale con gradi di libert`a e parametro di non
centralit`a =

n
i=1

2
, per x 0, `e:
f
nc
(x) = e
(/2)
+

r=0
(/2)
r
r!
f(x; + 2 r)
dove f(x) indica la densit`a di una v.c. Chi-Quadro con + 2 r gradi di libert`a.
Per una v.c. Chi-Quadro con parametro di non centralit`a =ncp, si ha:
109
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
dchisq(x, df, ncp=0) pchisq(x, df, ncp=0)
qchisq(prob, df, ncp=0) rchisq(noss, df, ncp=0)
A tal proposito, osserviamo ancora la possibilit`a di calcolare particolari valori di
interesse della funzione di ripartizione delle distribuzioni F di Snedecor e t di Stu-
dent con parametro di non centralit`a ncp tramite i comandi pf(t, df =,ncp=) e
pt(t, df =, ncp=)
4.1 Semplici esercizi sul calcolo delle probabilit`a
Nel seguito i limitiamo a fornire alcuni semplici esempi applicativi che coinvolgono in
modo diretto le v.c. introdotte al paragrafo precedente.
Esempio 4.1.1 Visualizzare la funzione di distribuzione di probabilit`a e la funzione di ripar-
tizione di una v.c. binomiale di parametri n = 9, p = 0.5; le istruzioni possono essere:
> x<-c(0:9)
> par(mfrow=c(1, 2))
> plot(x,pbinom(x,9,.5),col="red",type="s",ann=FALSE)
> title(main="(a) - Funzione di ripartizione",
xlab="Determinazioni x",ylab="P(Xx)")
> plot(x,dbinom(x,9,.5),col="blue",type="h",ann=FALSE)
> title(main="(b) - Distribuzione di probabilita",
xlab="Determinazioni x",ylab="P(X=x)")
> par(mfrow=c(1, 1))
il cui output `e riprodotto in gura (4.1).
Esempio 4.1.2 Ci proponiamo di visualizzare la funzione di ripartizione di una v.c. con
distribuzione binomiale di parametri n = 9 e p = 0.10, 0.25, 0.50, 0.75, 0.90; le istruzioni
possono essere:
> x<-c(0:9)
> plot(x,pbinom(x,9,.5),xlim=c(-1,10),type="n",ann=FALSE)
> title(main="",xlab="Numero di prove",ylab="P[X x]")
> for(p in c(0.10,0.25,0.50,0.75,0.90))
{lines(x,pbinom(x,9,p),col=p*10,type="s")}
> text(0.65,0.80,"p=0.10",cex=.75)
> text(1.70,0.65,"p=0.25",cex=.75)
> text(3.25,0.30,"p=0.50",cex=.75)
> text(5.25,0.20,"p=0.75",cex=.75)
> text(6.20,0.10,"p=0.90",cex=.75)
il cui output `e riprodotto in gura (4.2).
110
E. D. Isaia, Linguaggio R e applicazioni statistiche
00 22 44 66 88
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
(a) - Funzione di ripartizione (a) - Funzione di ripartizione
Determinazioni x Determinazioni x
P
(
X
!
x
)
00 22 44 66 88
0
.
0
0
0
.
0
5
0
.
1
0
0
.
1
5
0
.
2
0
0
.
2
5
(b) - Distribuzione di probabilita' (b) - Distribuzione di probabilita'
Determinazioni x Determinazioni x
P
(
X
=
x
)
Figura 4.1: Distribuzione binomiale, n=9 e p=0.5 Esempio 4.1.1
Esempio 4.1.3 Calcolare la probabilit`a allevento {5 X 7}, posto che X sia una v.c.
binomiale con parametri n = 10, p = 0.75; le istruzioni possono essere:
> pbinom(7,10,.75)-pbinom(5,10,.75)
[1] 0.3962803
Tutto ci`o `e piuttosto ripetitivo; la seguente funzione, in base ai parametri essenziali, porge la
soluzione desiderata:
> evento<-function(x1,x2,n,p){print(pbinom(x2,n,p)-pbinom(x1,n,p))} 1
A questo punto listruzione evento(5,7,10,.75) restutuisce il risultato desiderato.
Esempio 4.1.4 Calcolare i percentili di ordine 5, 15, ..., 85, 95 di una distribuzione Chi-
Quadro con 10 gradi di libert`a.
A tal ne `e suciente impartire listruzione:
> qchisq(ppoints(10), 10)
[1] 3.940299 5.570059 6.737201 7.783243 8.812352
[6] 9.892216 11.097142 12.548861 14.533936 18.307038
111
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
00 22 44 66 88 10 10
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
Numero di prove Numero di prove
P
[
X

!

x
]
p=0.10 p=0.10
p=0.25 p=0.25
p=0.50 p=0.50
p=0.75 p=0.75
p=0.90 p=0.90

Figura 4.2: Funzioni di ripartizione di v.c. Bin(n = 9, p) Esempio 4.1.2

Esempio 4.1.5 Posto X una v.c. N(


X
= 120,
2
X
= 25), calcolare la probabilit`a attinente
agli eventi {X (
X

X
)} e {(
X

X
) X (
X
+
X
)}.
Sono sucienti le istruzioni:
> mu<-120 : s<-5
> 1-pnorm(115,mu,s)
[1] 0.8413447
> pnorm(125,mu,s)-pnorm(115,mu,s)
[1] 0.6826895

Esempio 4.1.6 Posto X una v.c. N(0, 1), calcolare la probabilit`a attinente allevento {X
x}, con x = 0, 3, (0.05).
Si tratta di calcolare le probabilit`a della coda destra di una N(0, 1) in corrispondenza a
determinati quantili; il problema viene risolto mediante le istruzioni:
112
E. D. Isaia, Linguaggio R e applicazioni statistiche
> x<-seq(0,3,by=0.05)
> n.prob.coda.dx<-1-pnorm(x,0,1)
> round(n.prob.coda.dx,4)
[1] 0.5000 0.4801 0.4602 0.4404 0.4207 0.4013 0.3821 0.3632 0.3446
[10] 0.3264 0.3085 0.2912 0.2743 0.2578 0.2420 0.2266 0.2119 0.1977
[19] 0.1841 0.1711 0.1587 0.1469 0.1357 0.1251 0.1151 0.1056 0.0968
[28] 0.0885 0.0808 0.0735 0.0668 0.0606 0.0548 0.0495 0.0446 0.0401
[37] 0.0359 0.0322 0.0287 0.0256 0.0228 0.0202 0.0179 0.0158 0.0139
[46] 0.0122 0.0107 0.0094 0.0082 0.0071 0.0062 0.0054 0.0047 0.0040
[55] 0.0035 0.0030 0.0026 0.0022 0.0019 0.0016 0.0013
Si osservi che coerentemente:
> (n.quantili<-(qnorm(1-n.prob.coda.dx,0,1)))
[1] 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60
[14] 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25
[27] 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90
[40] 1.95 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55
[53] 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00

Esempio 4.1.7 Per una v.c. N(0, 1) si ha P[X > 1.959964 = x

] = 0.025. Ci proponiamo
di calcolare il corrispondente quantile x

per una v.c. con distribuzione t di Student con


gdl = 5, 200, (5) gradi di libert`a.
Rsiolviamo il problema ricorrendo alle istruzioni:
> prob<-0.025
> gdl<-seq(5,200,by=5)
> quantile.t<-qt(1-prob,gdl)
> round(quantile.t,4)
[1] 2.5706 2.2281 2.1314 2.0860 2.0595 2.0423 2.0301 2.0211 2.0141
[10] 2.0086 2.0040 2.0003 1.9971 1.9944 1.9921 1.9901 1.9883 1.9867
[19] 1.9853 1.9840 1.9828 1.9818 1.9808 1.9799 1.9791 1.9784 1.9777
[28] 1.9771 1.9765 1.9759 1.9754 1.9749 1.9744 1.9740 1.9736 1.9732
[37] 1.9729 1.9725 1.9722 1.9719

Esempio 4.1.8 Data una v.c. Gamma(10, 5), il quantile di ordine, poniamo, 0.67 viene otte-
nuto in modo diretto tramite il comando qgamma(0.67,10,5). Unalternativa `e rappresentata
dal ricorso (cfr. paragrafo ??) alla funzione uniroot(); infatti:
> uniroot(function(x) pgamma(x ,10, 5) - 0.67, c(0, 100))$root
[1] 55.48862
> qgamma(0.67 ,10, 5)
[1] 55.48862

113
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
4.2 Generazione di numeri pseudo-casuali
La generazione di realizzazioni di variabili casuali
1
ha diverse motivazioni, ad esempio
in ambito statistico pu`o essere utilizzata al ne della verica di modelli teorici o
dellapplicazione di metodi di simulazione quali Monte Carlo ed analoghi.
Le v.c. possono essere generate a partire da numeri casuali o, meglio, dovremmo
dire numeri pseudo-casuali dal momento che la loro generazione avviene in accordo a
specici algoritmi numerici. La generazione di un numero casuale pu`o essere intesa
come la generazione di unosservazione da una v.c. con distribuzione uniforme in
(0, 1). Dal momento che la funzione di ripartizione F() di qualsiasi v.c. X assume
valori in (0, 1), se generiamo un numero, sia esso w, tra 0 e 1, esister`a smpre un valore
x tale che x = F
1
(w), ovvero tale che w = F(x). In generale `e assai complesso
individuare linversa di F().
A titolo di esempio, si immagini di voler generare una v.c. distribuzione Bernoulliana
di parametro p, ovvero:
X =
_
0 1 p
1 p
con funzione di ripartizione:
F(x) =
_
_
_
0 x < 0
1 0 x < 1
1 x 1
Iniziamo generando un numero w da una v.c. uniforme in (0, 1); se w < 1p possiamo
denire F
1
(w) = 0, mentre se w 1 p deniamo F
1
(w) = 1. In altri termini,
per generare una v.c. di Bernoulli di parametro p `e suciente generare un numero
compreso tra 0 e 1 e se risulta pi` u piccolo di 1 p diciamo che X = 0 altrimenti 1.
Dal momento che la condizione w < 1p `e equivalente, in probabilit`a, alla condizione
w > p, diremo che X = 0 se w > p.
Esempio 4.2.1 Generazione di 5 realizzazioni di una v.c. con distribuzione Bernoullia-
na di parametro p = 0.25. Estraiamo dapprima cinque numeri da ununiforme in (0, 1) e
verichiamo se sono minori di p:
> (w<-runif(5))
[1] 0.29534834 0.21283447 0.26371730 0.93382201 0.07352568
> (esito<-(w<.25)
[1] FALSE TRUE FALSE FALSE TRUE
Trasformiamo, ora, gli elementi del vettore logico esito in un vettore numerico binario:
1
Alternativamente: generazione di numeri casuali
114
E. D. Isaia, Linguaggio R e applicazioni statistiche
> (binario<-1*esito)
[1] 0 1 0 0 1

Come gi`a si disse in (4), in R sono implementate funzioni basate su algoritmi ottimiz-
zati per la generazione di numeri pseudo-cauali. A commento valgano gli esempi che
seguono.
Esempio 4.2.2 Generazione di n = 10 numeri casuali tratti da una N(
X
= 200,
2
X
= 225):
> rnorm(10,200,(225)^.5)
[1] 210.0311 198.6509 216.4558 203.8878 199.0929 190.8120 199.3914
[8] 188.4484 201.6433 203.5893

Esempio 4.2.3 Desiderando vericare, perlomeno gracamente, se n osservazioni campiona-


rie possono considerarsi tratte da una distribuzione normale si pu`o ricorrere ad un diagramma
a dispersione avendo cura di porre in ascissa i quantili di una N(, ) ed in ordinata i quantili
campionari (o empirici) calcolati sulla base della n-pla osservata.
Tenendo a mente quanto detto a tal proposito al paragrafo 2.1.5, ci`o pu`o essere ottenuto
ricorrendo al comando qqplot(x,y), dove x contiene le osservazioni campionarie e y `e denito
come qnorm(ppoints(length(x)),mean(x),sd(x)), oppure tramite il comando qqnorm(x).
A titolo di esempio la gura (4.3) riporta i diagrammi a dispersione dei quantili di sei campioni
tratti da una N(120, 20) di numerosit`a n = 25, (25), 150, in accordo alle seguenti istruzioni:
> par(mfrow=c(2,3))
> for(n in c(25,50,75,100,125,150))
{
.Random.seed<-c(1,2037680562,1033614556)
qqnorm(rnorm(n),main=paste("n=",n),xlab="Quantili teorici N(0,1)",
ylab=" Quantili campionari",pch=20,col=1+n)
}
> par(mfrow=c(1,1))
Si noti la presenza del comando .Random.seed<-c(1,2037680562,1033614556) che consente
di rigenerare una stessa sequenza di numeri casuali; a tal proposito valga lOsservazione 4.2.1.

Esempio 4.2.4 La generazione di n = 1000 numeri casuali da una v.c. con distribuzione
Chi-quadro con gdl = 12 gradi di libert`a pu`o avvenire tramite il semplice comando:
> valori.chi<-rchisq(1000,12)
115
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
-2 -2 -1 -1 00 11 22
-
1
0
1
2
n= 25 n= 25
Quantili teorici N(0,1) Quantili teorici N(0,1)

Q
u
a
n
t
i
l
i

c
a
m
p
i
o
n
a
r
i
-2 -2 -1 -1 00 11 22
-
2
-
1
0
1
n= 50 n= 50
Quantili teorici N(0,1) Quantili teorici N(0,1)

Q
u
a
n
t
i
l
i

c
a
m
p
i
o
n
a
r
i
-2 -2 -1 -1 00 11 22
-
2
-
1
0
1
2
n= 75 n= 75
Quantili teorici N(0,1) Quantili teorici N(0,1)

Q
u
a
n
t
i
l
i

c
a
m
p
i
o
n
a
r
i
-2 -2 -1 -1 00 11 22
-
2
-
1
0
1
2
n= 100 n= 100
Quantili teorici N(0,1) Quantili teorici N(0,1)

Q
u
a
n
t
i
l
i

c
a
m
p
i
o
n
a
r
i
-2 -2 -1 -1 00 11 22
-
2
-
1
0
1
2
n= 125 n= 125
Quantili teorici N(0,1) Quantili teorici N(0,1)

Q
u
a
n
t
i
l
i

c
a
m
p
i
o
n
a
r
i
-2 -2 -1 -1 00 11 22
-
2
-
1
0
1
2
n= 150 n= 150
Quantili teorici N(0,1) Quantili teorici N(0,1)

Q
u
a
n
t
i
l
i

c
a
m
p
i
o
n
a
r
i
Figura 4.3: Campionamento da una v.c. N(0, 1): QQ-plot Esempio 4.2.3
In gura (4.4) `e riportato listogramma della variabile valori.chi generata nonche il dia-
gramma a dispersione tra i quantili empirici e quelli teorici di una distribuzione N(0, 1); i
graci proposti sono stati generati dalle istruzioni:
> hist(valori.chi,main="",xlab="x",ylab="Frequenze assolute",
col="lightgreen")
> qqnorm(valori.chi,main="",xlab="Quantili teorici N(0,1)",
ylab=" Quantili campionari",pch=20,col="magenta")
Lasciamo al Lettore linterpretazione, in termini graci, dei risultati ottenuti.
Osservazione 4.2.1 A volte pu`o tornare utile rigenerare una stessa sequenza di nu-
meri casuali. A tal ne occerre conoscere e reimmettere il seme che ha generato la
prima sequenza e che `e immaganizzato nella variabile .Random.seed. Un modo per
risolvere il problema `e il ricorso alle seguenti istruzioni:
> rbinom(5,4,.36)
[1] 1 1 0 1 1
116
E. D. Isaia, Linguaggio R e applicazioni statistiche
xx
F
r
e
q
u
e
n
z
e

a
s
s
o
l
u
t
e
00 55 10 10 20 20 30 30
0
1
0
0
2
0
0
3
0
0
-3 -3 -2 -2 -1 -1 00 11 22 33
5
1
0
1
5
2
0
2
5
3
0
Quantili teorici N(0,1) Quantili teorici N(0,1)

Q
u
a
n
t
i
l
i

c
a
m
p
i
o
n
a
r
i
Figura 4.4: Istogramma e QQ-plot Esempio 4.2.3
> seme<-.Random.seed
> seme
[1] 1 14739194 782820522
> .Random.seed<-seme
> rbinom(5,4,.36)
[1] 1 1 0 1 1
Per approfondimenti, si vedano gli articoli di Marsaglia (1997) e Wichmann, Hill
(1982) e la bibliograa ivi citata.
4.3 Il campionamento
In R `e denita una particolare funzione che consente lestrazione di un campione
casuale, di dimensione specicata, da un dato oggetto; tale estrazione pu`o avvenire
con o senza rimessa a seconda delle esigenze dellutente.
La sintassi estesa del comando necessario per accedere a tale funzione `e:
sample(oggetto,n,replace=FALSE)
dove:
117
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
loggetto specicato pu`o avere modalit`a numerica o alfanumerica indierente-
mente;
n indica la dimensione del campione che si desidera estrarre. Si ricordi che per
default si ha n=length(oggetto);
replace=FALSE indica che lestrazione avviene senza rimessa; tale `e la situazione
di default.
Esempio 4.3.1 Estrazione senza rimessa di un campione casuale di dimensione n = 5 dalle
26 lettere dellalfabeto anglosassone. Il probbema `e risolto con:
> sample(letters,5)
[1] "a" "m" "t" "g" "u"

Esempio 4.3.2 Estrazione senza rimessa di 4 campioni casuali di dimensione n


i
= 1, . . . , 4,
con i = 1, . . . , 4, dalle 26 lettere dellalfabeto anglosassone. Ricorrendo ad un ciclo retto da
for, abbiamo:
> for(n in 1:4){print(sample(letters,n))}
[1] "m"
[1] "b" "c"
[1] "e" "o" "c"
[1] "d" "y" "g" "m"

Esempio 4.3.3 Campionamento con rimessa da un oggetto con modalit`a alfanumerica:


a<-LETTERS[1:7]
for(i in 1:4){print(sample(a,4,replace=TRUE))}
il cui risultato potrebbe essere:
[1] "C" "F" "D" "G"
[1] "C" "E" "C" "D"
[1] "G" "G" "A" "F"
[1] "E" "E" "G" "G"
Osservazione 4.3.1 Ricorrendo allistruzione:
for(i in 1:4); print(sample(a,replace=TRUE))
si ottengono quattro permutazioni degli elementi di a; ad esempio le seguenti:
118
E. D. Isaia, Linguaggio R e applicazioni statistiche
[1] "D" "B" "E" "A" "G" "C" "F"
[1] "F" "D" "E" "G" "C" "A" "B"
[1] "D" "A" "B" "G" "G" "F" "D"
[1] "E" "G" "C" "D" "C" "D" "F"

Esempio 4.3.4 Estrazione senza rimessa di 4 campioni di 5 elementi ciascuno, da una v.c.
N(10, 2).
> for(i in 1:4){print(sample(rnorm(1000,10,2),5))}
[1] 7.500336 11.596424 11.279172 10.808307 9.332722
[1] 11.683638 11.538254 9.494141 8.657761 8.943494
[1] 8.721086 11.026309 6.303418 8.370027 11.259078
[1] 8.636034 9.080102 12.447917 11.931348 7.070856
Esempio 4.3.5 Simulazione del lancio di una moneta ripetuto 10000 volte. Eseguiamo une-
strazione con rimessa, che ripetiamo 10000 volte, da un oggetto che contiene i valori 0 e 1. A
tal ne `e suciente listruzione:
> sample(c(0,1),10000,replace=TRUE)
> ## non mandare in esecuzione!!
Meglio potremmo fare riassumendo i risultati in una tabella di frequenza, ad esempio mediante
le istruzioni:
> lancio<-table(sample(c(0,1), 10000, replace = TRUE))
> dimnames(lancio)<-list(Lancio=c("Testa","Croce"))
> lancio
Lancio
Testa Croce
4973 5027
Manifestamente resta aperto il problema della bont`a della simulazione, ma su tale argomento
torneremo nel seguito.
119
Capitolo 5
Elementi di statistica inferenziale
Nel seguito ci occuperemo del problema della costruzione di intervalli di condenza e
della verica di ipotesi statsitiche, perlomeno in situazioni, per cos` dire, classiche. In
particolare vedremo come sia possibile e parimenti facile costruire funzioni ad hoc e, al
contempo, come si possano sfruttare funzioni gi`a implementate e piuttosto sosticate,
presenti nella libreria ctest.
Ricordiamo
1
che la stima puntuale dei parametri = (
1
,
2
, . . . ,
k
) IR
k
,
che caratterizzano la densit`a f
X
(x; ) della una v.c. X, che descrive un fenomeno
aleatorio oggetto di indagine, avviene ricorrendo ad una opportuna funzione appli-
cata sulle n 2 v.c. X
1
, X
2
, . . . , X
n
indipendenti e identicamente distribuite (i.i.d.)
come X. La funzione T = t(X
1
, X
2
, . . . , X
n
) = t(X), abitualmente detta stimatore
ed individuata in genere in accordo a particolari criteri, ad esempio quello della mas-
simaverosomiglianza o quello dei momenti, `e a sua volta una v.c. con densit`a f
T
() e
tale che
2
IE[T] = e IE
_
(T IE[T])
2

= V ar[T] 0, per n .
5.1 Intervalli di condenza per un parametro
Dato il campione casuale X = (X
1
, X
2
, . . . , X
n
) con densit`a f
X
(x, ), dove `e
un parametro unidimensionale e date le due statistiche T
1
= t
1
(X
1
, X
2
, . . . , X
n
) e
T
2
= t
2
(X
1
, X
2
, . . . , X
n
), con T
1
T
2
, lintervallo [T
1
, T
2
] viene detto intervallo di
condenza al livello 1 per il parametro se IR:
P [T
1
T
2
; ] = 1 (5.1)
con 0 1. In particolare la (5.1) aerma che la probabilit`a che lintervallo casuale
[T
1
, T
2
] contenga il vero ed ignoto valore del parametro `e 1, qualunque sia il vero
valore del parametro assunto nello spazio parametrico. In tal modo le n osservazioni
1
Per approfondimenti: Shao (1999), Schervish (1997).
2
Trattasi delle note propriet`a di correttezza e di consistenza, perlomeno asintotica, di uno
stimatore.
E. D. Isaia, Linguaggio R e applicazioni statistiche
campionarie, raccolte nel vettore x, vengono impiegate per individuare un insieme di
valori che, con una certa ducia, conterr`a il vero valore del parametro.
`
E bene tenere a mente che oltre agli intervalli di condenza corrispondenti alla (5.1),
possiamo considerare intervalli di condenza unilaterali del tipo:
P [T
1
; ] = 1 (5.2)
P [T
2
; ] = 1 (5.3)
Dal punto di vista pratico, tra i diversi metodi che consentono la costruzione di
intervalli di condenza, vale la pena ricordare quello basato sulla quantit`a pivo-
tale, cio`e una funzione
3
delle osservazioni campionarie e del parametro , diciamo
q (X
1
, X
2
, . . . , X
n
; ), la cui distribuzione non dipende dal parametro . Ci`o premesso,
sar`a possibile individuare due valori q
1;
e q
2;
che verranno a dipendere unicamente
da e tali che:
P [q
1;
q (X
1
, X
2
, . . . , X
n
; ) q
2;
; ] = 1 (5.4)
A questo punto, se possiamo esprimere linsieme:
{x
1
, x
2
, . . . , x
n
: q
1;
q (x
1
, x
2
, . . . , x
n
; ) q
2;
}
nella forma:
{x
1
, x
2
, . . . , x
n
: t
1
(x
1
, x
2
, . . . , x
n
) t
2
(x
1
, x
2
, . . . , x
n
)}
dove t
1
() e t
2
() sono funzioni non dipendenti da , allora lintervallo:
[t
1
(X
1
, X
2
, . . . , X
n
) , t
2
(X
1
, X
2
, . . . , X
n
)]
`e un intervallo di condenza al livello 1 per .
A ben vedere, la relazione (5.4) non necessariamente `e soddisfatta da ununica coppia
(q
1;
, q
2;
); generalmente questi vengono individuati in modo da lasciare una uguale
probabilit`a, pari ad /2, nelle code sinistra e destra della distribuzione della quantit`a
pivotale q (X
1
, X
2
, . . . , X
n
; ).
Dal punto di vista applicativo, grande importanza rivestono gli intervalli di condenza
per campioni tratti da una distribuzione normale, cio`e qualora si ipotizzi che le v.c.
X
1
, X
2
, . . . , X
n
siano i.i.d. N(,
2
). Sotto tale ipotesi, per gli stimatori:

X = n
1
n

i=1
X
i
S
2
= (n 1)
1
n

i=1
_
X
i


X
_
2
3
In genere una quantit`a pivotale non `e uno stimatore, dal momento che viene a dipendere da .
121
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
risultano le seguenti quantit`a pivotali:
Z =

N(0, 1) W = (n 1)
S
2

2

2
n1
Ricordando, inoltre, che le v.c. Z e W sono stocasticamente indipendenti, la v.c.:
U =

n 1
Z

W
=

X
S
viene a possedere distribuzione t di Student con = n 1 gradi di libert`a.
Ci`o premesso, vediamo come applicare quanto esposto in alcuni casi pratici.
Esempio 5.1.1 La costruzione di un intervallo di condenza per il parametro = av-
viene ricorrendo allo stimatore

X = n
1

n
i=1
X
i
. Dal momento che U =

n

X
S
ha
distribuzione t di Student con = n 1 gradi di libert`a, allora ,
2
:
1 = P
_
|U|
n1
t
1/2

= P
_
|

X
S
|
n1
t
1/2
_
=
= P
_

X
n1
t
1/2
S

n


X +
n1
t
1/2
S

n
_
dove
n1
t
1/2
indica il quantile di ordine 1/2 della distribuzione t di Student con = n1
gradi di libert`a.
Pertanto, stabilito il livello di condenza 1 , avremo:
IC

=
_

X

t
1/2
S

n
;

X +

t
1/2
S

n
_
Si osservi che la v.c. S/

n, detta abitualmente errore standard, rappresenta la stima della


varianza dello stimatore

X, media campionaria.
Desiderando automatizzare quanto esposto, possiamo considerare la seguente:
Funzione 5.1.1 (I.C. per ,
2
ignota)
> ic.mu<-function(x,alpha=0.05,decimali=4) 1
{ 2
n<-length(x) 3
media.x<-mean(x) 4
sd.x<-sd(x) 5
se.x<-sd(x)/sqrt(n) 6
ic.inf<-media.x-qt(1-alpha/2,n-1)*se.x 7
ic.sup<-media.x+qt(1-alpha/2,n-1)*se.x 8
cat("I.C.: ",round(ic.inf,decimali),round(ic.sup,decimali),"\n") 9
} 10
122
E. D. Isaia, Linguaggio R e applicazioni statistiche
Cos`, ad esempio, per le n = 12 osservazioni:
> x<-c(14.2,13.8,10.1,12.4,11.1,11.3,8.1,11.3,7.8,8.0,9.3,5.9)
otteniamo:
> ic.mu(x,alpha=.05)
I.C.: 8.6576 11.8924
Esempio 5.1.2 La costruzione di un intervallo di condenza per il parametro =
2
avviene
ricorrendo allo stimatore S = (n 1)
1

n
i=1
X
i
. Dal momento che W = (n 1)
S
2

2
ha
distribuzione Chi-Quadro con = n 1 gradi di libert`a:
1 = P [W
n1;1
] = P
_
(n 1)
S
2

2

n1;1
_
= P
_

(n 1) S
2

n1;1
_
da cui lintervallo di condenza:
IC

2 =
_
0;
(n 1) S
2

n1;1
_
Anche in questo caso, desiderando automatizzare quanto esposto, possiamo considerare la
seguente:
Funzione 5.1.2 (I.C. per
2
)
> ic.var<-function(x,alpha=0.05,decimali=4) 1
{ 2
n<-length(x) 3
var.x<-(n-1)*var(x) 4
ic.inf<-0 5
ic.sup<-var.x/qchisq(1-alpha/2,n-1) 6
cat("I.C.: ",round(ic.inf,decimali),round(ic.sup,decimali),"\n") 7
} 8
Cos`, ad esempio, per le n = 12 osservazioni:
> x<-c(14.2,13.8,10.1,12.4,11.1,11.3,8.1,11.3,7.8,8.0,9.3,5.9)
abbiamo:
> ic.var(x,alpha=.05)
I.C.: 0 3.2519

123
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Esempio 5.1.3 Siano X
1
e X
2
due campioni casuali indipendenti, di numerosit`a rispetti-
vamente n
1
e n
2
, tratti da altrettante v.c. N(
i
,
2
i
), con i = 1, 2. La costruzione di un
intervallo di condenza per la dierenza tra due valori medi
1

2
prende le mosse dalla
v.c.

X
1


X
2
, a componenti indipendenti. Se le varianze
2
1
e
2
2
, entrambe ignote, si possano
ritenere uguali tra loro, allora la v.c.:
U =

n
1
+n
2
(

X
1


X
2
) (
1

2
)
S
p
(5.5)
con:
S
2
p
=
(n
1
1) S
2
1
+ (n
2
1) S
2
2
n
1
+n
2
2
risulta avere distribuzione t di Student con = n
1
+n
2
2 gradi di libert`a. Pertanto:
1 = P
_
|

n
1
+n
2
(

X
1


X
2
) (
1

2
)
S
p
|
n1+n22
t
1/2
_
= P
_
(

X
1


X
2
)
n1+n22
t
1/2
S
p

n
1
+n
2

1

2
(

X
1


X
2
) +
n1+n22
t
1/2
S
p

n
1
+n
2
_
Quindi lintervallo di condenza (IC
12
) per la dierenza tra due valori medi risulta:
_
(

X
1


X
2
)
n1+n22
t
1/2
S
p

n
1
+n
2
; (

X
1


X
2
) +
n1+n22
t
1/2
S
p

n
1
+n
2
_
Anche in questo caso, desiderando automatizzare quanto esposto, possiamo considerare la
seguente:
Funzione 5.1.3 (I.C. per
X

Y
,
2
X
=
2
X
ma ignote)
> ic.muxy<-function(x,y,alpha=0.05,decimali=4) 1
{ 2
nx<-length(x) 3
ny<-length(y) 4
media.dif<-mean(x)-mean(y) 5
sp<-sqrt(((nx-1)*var(x)+(ny-1)*var(y))/ 6
(nx+ny-2))*sqrt((1/nx)+(1/ny)) 7
ic.inf<-media.dif-qt(1-alpha/2,nx+ny-2)*sp 8
ic.sup<-media.dif+qt(1-alpha/2,nx+ny-2)*sp 9
cat("I.C.: ",round(ic.inf,decimali),round(ic.sup,decimali),"\n") 10
} 11
> ic.muxy(x,y,alpha=.05)
I.C.: -5.1259 0.6502
124
E. D. Isaia, Linguaggio R e applicazioni statistiche
Osservazione 5.1.1 Se lipotesi di uguaglianza
4
tra le due varianze
2
1
e
2
2
non
potesse essere assunta, allora si dimostra che la funzione test (5.5) viene ad essere di-
stribuita approssimativamente secondo una t di Student i cui gradi di libert`a vengono
stimati mediante lapprossimatione di Welch-Satterthwaite:
=
_
S
2
1
n
1
1
+S
2
2
n
1
2
_
S
2
1
n
1
1
n
1
1
+
S
2
2
n
1
2
n
2
1
Evidentemente, non `e necessariamente un intero: in tal caso lo si approssima al-
lintero immediatamente precedente. Quello che ne risulta `e una distribuzione t di
Student con numero di gradi di libert`a minore di n
1
+n
2
2 .
Loutput delle funzioni precedentemente introdotte, pu`o ovviamente essere arricchito
con laggiunta di commenti ed altre informazioni, oltre al desiderato intervallo di
condenza.
Cos`, ad esempio, la funzione (5.1.1) potrebbe esere riscritta come:
ic.mu<-function(x,alpha=0.05,decimali=4) 1
{ 2
n<-length(x) 3
media.x<-mean(x) 4
sd.x<-sd(x) 5
se.x<-sd(x)/sqrt(n) 6
ic.inf<-media.x-qt(1-alpha/2,n-1)*se.x 7
ic.sup<-media.x+qt(1-alpha/2,n-1)*se.x 8
ris<-c(1:3) 9
ris[1]<-round(media.x, decimali) 10
ris[2]<-round(sd.x, decimali) 11
ris[3]<-round(se.x, decimali) 12
ris<-matrix(ris,ncol=1) 13
dimnames(ris)<-list(c("Media campionaria","Deviazione standard:", 14
"Standard error:"),"") 15
cat("Vettore dei dati individuali: ", deparse(substitute(x)), 16
"\nOsservazioni: ", n,"\n","\n---------------------------", 17
"\n","I.C.: ",round(ic.inf,decimali)," ; ", 18
round(ic.sup,decimali),"\n----------------------------", 19
"\n","\nStatistiche:","\n") 20
ris 21
} 22
4
In termini tecnici si parla di ipotesi di omoschedasticit`a tra le varianze.
125
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
A tal proposito, per le n = 12 osservazioni precedentemente impiegate:
> x<-c(14.2,13.8,10.1,12.4,11.1,11.3,8.1,11.3,7.8,8.0,9.3,5.9)
otteniamo:
> ic.mu(x,alpha=.05,decimali=3)
Vettore dei dati individuali: x
Osservazioni: 12
---------------------------
I.C.: 8.658 ; 11.892
----------------------------
Statistiche:
Media campionaria 10.275
Deviazione standard: 2.546
Standard error: 0.735
I risultati proposti in questo paragrafo, in virt` u del Teorema Limite Centrale, pos-
sono essere approssimativamente applicati a campioni tratti da distribuzioni non
necessariamente normali, a patto per`o che la cardinalit`a n sia sucientemente grande.
Esempio 5.1.4 Una moneta, di cui si ignora se sia equilibrata o no, viene lanciata n = 100
volte. Indicando con la probabilit`a, costante, di ottenere Croce in un singolo lancio, ci
proponiamo la costruzione di un intervallo di condenza per , a partire dal campione casuale
X
1
, X
2
, . . . , X
n
, le cui componenti X
i
risultano v.c. indipendenti con, ciascuna, distribuzione
bernoulliana, cio`e, i = 1, 2, . . . , n:
X
i
=
_
0 1
1
A tal ne (cfr. Esempio 4.3.5), si immagini che lesperimento casuale abbia dato luogo ai
seguenti valori:
> lancio<-sample(c(0,1), 100, replace = TRUE)
> lancio
[1] 0 1 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1
[27] 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1
[53] 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1
[79] 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0
> dimnames(table(lancio))<-list(Lancio=c("Testa","Croce"))
126
E. D. Isaia, Linguaggio R e applicazioni statistiche
> table(lancio)
Lancio
Testa Croce
40 60
Stimatore di viene ad essere la v.c.

X =

n
i=1
n
1
X
i
, detta in tal caso proporzione cam-
pionaria, che indica, appunto, la proporzione delle Croci ottenute nella n-pla osservata. Dal
momento che n `e grande, possiamo fare appello al Teorema Limite Centrale ed aermare che
la distrbuzione di

X `e approssimativamente Normale con parametri e
(1 )
n
. Lintervallo
di condenza sar`a, dunque:
IC

=
_
x

t
1/2
_
x(1 x)
n
; x +

t
1/2
_
x(1 x)
n
_
la cui valutazione in R avviene mediante listruzione:
> ic.mu(lancio,alpha=.05)
Vettore dei dati individuali: lancio
Osservazioni: 100
---------------------------
I.C.: 0.5337 ; 0.7263
----------------------------
Statistiche:
Media campionaria 0.63
Deviazione standard: 0.4852
Standard error: 0.0485
Si osservi che lintervallo di condenza ottenuto non contiene il valore 0.5.
Va da se che qualora non si possa ricorrere al Teorema Limite Centrale occorre in-
dividuare la distribuzione esatta degli stimatori dei parametri di interesse, il che
generalmente comporta alcuni problemi sopratutto ai ni del calcolo numerico.
Senza voler entrare in dettagli, tentiamo di illustrare il problema prendendo spunto
dalla situazione di cui allEsempio 5.1.4. Supponiamo, dunque, che X sia una v.c.
con distribuzione bernoulliana di parametro ignoto . Al ne di stimare , estratto il
campione casuale X
1
, X
2
, . . . , X
n
, di dimensione n, possiamo ricorrere allo stimatore
T =

n
i=1
X
i
che rappresenta il nmero dei successi ottenuti in X. Manifestamente
tale stimatore, in quanto somma di n v.c. i.i.d. bernoulliane, possiede distribuzione
binomiale di parametri n e con
5
con IE[T] = n e V ar[T] = n (1 ).
5
Si noti che tra lo stimatore

X di cui allEsempio 5.1.4 e lo stimatore T qui introdotto intercorre
la semplice relazione

X = n
1
T.
127
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Al ne della costruzione di un intervallo di condenza per , al livello di condenza
1 , occorre individuare i quantili di ordine /2 e 1 /2 della distribuzione di T,
ossia risolvere rispetto a k
i
, i = 1, 2, le equazioni:
P [T k
1
] =
k
1

t=0
p
x
(1 p)
nx
= (5.6)
P [T k
2
] =
k
2

t=0
p
x
(1 p)
nx
= 1 (5.7)
dove p rappresenta la stima puntuale di , ovvero p = t(x)/n.
Il calcolo dei quantili k
1
e k
2
, in accordo alle (5.6) e (5.7), pu`o essere eseguito ricor-
rendo al comando uniroot (cfr. paragrafo ??) applicato sulla funzione di ripartizione
di una binomiale di parametri n, p. Pertanto possiamo considerare la seguente:
Funzione 5.1.4 (I.C. esatto per )
ic.p<-function(x,n,livello.conf=0.95) 1
{ 2
p<-x/n 3
alpha<-(1-livello.conf)/2 4
LI<-function(x,alpha) 5
{ 6
uniroot(function(p) pbinom(x-1,n,p)-livello.conf,c(0,1))$root 7
} 8
LS<-function(x, alpha) 9
{ 10
uniroot(function(p) pbinom(x,n,p)-alpha,c(0,1))$root 11
} 12
IC<-{c(LI(x,alpha), LS(x,alpha))} 13
stima.p<-x/n 14
cat("Stima =",stima.p ,"\n") 15
cat("IC =",IC,"\n") 16
} 17
Esempio 5.1.5 Con riferimento allesperimento casuale di cui allEsempio 5.1.4, avendo os-
servato 60 Croci in 100 lanci di una stessa moneta, lintervallo di condenza esatto per il
parametro risulta:
> ic.p(60,100)
Stima = 0.6
IC = 0.5129658 0.6967233
pi` u piccolo rispetto a quanto ottenuto applicando il Teorema Limite Centrale.
128
E. D. Isaia, Linguaggio R e applicazioni statistiche
5.2 Verica di ipotesi statistiche
Dato un campione casuale (X
1
, X
2
, . . . , X
n
) di dimensione n tratto da una v.c. X con
densit`a f
X
(x; ) nota a meno dei parametri = (
1
,
2
, . . . ,
k
) IR
k
, unipotesi
statistica pu`o essere intesa quale asserzione sul vettore dei parametri della densit`a del
tipo H :
0
, ove
0
`e un sottoinsieme dello spazio parametrico . In particolare
lipotesi H viene detta semplice se
0
contiene un solo elemento, composta qualora
contenga pi` u elementi. Il problema che ci si pone `e stabilire se
0
oppure no.
Abitualmente il problema viene posto ricorrendo ad un sistema di ipotesi del tipo:
_
H
0
:
0
H
1
:
1
con
0

1
= e
0

1
= . La prima asserzione `e detta ipotesi nulla e rappresenta
lipotesi che si desidera testare, la seconda viene detta ipotesi alternativa.
Sulla base dei risultati forniti dalla n-pla osservata, si perverr`a a decidere se lipotesi
nulla `e sostenuta dai dati o se questi invece sono a favore dellipotesi alternativa. Con
il termine test statistico si intende appunto la procedura di decisione in favore di H
0
o di H
1
.
Pi` u precisamente, un test statistico (x) viene ad essere una funzione che assume
valore
0
se i dati campionari portano allaccettazione di H
0
e
1
in caso contrario.
In sostanza, esso viene a creare una partizione dello spazio campionario; tutti gli
elementi dello spazio campionario per cui (x) =
0
vengono a costituire la regione
di accettazione di H
0
, A = {x : (x) =
0
}, mentre linsieme complementare,

A =
{x : (x) =
1
}, costituisce regione di riuto di H
0
. In denitiva, dunque, se x A
si accetta lipotesi nulla, la si rigetta qualora x

A.
Tale modo di procedere, tuttavia, ci espone a due particolari rischi:
rigettare lipotesi nulla, quando in realt`a essa `e vera;
accettare lipotesi nulla, quando in realt`a essa `e falsa.
In letteratura, tali errori vengono, rispettivamente detti errore del primo tipo ed
errore del secondo tipo. Appare, quindi, intuitivo che un test statistico debba tentare
di minimizzare la probabilit`a di commettere entrambi i due tipi di errore. Per ogni
testo statistico possiamo denire la funzione di potenza:
K () = P
_
X

A;

= P [ (X) =
1
; ] (5.8)
cio`e come la probabilit`a di riutare lipotesi nulla per ogni valore del parametro .
Sotto tale prolo, dunque, un test statistico verr`a considerato ottimo se al con-
tempo minimizza la (5.8) per
0
e viceversa massimizza la (5.8) per
1
.
129
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Evidentemente, tale condizione non pu`o essere vericata poiche i due requisiti sono
in conitto tra loro. In pratica, la risoluzione del problema avviene ssando in modo
arbitrario il cosidetto livello di signicativit`a del test, denito:
= sup

0
K () = sup

0
P
_
X

A;

(5.9)
cio`e la probabilit`a di commettere lerrore del primo tipo. Osserviamo ancora che,
qualora
0
sia semplice, allora il livello del test `e = P
_
X

A;
0

. Quanto alla
probabilit`a di commettere il secondo tipo di errore, questa viene indicata con () =
P [X A;
1
] = 1 K ().
A questo punto, ssato il livello di signicativit`a, nella famiglia dei test di livello
preassegnato, verr`a scelto un test tale che () sia uniformemente minimizzata su

1
, ovvero tale che K () venga uniformemente massimizzata in
1
. Un siatto test
viene detto uniformemente pi` u potente. Quindi un test ottimo sar`a denito come
quel test che per assegnato ha potenza massima.
`
E importante osservare che alla partizione dello spazio campionario, indotta dal test
statistico, viene associata una funzione a valori reali detta abitualmente funzione test,
e coincidente con una statistica t (x) che assume valori piccoli quando H
0
`e vera e
valori elevati quando `e vera H
1
. Possiamo quindi dire che un test statistico `e una
procedura basata su un campione casuale tramite una funzione test con la quale H
0
`e rigettata a favore di H
1
per certi valori estremi della funzione test ed accettata per
i restanti valori possibili.
Ne seguito ci limitiamo a presentare una collezione di funzioni test
6
utili in svariate
situazioni ed implementate in R, mentre non ci occuperemo della costruzione di test
ottimali.
`
E importante osservare, Gibbon, Pratt (1975), che `e norma comune stabilire qual`e il
pi` u piccolo livello per il quale la n-pla osservata conduce al riuto dellipotesi nulla.
Ci`o avviene valutando il valore osservato t della funzione test tramite il livello di
signicativit`a osservato o p-value, denito:
p value = sup

0
P [t (X) > t; ] (5.10)
Tanto pi` u il p value `e piccolo, tanto minore sar`a la probabilit`a che sotto lipotesi
nulla la funzione test produca un valore maggiore di quello osservato, mentre `e alta
la probabilit`a sotto lipotesi alternativa. In pratica tanto pi` u `e piccolo il p value,
tanto pi` u saremo propensi ad accettare H
0
.
Posto che sia il parametro unidimensionale di interesse e indicando con T = t (X)
una funzione test, i diversi tipi di ipotesi su che aronteremo nel seguito saranno:
6
Funzioni test a potenza massima e basati sul rapporto tra le funzioni di verosomiglianza calcolate
sotto H0 e H1.
130
E. D. Isaia, Linguaggio R e applicazioni statistiche
Ipotesi nulla Ipotesi altenative
H
0
: =
0
H
1
: =
0
ipotesi bidirezionale
H
1
: >
0
ipotesi unidirezionale
H
1
: <
0
ipotesi unidirezionale
mentre i corrispondenti p value saranno calcolati in base alla distrbuzione della
funzione test T = t (X) sotto lipotesi nulla, ponendo cio`e =
0
.
Desiderando in qualche modo chiarire quanto sin qui riassunto, valga il seguente:
Esempio 5.2.1 I responsabili di un Istituto di Credito ritengono che limporto dei prelievi
eettuati con il Bancomat, presso il proprio sportello, abbiano una distribuzione approssima-
tivamente normale con valor medio pari a 300.000 lire. Al ne di vericare tale aermazione, `e
stato estratto un campione casuale di dimensione n = 40 il quale ha fornito i seguenti risultati
(in lire x 1000):
350 300 200 450 250 350 250 350 250 300
150 350 250 300 250 250 550 150 250 350
150 400 350 550 500 250 350 350 550 450
200 350 500 450 250 350 250 100 350 350
Si immagini che il sistema di ipotesi statistiche che si desidera sottoporre a verica sia:
_
H
0
: =
0
= 300
H
1
: >
0
= 300
Manifestamente trattasi di una verica di ipotesi, con alternativa unilaterale, sul valor medio
di una distribuzione normale con varianza ignota; la funzione test che verr`a utilizzata `e quella
che prevede la stima di
2
mediante la varianza campionaria corretta S
2
, e pertanto:
T = t (X) =

X
S
che, sotto H
0
, ha distribuzione t di Student con = n 1 gradi di libert`a. Per la natura
dellipotesi alternativa H
1
, segue che la regione di riuto `e

A = {x : t(x) > k}, dove k indica
il valore critico della funzione test determinato in modo da soddisfare la (5.9), cio`e:
P
_
X

A;
0

= P [T > k;
0
] =
Se si sceglie di porre = 0.05, otteniamo, per = 39, quale valore critico k = 1.6849 e la
regola di decisione porter`a al rigetto di H
0
qualora sia t
Sper.
=

40
x 300
s
> k.
In R possiamo impartire i comandi:
> x<-c(350,300,200,450,250,350,250,350,250,300,150,350,250,300,250,
250,550,150,250,350,150,400,350,550,500,250,350,350,550,450,
200,350,500,450,250,350,250,100,350,350)
> alpha<-0.05
> k.critico<-qt(1-alpha,length(x)-1)
> t.sper<-(sqrt(40))*(mean(x)-300)/sd(x)
131
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
donde i risulati:
> k.critico
[1] 1.684875
> t.sper
[1] 1.320101
che, per le ipotesi di lavoro fatte, condurrebbero allaccettazione di H
0
.
Osservazione 5.2.1 Per la simmetria della distribuzione della funzione test risulta t
1;
=
t
;
, pertanto ai ni del calcolo del valore critico del test avremmo potuto impartire il
comando:
> k.critico<-qt(alpha, length(x)-1, lower=FALSE)
del tutto equivalente a:
> k.critico<-qt(1-alpha, length(x)-1)
oppure a:
> k.critico<- -qt(alpha, length(x)-1)
Tale approccio, tuttavia, non viene in pratica utilizzato dai pacchetti statistici in commercio,
i quali forniscono il p value associato alla verica di ipotesi richiesta in accordo alla (5.10).
Nel caso in esame, indicando con f
T
(t;
0
) la densit`a della funzione test sotto H
0
, avremo:
p.value =
_
+
tSper.
f
T
(t;
0
) dt = 1
_
tSper.

f
T
(t;
0
) dt
e di conseguenza in R:
> p.value<-1-pt(t.sper,length(x)-1)
> p.value
[1] 0.09724868
il che indica che larea della coda a destra del quantile t
Sper.
della distribuzione t di Student
con = 39 gradi di libert`a `e allincirca il 10%. Anche sotto tale ottica si `e propensi ad
accettare H
0
.
A questo punto, per avere unidea del potere discriminatorio del test approntato, potrebbe
essere interessante calcolare la funzione di potenza del test, K () = P
_
X

A;

, perlomeno
in corrispondenza ad alcuni valori di sotto H
1
. Ci`o equivale a calcolare il complemento ad
uno della funzione di ripartizione di una ditribuzione t di Student, con = n 1 gradi di
libert`a e parametro di non centralit`a

n

1

0
S
, in corrispondenza a k = 1.6849.
Scelto di porre, sotto H
1
,
1
= 310 e ricordando le Osservazioni 4.0.4 e 5.2.1, in R possiamo
impartire i comandi:
132
E. D. Isaia, Linguaggio R e applicazioni statistiche
> mu1<-310
> mu0<-300
> sqm<-sd(x)
> nonc<-sqrt(length(x))*(mu1-mu0)/sd(x)
> pt(qt(alpha, df=length(x)-1), df=length(x)-1, ncp = nonc, lower = FALSE)
[1] 0.98578
La potenza del test, in corrispondenza dellipotesi alternativa
1
= 310, vale pertanto 0.98578.
In altri termini (
1
= 310) = P [X A;
1
= 310] = 0.01422, ovvero una probabilit`a di circa
il 1.4% di commettere lerrore del II tipo in corrsIpondenza a
1
= 310.
Alla luce dellEsempio proposto, appare evidente come in R possano essere imple-
mentate funzioni ad hoc per la verica di ipotesi statistiche e a tal proposito valga il
seguente:
Esempio 5.2.2 Desiderando vericare lipotesi di omoschedasticit`a tra due varianze H
0
:

2
X
/
2
Y
= 1 contro lalternativa H
1
:
2
X
/
2
Y
> 1, in base alle realizzazioni di due campioni
indipendenti tratti dalle v.c. X N(
X
,
2
X
) e Y N(
Y
,
2
Y
), ricordando che la statistica
campionaria S
2
X
/S
2
Y
, sotto lipotesi nulla, ha distribuzione F di Snedecor con n
X
1 e n
Y
1
gradi di libert`a rispettivamente a numeratore e denominatore, posiamo introdurre la seguente
funzione ad hoc:
Funzione 5.2.1 (Verica di ipotesi per due varianze)
> var.equal<-function(x,y) 1
{ 2
ok <- (!is.na(x) & !is.na(y)) 3
x <- x[ok]; y <- y[ok] 4
nx <- length(x); ny <- length(y) 5
if(nx <= 2 || ny <= 2) stop("not enough observations") 6
Fsper<-sqrt(var(x))/sqrt(var(y)) 7
pvalue<-1-pf(Fsper, nx-1, ny-1) 8
sigma<-list(vx=var(x),vy=var(y),rapporto=Fsper,pval=pvalue) 9
return(sigma) 10
} 11
A commento della funzione proposta:
le righe da [2] a [5] si occupano del controllo dei vettori x e y immessi;
la riga [6] provvede al calcolo del valore sperimentale della funzione test impiegata;
in riga [7] si procede al calcolo del p value associato al test in accordo alla (5.10).
in riga [8] si crea la lista sigma che contiene i risultati del test (varianze campionarie,
valore sperimentale della funzione test e corrispondente p value);
listruzione in riga [9] visualizza la lista sigma.
133
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Lasciamo come esercizio al Lettore il problema del calcolo della potenza del test in corrispon-
denza ad un particolare valore del rapporto
2
X
/
2
Y
sotto lipotesi alternativa
7
.
Prima di concludere, desideriamo accennare al problema dellindividuazione della di-
mensione n del campione casuale s` che essa garantisca, a fronte di un dato sistema
di ipotesi statistiche, pressate probabilit`a di commettere sia lerrore del I tipo che
lerrore del II tipo, questa valutata in corrispondenza di un particolare valore cruciale

1
. Il problema viene superato, ssate le probabilit`a e (
1
), risolvendo
rispetto ad n lequazione:
K(
1
) = 1 (
1
) (5.11)
Dal momento che generalmente le funzioni test coinvolte hanno, perlomeno sotto
lipotesi alternativa, una distribuzione non centrale, il problema pu`o essere risolto
ricercando per via numerica le radici dellequazione (5.11), sfruttando, ad esempio, il
comando uniroot, di cui al paragrafo (??).
Esempio 5.2.3 Si immagini che il contenuto, in ml, di aconi di un certo medicinale siano
imbottigliati mediante due processi produttivi possa essere modellizzato mediante le due v.c.
X
1
N(
1
,
2
) e X
2
N(
2
,
2
), dove, in base a indagini precedenti, si ha la stima S
2
= 6.
Desiderando sottoporre a verica le seguenti ipotesi statistiche:
_
H
0
:
1

2
= 0
H
1
:
1

2
> 0
si vuole determinare la numerosit`a campionaria che rispetti le seguenti condizioni:
probabilit`a dellerrore del I tipo pari al 5%, ossia = 0.05;
potenza del test, in corrispondenza allipotesi alternativa
1

2
= 2 = , pari al 98%.
Ora, sappiamo che la funzione test, sotto lipotesi alternativa, ha distribuzione t di Student
con 2 (n1) gradi di libert`a e parametro di non centralit`a
_
n/2

S
2
; sicche possiamo scrivere
lespressione per K() come:
> potenza<-quote
({
pt(qt(0.05, df=2*(n-1), lower = FALSE), df=2*(n-1), ncp=sqrt(n/2) *
2/sqrt(6), lower = FALSE)
})
Quindi, ricorrendo alla funzione uniroot (cfr. Esempio ??), e ricordando che per le ipotesi
fatte K() = 0.98, abbiamo:
> n<-uniroot(function(n) eval(potenza) - 0.98, c(2, 1e+07))$root
> n
[1] 33.16656
s` che la numerosit`a campionaria atta a garantire i vincoli posti sar`a n = 2 34 = 68.
7
Cfr. Osservazione 4.0.4 ed Esempio 5.2.1.
134
E. D. Isaia, Linguaggio R e applicazioni statistiche
5.3 La libreria ctest
In R `e possibile procedere alla verica di di ipotesi statistiche ricorrendo, come gi`a si
disse, alle funzioni contenute nella libreria ctest, acronimo di Common Tests.
Prima di passare in rassegna ad alcune di esse, vediamo come `e possibile accedere ad
una libreria, visualizzarne il contenuto ed eventualmente liberare larea di lavoro dalle
librerie in eccesso. I comandi essenzialmente sono:
library(nome della libreria): carica nellarea di lavoro corrente la libreria
specicata;
(.packages()): elenca le librerie attive;
help(package=nome della libreria): fornisce, nella nestra di Help, lelenco
delle funzioni della libreria specicata;
detach("package:nome della libreria"): libera larea di lavoro corrente
dalla libreria specicata.
Nel nostro caso, essendo interessati alla libreria ctest, potremmo impartire i comandi:
> (.packages())
[1] "base"
> library(ctest)
> (.packages())
[1] "ctest" "base"
> detach("package:ctest")
> (.packages())
[1] "base"
In particolare, poi, il comando help(package=ctest) porge il seguente elenco
8
:
ansari.test Ansari-Bradley Test
bartlett.test Bartlett Test for Homogeneity of Variances
binom.test Exact Binomial Test
chisq.test Pearsons Chi-squared Test for Count Data
cor.test Test for Zero Correlation
fisher.test Fishers Exact Test for Count Data
fligner.test Fligner-Killeen Test for Homogeneity of Variances
friedman.test Friedman Rank Sum Test
kruskal.test Kruskal-Wallis Rank Sum Test
8
Aggiornamento alla data 01.02.2001.
135
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
ks.test Kolmogorov-Smirnov Tests
mantelhaen.test Cochran-Mantel-Haenszel Chi-Squared Test
for Count Data
mcnemar.test McNemars Chi-squared Test for Count Data
mood.test Mood Two-Sample Test of Scale
wise.prop.test Pairwise comparisons of proportions
pairwise.t.test Pairwise t tests
pairwise.table Tabulate p values for pairwise comparisons
pairwise.wilcox.test Pairwise Wilcoxon rank sum tests
power.prop.test Power calculations two sample test for of proportions
power.t.test Power calculations for one and two sample t tests
print.pairwise.htest Print method for pairwise tests
print.power.htest Print method for power calculation object
prop.test Test for Equal or Given Proportions
prop.trend.test Test for trend in proportions
quade.test Quade Test
shapiro.test Shapiro-Wilk Normality Test
t.test Students t-Test
var.test F Test to Compare Two Variances
wilcox.test Wilcoxon Rank Sum and Signed Rank Tests
Test su valori medi t.test
La funzione t.test `e assai versatile, consentendo allutente di eettuare una serie
piuttosto ampia di veriche di ipotesi statistiche circa un valor medio o la dierenza
tra due valori medi. La sintassi estesa della funzione in oggetto `e:
t.test(x, y=NULL, alternative="two.sided", mu=0,
paired = FALSE, var.equal = FALSE, conf.level = 0.95)
Volendo procedere, conviene distinguere il caso in cui la verica di ipotesi coinvolga
un solo valor medio da quello in cui si essa sia concentrata sulla dierenza tra due
valori medi in base alle osservazioni di due campioni indipendenti ovvero appaiati.
In tutti i casi, loutput della funzione t.test consiste nella creazione e visualizzazione
della lista rval contenente tutte le informazioni relative al test richiesto (valore della
statistica test, p-value, intervallo di condenza, ...)
Un solo campione Premesso che la semplice istruzione t.test(x) verica, sulla base
della statistica campionaria x, le seguenti ipotesi H
0
: =
0
= 0 contro H
1
: =
0
,
il che `e raramente di interesse, ci pare utile soermarci sugli argomenti della funzione
in esame; pertanto:
136
E. D. Isaia, Linguaggio R e applicazioni statistiche
indicato loggetto che contiene le determinazioni campionarie, occorre specicare
il valore di sotto lipotesi nulla, poiche come si `e detto la situazione di default
lo pone uguale a zero;
successivamente, a seconda della struttura dellipotesi alternativa si dovr`a in-
dicare se il test `e di tipo bilaterale ovvero unilaterale a protezione inferiore o
superiore; a tal ne, valga la tabella riassuntiva che segue:
Ipotesi nulla Ipotesi altenative parametri
H
0
: =
0
H
1
: =
0
(...alternative="two.sided",...)
H
1
: >
0
(...,alternative="greater",...)
H
1
: <
0
(...,alternative="less",...)
in ultimo lutente pu`o specicare il livello 1 desiderato nella costruzione del-
lintervallo di condenza per il valor medio incognito ; la situazione di default
prevede conf.level=0.95.
Esempio 5.3.1 Un produttore di lampade uorescenti asserisce che le proprie lampade hanno
una durata media di corretto funzionamento di 1200 ore. A ne di vericare tale aermazione,
abbiamo sottoposto a prova di durata un campione casuale di n = 10 lampade, ottenendo i
seguenti risultati circa la durata di corretto funzionamento (espressa in ore):
1179 1235 1180 1250 1220 1010 1000 1150 1277 1129
Il sistema di ipotesi a conitto `e il seguente:
H
0
: = 1200 H
1
: < 1200
Desiderando procedere, ricorriamo alla funzione t.test:
> x<-c(1179,1235,1180,1250,1220,1010,1000,1150,1277,1129)
> t.test(x,y=NULL, alternative="less", mu=1200,paired = FALSE,
var.equal = FALSE, conf.level = 0.95)
One Sample t-test
data: x
t = -1.2345, df = 9, p-value = 0.1241
alternative hypothesis: true mean is less than 1200
95 percent confidence interval:
NA 1217.941
sample estimates:
mean of x
1163
137
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Dal momento che il p-value associato al test `e maggiore, seppur di poco, di 0.10, siamo
portati ad accettare lipotesi nulla. Si osservi che il valore di sotto lipotesi nulla H
0
rientra
nellintervallo di condenza [0; 1217.941].
Due campioni indipendenti Nel caso si operi su due campioni casuali indipen-
denti, (X
1
, X
2
, . . . , X
n
X
) e (Y
1
, Y
2
, . . . , Y
n
Y
), e si desideri vericare lipotesi che essi
provengano da densit`a caratterizzate da un ugual valor medio, occorrer`a:
indicare gli oggetti, ad esempio x e y, che contengono le determinazioni campio-
narie;
scegliere il tipo di test idoneo a seconda della struttura dellipotesi alternativa,
come si `e visto al punto precedente (alternative="...");
indicare che trattasi di determinazioni provenienti appunto da campioni indi-
pendenti (paired=FALSE);
specicare se le varianze ignote
2
X
e
2
Y
possono ritenersi tra loro uguali o non,
ricordando che la situazione di default prevede var.equal=FALSE e in tal caso
i gradi di libert`a della t di Student coinvolta sono stimati in accordo al metodo
proposto da Welch-Satterthwaite (cfr. Osservazione 5.1.1);
stabilire il livello 1 desiderato nella costruzione dellintervallo di condenza
per la dierenza tra i valori medi
X
e
Y
.
Esempio 5.3.2 Si immagini che i responsabili della Qualit`a, di unazienda operante in campo
informatico, al ne di monatre dischi ssi di nuova generazione su propri PC si trovino a
dover scegliere tra due fornitori (A e B) che, a parit`a di prestazioni dichiarate, orono prezzi
unitari tra loro diversi. Ai ni della scelta del componente a prezzo unitario minore, sono state
eettuate, per ciascun tipo di prodotto, pi` u misurazioni (espresse in millesimi di secondo) dei
tempi di accesso al disco sso e ci`o al ne di vericare, in base ai dati campionari ottenuti, se
esistono dierenze signicative tra i corrispondenti valori medi di universo
A
e
B
, ottenendo
i seguenti risultati:
fornitore A 30.0 29.9 29.2 29.8 30.8 29.8 30.4 28.9 30.5 29.7
fornitore B 28.7 28.6 29.4 29.7 29.9 30.2 28.7 29.4 30.4 29.7
Il sistema di ipotesi a conitto `e il seguente:
H
0
:
A
=
B
H
1
:
A
=
B
Desiderando procedere, supponendo che le corrispondenti varianze, pur ignote, possano rite-
nersi uguali, e ricorrendo alla funzione t.test, si ha:
138
E. D. Isaia, Linguaggio R e applicazioni statistiche
> x<-c(30.0,29.9,29.2,29.8,30.8,29.8,30.4,28.9,30.5,29.7)
> y<-c(28.7,28.6,29.4,29.7,29.9,30.2,28.7,29.4,30.4,29.7)
> t.test(x,y, alternative="two.sided", mu=0,paired = FALSE,
var.equal = TRUE, conf.level = 0.95)
Two Sample t-test
data: x and y
t = 1.5854, df = 18, p-value = 0.1303
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.1398368 0.9998368
sample estimates:
mean of x mean of y
29.90 29.47
Dal momento che il p-value associato al test `e maggiore del 10%, i responsabili della Qualit`a
saranno portati ad accettare lipotesi nulla
9
e, pertanto, a preferire il fornitore che ore un
prezzo unitario minore.
Due campioni appaiati In tal caso le osservazioni del primo campione non sono
indipendenti da quelle del secondo ed il problema coinvolge, per cos` dire, la nuova v.c.
D = X Y , mentre lipotesi nulla risulta H
0
:
D
=
0
= 0. Specicati gli oggetti,
ad esempio x e y, contenenti le realizzazioni campionarie, si tratter`a unicamente di
specicare paired=TRUE.
A commento, osserviamo che se denissimo il nuovo oggetto w<-x-y e ricorressimo
allistruzione t.test(w), otterremmo ovviamente gli stessi risultati dellistruzione
t.test(x,y,paired=TRUE).
Esempio 5.3.3 Si supponga che al ne di vericare lecacia di un nuovo farmaco anti-
coagulante, si sono eettuate n = 8 misurazione della concentrazione (in %) di protrombina
su altrettanti pazienti prima e dopo la somministrazione del farmaco, ottenendo i seguenti
risultati:
prima X 0.016 0.018 0.023 0.015 0.018 0.015 0.017 0.024
dopo Y 0.014 0.016 0.020 0.012 0.018 0.014 0.018 0.022
Il sistama di ipotesi che si desidera sottoporre a verica si presenta:
_
H
0
:
X

Y
= 0
H
1
:
X

Y
> 0
Dal momento che lanalisi `e stata condotta sui medesimi pazienti, siamo di fronte a due
campioni appaiati (non indipendenti) e pertanto al ne della verica delle ipotesi poste,
abbiamo:
9
Si osservi che lintervallo di condenza [0.1398368; 0.9998368] contiene lo zero.
139
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> x<-c(0.016,0.018,0.023,0.015,0.018,0.015,0.017,0.024)
> y<-c(0.014,0.016,0.020,0.012,0.018,0.014,0.018,0.022)
> t.test(x,y, alternative="greater", mu=0,paired = TRUE,
var.equal = TRUE, conf.level = 0.95)
Paired t-test
data: x and y
t = 3, df = 7, p-value = 0.009971
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
0.0005527107 NA
sample estimates:
mean of the differences
0.0015
Risultati che indicano come il nuovo farmaco abbia eettivamente potere anti-coagulante.
Osservazione 5.3.1 Desiderando visualizzare o porre in un nuovo oggetto, per suc-
cessive elaborazioni, un (solo) risultato di interesse, ad esempio il valore della funzione
test, lintervallo di condenza, ..., sar`a suciente aggiungere al comando t.test(...)
il susso $ seguito da uno dei seguenti nomi convenzionali: statistic per il valore
della funzione test, p.value per il pvalue associato al test, conf.int per lintervallo
di condenza.
Potenza e progettazione di test su valori medi - power.t.test
Come si `e gi`a sottolineato, due problemi, essenzialmente, sorgono qualora si conside-
rino test di ipotesi statistiche e precisamente:
valutare il potere discriminatorio della funzione test in corrispondenza ad alcuni
valori di interesse del parametro sotto lipotesi alternativa;
individuare la dimensione n del campione casuale s` che essa garantisca pressate
probabilit`a di commettere sia lerrore del I tipo che lerrore del II tipo, questa
valutata in corrispondenza di un particolare valore critico
1
.
La risposta al primo quesito `e data calcolando la funzione di potenza del test, K (),
o equivalentemente la probablit`a di commettere lerrore del II tipo, (), in corri-
spondenza ai diversi valori di interesse di
1
.
Quanto al secondo problema, che va sotto il nome di progettazione di un test, si tratta
di risolvere rispetto ad n lequazione gi`a posta in (5.11) e precisamente:
K(
1
) = 1 (
1
)
140
E. D. Isaia, Linguaggio R e applicazioni statistiche
una volta ssate le probabilit`a e (
1
).
Nel caso di veriche di ipotesi statistiche su un valor medio o sulla dierenza tra
due valori medi, i precedenti problemi in R possono essere risolti facendo ricorso alla
funzione power.t.test la cui sintassi completa `e:
power.t.test(n=NULL, delta=NULL, power=NULL, sd=1, sig.level=0.05,
type = c("two.sample","one.sample", "paired"),
alternative = c("two.sided", "one.sided"))
dove
10
n rappresenta la numerosit`a del campione casuale, delta la dierenza tra le
medie
1

0
, power la potenza del test in corrispondenza a
1
cio`e K(
1
), sd lo
scarto quadratico medio o la sua stima s ed inne sig.level la probabilit`a
dellerrore del I tipo.
Il parametro incognito, nel nostro caso power oppure n, deve obbligatoriamente essere
passato alla funzione come NULL. Loutput della funzione porge il valore numerico di
tutti i parametri della stessa. Analogamente ad altre funzioni, possiamo visualizzare
ed eventualmente porre in un nuovo oggetto un (solo) risultato di interesse aggiun-
gendo al comando power.t.test(...) il susso $ seguito dal nome del parametro
di interesse.
Esempio 5.3.4 LEsempio 5.2.1, concernente un test unidirezionale a protezione superiore
per un valor medio, proponeva, tra le altre cose, il calcolo della funzione di potenza del
test in corrispondenza allipotesi alternativa
1
= 310, calcolo che venne eseguito applicando
direttamente la (5.8) e ricorrendo alla distribuzione t di Student, con = n1 gradi di libert`a
e parametro di non centralit`a

n

1

0
S
in corrispondenza a k = 1.6849. In alternativa
avremmo potuto ricorrere alla funzione power.t.test nel seguente modo
11
:
> power.t.test(n=40,power=NULL,delta=10,sd=113.7854,sig.level=0.95,
alternative="one.sided",type="one.sample")
One-sample t test power calculation
n = 40
delta = 10
sd = 113.7854
sig.level = 0.95
power = 0.98578
alternative = one.sided
Si osservi che la probabilit`a dellerrore del II tipo in corrispondenza a
1
= 310, ossia (
1
)
pu`o essere ottenuta con il comando:
10
Perlomeno nel caso di test su un solo valor medio.
11
Per i dati dellEsempio 5.2.1 lo scarto quadratico medio vale 113.7854.
141
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> power.t.test(n=40,power=NULL,delta=-10,sd=113.7854,sig.level=0.05,
alternative="one.sided",type="one.sample")
One-sample t test power calculation
n = 40
delta = -10
sd = 113.7854
sig.level = 0.05
power = 0.01422000
alternative = one.sided
Per concludere, si noti il comportamento del comando:
> power.t.test(n=40,power=NULL,delta=delta=10,sd=113.7854,sig.level=0.95
alternative="one.sided",type="one.sample")$power
[1] 0.98578
quantit`a che, come sempre, potrebbe essere immessa in un nuovo oggetto per successive
elaborazioni.
Esempio 5.3.5 Sia X v.c. distribuita normalmente con parametri ignoto e
2
stimata,
in base a indagini precedenti, in 225. Desiderando sottoporre a verica le seguenti ipotesi
statistiche:
_
H
0
: =
0
= 100
H
1
: =
0
= 100
si desidera progettare un test che rispetti le seguenti condizioni:
probabilit`a dellerrore del I tipo pari al 5%, ossia = 0.05;
potenza del test in corrispondenza allipotesi alternativa

1
= 120 o

1
= 80 pari al
98%, ovvero K(

1
) = K(

1
) = 0.98.
Desiderando fare ricorso, in alternativa a quanto fatto a tal riguardo allEsempio 5.2.3, alla
funzione power.t.test, possiamo porre:
n=NULL,power=0.98,delta=20,sd=sqrt(225),sig.level=0.05,
alternative="two.sided",type="one.sample"
ottenendo:
> power.t.test(n=NULL,power=0.98,delta=20,sd=sqrt(225),sig.level=0.05,
alternative="two.sided",type="one.sample")
One-sample t test power calculation
142
E. D. Isaia, Linguaggio R e applicazioni statistiche
n = 11.20446
delta = 20
sd = 15
sig.level = 0.05
power = 0.98
alternative = two.sided
s` che la numerosit`a campionaria atta a garantire i vincoli posti sar`a n = 12.
Test su due varianze var.test
Desiderando sottoporre a verica, sulla base delle realizzazioni di due campioni indi-
pendenti tratti dalle v.c. X N(
X
,
2
X
) e Y N(
Y
,
2
Y
), lipotesi di omoscheda-
sticit`a tra le due varianze, cio`e H
0
:
2
X
/
2
Y
= 1, contro una delle alternative:
H
1
:
2
X
/
2
Y
= 1 H
1
:
2
X
/
2
Y
> 1 H
1
:
2
X
/
2
Y
< 1
a parte la funzione (5.2.1) da noi creata ad hoc, possiamo ricorrere alla funzione
var.test, la cui sintassi `e:
var.test(x,y,ratio=1,alternative="less","greater",two.sided",
conf.level=0.95)
con ovvio signicato dei parametri che vi compaiono
12
.
Esempio 5.3.6 La verica di ipotesi sulluguaglianza tra due valori medi, di cui allEsempio
5.3.2, venne condotta presupponendo luguaglianza tra le due varianze
2
A
e
2
B
. Al ne di
testare tale ipotesi, ricorrendo a var.test, abbiamo:
> x<-c(30.0,29.9,29.2,29.8,30.8,29.8,30.4,28.9,30.5,29.7)
> y<-c(28.7,28.6,29.4,29.7,29.9,30.2,28.7,29.4,30.4,29.7)
> var.test(x,y)
F test to compare two variances
data: x and y
F = 0.8185, num df = 9, denom df = 9, p-value = 0.7702
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
0.203293 3.295101
sample estimates:
ratio of variances
0.8184565
12
Cfr. Osservazione 5.3.2.
143
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Visto che il p-value associato al test `e decisamente elevato (77%), siamo propensi ad accettare
lipotesi nulla, nonostante il rapporto tra le varianze campionarie sia 0.81846.
Osservazione 5.3.2 Si noti che la funzione var.test prevede lopzione ratio=k,
con k > 0, consente la verica dellipotesi H
0
:
2
X
/
2
Y
= k contro le alternative:
H
1
:
2
X
/
2
Y
= k H
1
:
2
X
/
2
Y
> k H
1
:
2
X
/
2
Y
< k
Test su pi` u varianze bartlett.test
Se consideriamo k > 2 campioni casuali indipendenti, X
j
N(,
2
j
), ciascuno di
cardinalit`a n
j
, con j = 1, 2, . . . , k, la verica dellipotesi di omoschedasticit`a tra le
varianze e cio`e:
H
0
:
2
1
=
2
1
= . . . =
2
k
H
1
: (i, j)
i=j

2
i
=
2
j
pu`o essere eettuata ricorrendo alla funzione bartlett.test.
Dal momento che per ciascun campione la stima della varianza `e:
S
2
j
=
1
n
j
1
n
j

i=1
_
X
ij


X
j
_
2
il test prende le mosse dalla constatazione che, per ciascun campione, il rapporto:
V =
1
n k
k

j=1
S
2
j
(n
j
1)/
_
_
k

j=1
S
2 (n
j
1)
j
_
_
1
n k
`e uguale
13
allunit`a se e solo se tutte le varianze campionarie sono uguali tra loro,
altrimenti esso assume valori maggiori dellunit`a e aumenta via via con laccrescersi
delle dierenze tra le S
2
i
. Perci`o se sotto H
0
il rapporto V tender`a ad assumere valori
prossimi a 1, mentre sotto H
1
esso assumer`a valori tendenzialmente maggiori.
Ora
14
, sotto lipotesi nulla, una certa funzione del rapporto V , e precisamente:
K
2
=
n k
Q
ln V
dove:
Q = 1 +
1
3 (k 1)
k

j=1
1
n
j
1

1
n k
13
Trattasi, a ben vedere, del rapproto tra la media aritmetica e la media geometrica delle varianze
campionarie pesate con i rispettivi gradi di libert`a.
14
Per approfondimenti Bartlett (1937) e, ad esempio, Gartside (1972).
144
E. D. Isaia, Linguaggio R e applicazioni statistiche
descrive una v.c. la cui distribuzione pu`o essere approssimata da quella di Chi-Quadro
con = n k gradi di libert`a, viceversa sotto lipotesi alternativa essa descrive una
v.c. che tende ad assumere valori sistematicamente maggiori.
Scelto, quindi, un appropriato livello di signicativit`a 1, si riuter`a lipotesi di omo-
geneit`a delle varianze
2
i
se e solo se la variabile test K
2
assume valori appartenenti
alla regione critica [
2
nk;1
; +].
Ritornando alla funzione bartlett.test, la sua sintassi `e quanto mai semplice,
infatti:
bartlett.test(x, g)
Tuttavia, in linea di massima, occorre osservare che:
x potrebbe essere un vettore ad elementi numerici corrispondenti alle n osser-
vazioni campionarie; in tal caso `e dobbligo indicare loggetto g, di dimensione
uguale a x, i cui elementi indicheranno il campione di appartenenza di ciascun
elemento di x;
x potrebbe essere una lista i cui k elementi corrispondono alle osservazioni dei
k campioni considerati; in tal caso `e suciente il comando bartlett.test(x).
Output della funzione sono la funzione test K
2
di Bartlett (statistic), i corrispon-
denti gradi di libert`a (parameter), nonche il p value (p.value).
Esempio 5.3.7 Si immagini che tre macchinari, A, B e C producano uno stesso componente
meccanico una cui caratteristica di vitale importanza `e rappresentata dal diametro. Si sup-
ponga, altres` che il diametro del componente meccanico possa essere descritto tramite una
v.c. X N(,
2
i
), i = 1, 2, 3. Onde vericare se i tre macchinari mostrino una uguale va-
riabilit`a nel corso della produzione, sono stati approntati altrettanti campioni casuali i quali
hanno fornito i seguenti risultati (in mm):
A B C
30.0 26.7 28.7
29.9 28.6 28.6
29.2 27.4 29.4
29.8 28.7 29.7
30.8 29.9 29.9
29.8 26.2 28.7
30.4 27.7 29.4
28.9 29.7
30.5
29.7
Deniti i tre oggetti a, b e c che contengono i singoli dati campionari, creiamo la lista abc
che passeremo alla funzione bartlett.test; pertanto:
145
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> a<-c(30.0,29.9,29.2,29.8,30.8,29.8,30.4,28.9,30.5,29.7)
> b<-c(28.7,28.6,29.4,29.7,29.9,28.7,29.4,29.7)
> c<-c(26.7,28.6,27.4,28.7,29.9,26.2,27.7)
> abc<-list(a,b,c)
> bartlett.test(abc)
Bartlett test for homogeneity of variances
data: abc
Bartletts K-squared = 6.7661, df = 2, p-value = 0.03394
Essendo il pvalue associato alla funzione test decisamente piccolo, siamo propensi a rigettare
lipotesi di uguaglianza tra tre le varianze.
La gura (5.1) riporta i diagrammi a scatola e ba dei valori campionari del diametro dei
componenti meccanici, ed `e stata ottenuta tramite il comando:
> boxplot(abc,main="",xlab="Macchinari",ylab="Diametro (mm)",
col="lightgray",names=c("A","B","C"))
AA BB CC
2
7
2
8
2
9
3
0
Macchinari Macchinari
D
i
a
m
e
t
r
o

(
m
m
)
Figura 5.1: Diagrammi a scatola e ba Esempio 5.3.7
Osserviamo che avremmo eettuare il test organizzando i dati campionari nel seguente modo:
146
E. D. Isaia, Linguaggio R e applicazioni statistiche
> dati<-c(30.0,29.9,29.2,29.8,30.8,29.8,30.4,28.9,30.5,29.7,28.7,28.6,
29.4,29.7,29.9,28.7,29.4,29.7,26.7,28.6,27.4,28.7,29.9,26.2,27.7)
> gruppi<-c(rep(1,10),rep(2,8),rep(3,7))
> bartlett.test(dati,gruppi)
Bartlett test for homogeneity of variances
data: dati and gruppi
Bartletts K-squared = 6.7661, df = 2, p-value = 0.03394
ottenendo, coerentemente, lo stesso risultato.
Il test di Bartlett trova applicazione sopratutto nellambito dellAnalisi delal Varianza
(ANOVA) e in generale nello studio dei modelii lineari.
Test esatto su una proporzione binom.test
Ricorrendo alla funzione binom.test possiamo sottoporre a verica lipotesi statistica
H
0
: =
0
contro una delle alternative:
H
1
: =
0
H
1
: <
0
H
1
: >
0
sulla base
15
delle realizzazioni della funzione test T = n
1

n
i=1
X
i
, la quale, sotto
lipotesi nulla, ha distribuzione binomiale di parametri n,
0
.
Senza entrare in dettagli, la sintassi per accedere a tale funzione `e:
binom.test(x, n, p = 0.5, alternative = c("two.sided", "less",
"greater"), conf.level = 0.95)
dove x indica il numero di Successi osservati in n prove indipendenti di un esperimento
casuale. Lutente, come sempre, pu`o specicare lipotesi alternativa nonche il livello
di condenza richiesto. Si osservi che la situazione di default prevede
0
= 0.5.
Esempio 5.3.8 Da precedenti indagini la proporzione di neonate aette da displasia allanca
era approssimativamente pari al 3%. In base ad una recente indagine condotta su un campione
casuale di 120 neonate solo tre sono risultate aette da displasia allanca. Possiamo aermare
la proporzione sia dinimuita?
Il sistema di ipotesi a conitto risulta:
_
H
0
: =
0
= 0.03
H
1
: <
0
Ricorrendo alla funzione binom.test, abbiamo:
15
Si ricordi quanto detto a tal proposito alla ne del paragrafo5.1 e riassunto dalla Funzione 5.1.4
e dallEsempio 5.1.5.
147
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> binom.test(3,120,p=0.03,alternative="less",conf.level=0.95)
Exact binomial test
data: 3 and 120
number of successes = 3, number of trials = 120, p-value = 0.5133
alternative hypothesis: true probability of success is less than 0.03
95 percent confidence interval:
0.00000000 0.06333852
sample estimates:
probability of success
0.025
Essendo decisamente elevato il pvalue associato al test, siamo propensi ad accettare lipotesi
nulla e concludere quindi che la proporzione di neonate aette da displasia allanca non sia
mutata nel corso del tempo.
Osservazione 5.3.3 Qualora si desideri eettuare una verica di ipotesi sulla dif-
ferenza tra due proporzioni, sulla base di due campioni indipendenti di numerosit`a
elevata, si pu`o ricorrere alla funzione t.test.
Esempio 5.3.9 Da un indagine condotta su un campione casuale di 200 individui adulti, di
cui 100 di sesso femminile e i restanti di sesso maschile, risulta che il 75% dei maschi fuma,
mentre le fumatrici sono il 55%. Si desidera sottoporre a verica il seguente sistema di ipotesi
statistiche:
_
H
0
:
maschi
=
femmine
H
1
:
maschi
>
femmine
Ricorrendo alla funzione t.test, occorre dapprima creare i due vettori, maschi e femmine,
delle osservazioni campionarie; tali vettori conterranno 100 elementi con opportuna alternanza
di 0 (non fumatore/fumatrice) e di 1 (fumatore/fumatrice). Ci`o premessso:
> maschi<-c(rep(1,75),rep(0,25))
> femmine<-c(rep(1,55),rep(0,45))
> t.test(maschi,femmine, alternative="two.sided", mu=0,
paired = FALSE, var.equal = TRUE, conf.level = 0.95)
Two Sample t-test
data: maschi and femmine
t = 3.0172, df = 198, p-value = 0.002886
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.06928128 0.33071872
sample estimates:
mean of x mean of y
0.75 0.55
148
E. D. Isaia, Linguaggio R e applicazioni statistiche
Essendo decisamente piccolo il p value associato al test, siamo propensi a rigettare lipotesi
di uguaglianza tra le due proporzioni.
Test sul coeciente di correlazione lineare cor.test
Desiderando vericare se due due campioni casuali, X e Y di egual cardinalit`a n,
provengono da altrettante v.c. X N(
X
,
2
X
) e Y N(
Y
,
2
Y
) linearmente indi-
pendenti
16
, possiamo eettuare un test teso a vericare se il coeciente di correlazione
lineare tra le v.c. X e Y possa ritenersi nullo oppure no. In sostanza, si tratta di
sottoporre a verica le seguenti ipotesi statistiche:
_
H
0
: =
0
= 0
H
1
: =
0
= 0
In tali situazioni abitualmente si ricorre alla funzione test corrispondente al coeciente
di correlazione campionario r del Pearson, denito come:
r =
S
X,Y
S
X
S
Y
o, meglio, alla sua trasformata:
r
1 r
2

n 2
che sotto H
0
viene a possedere distribuzione t di Student con = n2 gradi di libert`a.
Sotto tali condizioni si possono applicare le tecniche generali esposte al paragrafo (5.2).
In R possiamo procedere ad un siatto test di ipotesi ricorrendo alla particolare
funzione cor.test, la quale, bene qui sottolinearlo, prevede anche altri tipi di test
non parametrici. Nel seguito, tuttavia, considereremo unicamente il caso di test
parametrico basato sul rapporto di correlazione del Pearson
17
. Sotto tale prolo, la
sintassi della funzione in esame si riduce a:
cor.test(x, y)
dove, ovviamente, x e y sono due vettori ad elementi numerici e di egual dimensione,
cio`e tali che length(x)=length(y).
Output essenziali sono la funzione test r di Pearson (statistic), i corrispondenti
gradi di libert`a (parameter), nonche il p value (p.value).
16
Il che equivale a chiedersi se essi siano estratti da una v.c. Normale bivariata a componenti
linearmente indipendenti.
17
Che daltronde corrisponde alla situazione di default.
149
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Esempio 5.3.10 Si immagini di avere rilevato, su un campione di n = 10 autovetture medio-
piccole ad alimentazione a benzina e trazione anteriore, la potenza espressa in CV-Din e la
velocit`a massima dichiarata espressa in km/h, ottenendo i seguenti risultati:
Potenza (CV-Din) Velocit`a (km/h)
45 135
54 145
45 137
50 140
60 150
65 140
70 160
54 145
70 150
60 150
Organizzate, per comodit`a, le osservazioni campionarie nel data frame dati, la gura (5.2)
porge alcune informazioni circa la dipendenza tra le variabili in esame.
CV.Din CV.Din
135 135 140 140 145 145 150 150 155 155 160 160
4
5
5
0
5
5
6
0
6
5
7
0
0.8 0.8
45 45 50 50 55 55 60 60 65 65 70 70
1
3
5
1
4
5
1
5
5Vel.max Vel.max
Figura 5.2: Correlazione tra velocit`a massima e potenza Esempio 5.3.10
I comandi atti allo scopo sono:
150
E. D. Isaia, Linguaggio R e applicazioni statistiche
> x<-cbind(c(45, 54, 45, 50, 60, 65, 70, 54, 70, 60))
> y<-cbind(c(135, 145, 137, 140, 150, 140, 160, 145, 150, 150))
> dati<-data.frame(CV.Din=x,Vel.max=y)
> pairs(dati,panel=panel.fit,diag.panel=panel.hist,
upper.panel=panel.cor)
Desiderando sottoporre a verica le seguenti ipotesi statistiche:
_
H
0
: =
0
= 0
H
1
: =
0
= 0
ricorrendo alla funzione cor.test avremo:
> attach(dati)
> cor.test(CV.Din,Vel.max)
Pearsons product-moment correlation
data: CV.Din and Vel.max
t = 3.6893, df = 8, p-value = 0.006137
alternative hypothesis: true correlation is not equal to 0
sample estimates:
cor
0.7936084
> detach(dati)
ed evidentemente saremo portati al rigetto di H
0
.
`
E bene notare che a volte si `e interessati a vericare, sulla base dei valori campionari
osservati, lipotesi che il coeciente di correlazione della popolazione sia uguale ad un
valore specicato non nullo, poniamo
0
= 0. In altri termini si desidera sottoporre a
vericca le le ipotesi statistiche:
_
H
0
: =
0
= 0
H
1
: =
0
In tal caso, si pu`o ricorre alla funzione test:
z =

n 3
_
0.5 ln
_
1 +r
1 r
_
0.5 ln
_
1 +
0
1
0
__
la quale sotto H
0
tende a distribuirsi, perlomeno asintoticamente, secondo una N(0, 1).
Se tale `e il caso, allora possiamo pensare di implementare una funzione ad hoc che
potrebbe presentarsi come:
151
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Funzione 5.3.1
rho.test<-function(rho,x,y) 1
{ 2
covar(x,y,print=F) 3
r<-rxy.out 4
n<-length(!is.na(x)) 5
z<-(sqrt(n-3))*(0.5*log((r+1)/(1-r))-0.5*log((rho+1)/(1-rho))) 6
pval<-2*pnorm(-abs(z)) 7
cat("r =",r,"rho =",rho,"p-value=",pval,"\n") 8
} 9
Test di indipendenza chisq.test
Dedichiamo questo paragrafo alla presentazione di un particolare test di ipotesi sta-
tistiche che si dierenzia dai precedenti per il fatto che non viene ipotizzata alcuna
forma per la densit`a della v.c. da cui viene tratto il campione casuale. Tali test
vengono abitualmente detti test non parametrici
Si immagini che due caratteri possano essere descritti in modo congiunto mediante la
v.c. bivariata (X, Y ); il problema che tenteremo di risolvere `e vericare, sulla base
delle realizzazioni di due campioni di ugual numerosit`a X e Y tratti da (X, Y ), se la
v.c. in esame `e a componenti stocasticamente indipendenti, in simboli X Y .
In sostanza si tratta di vericare il seguente sistema di ipotesi statistiche:
_
H
0
: X Y
H
1
: X Y
(5.12)
Abitualmente le realizzazioni campionarie x e y vengono organizzate in una tabella
a doppia entrata di dimensione r s, dove r indica il numero delle modalit`a di x e
s il numero delle modalit`a di y, che riporta il numero delle unit`a campionarie che
presentano al contempo modalit`a i di X e j di Y , cio`e le frequenze congiunte n
ij
, con
i = 1, 2, . . . , r e j = 1, 2, . . . , s
Al ne della verica del sistema di ipotesi (5.12) si ricorre alla funzione test, dovuta
al Pearson:
X
2
=
r

i=1
s

j=1
(n
ij
n
ij
)
2
n
2
ij
(5.13)
dove n
ij
rappresentano le frequenze congiunte che ci si attenderebbe osservare nel
caso di indipendenza stocastica
18
tra le componenti la v.c. doppia (X, Y ).
18
E cio`e, com`e facile accertare: nij =

r
i=1
nij

s
j=1
nij/

r
i=1

s
j=1
nij = n.j ni./n. A tal
proposito si veda anche lEsempio 3.2.3.
152
E. D. Isaia, Linguaggio R e applicazioni statistiche
Sotto H
0
, la funzione test (5.13) `e distribuita approssimativamente socondo una Chi-
Quadro con (r 1) (s 1) gradi di libert`a. Il test tender`a, dunque, ad accettare
lipotesi nulla se e solo se il valore osservato della (5.13) `e non maggiore di q
1
, dove,
coerentemente con quanto precedentemente esposto:
P[X
2
q
1
; H
0
] 1
Al ne della verica del sistema di ipotesi (5.12), organizzate le frequenze osservate
in una martrice, diciamo x, di dimensione r s, possiamo ricorrere alla funzione
chisq.test ed impartire il comando:
chisq.test(x, correct = FALSE)
Senza entrare in dettagli, osserviamo che ponendo correct=TRUE, che rappresenta la
situazione di default, la funzione provvede in modo automatico ad applicare correzione
dello Yates, cio`e ricorre alla funzione test:
X
2
=
r

i=1
s

j=1
(n
ij
n
ij
0.5)
2
n
2
ij
qualora si operi su campioni poco numerosi.
Esempio 5.3.11 Un campione casuale di 200 individui adulti `e stato classicato in base al
sesso e loccupazione, ottenendo la seguente ditribuzione congiunta di frequenze:
Occupazione Sesso Maschio Femmina
Occupato 100 50
Disoccupato 20 30
Al ne di vericare se vi sia una relazione di dipendeza tra il sesso e loccupazione, ricorriamo
al test chisq.test():
> x<-matrix(c(100,20,50,30),2,2)
> chisq.test(x,correct=FALSE)
Pearsons Chi-squared test
data: x
X-squared = 11.1111, df = 1, p-value = 0.0008581
Dal momento che il pvalue associato al test `e decisamente piccolo, saremo portati a rigettare
lipotesi di indipendenza tra i caratteri considerati.
Esempio 5.3.12 Un dado viene lanciato 1000 volte dando luogo alla seguente distribuzione
empirica:
153
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Punteggi x
i
1 2 3 4 5 6
Frequenze n
i
142 186 157 177 176 162
Possiamo pensare che il dado sia equilibrato?
Il problema pu`o essere risolto confrontando la distribuzione delle frequenze empiriche con la
distribuzione delle frequenze che ci aspetteremo di osservare qualora il dado fosse regolare,
cio`e sotto lipotesi H
0
: n
i
= 1000/6 = 166.6667. Ricorriamo, pertanto, ad una verica di
ipotesi basata sulla funzione test (5.13).
> dadi<-sample(c(1:6), 1000, replace = TRUE)
> table(dadi)
1 2 3 4 5 6
142 186 157 177 176 162
> chisq.test(table(dadi))
Chi-squared test for given probabilities
data: table(dadi)
X-squared = 7.748, df = 5, p-value = 0.1707
In sostanza possiamo accettare lipotesi che il dado sia equilibrato. Si osservi che, se `e il caso,
possiamo passare in modo diretto i valori delle frequenze teoriche alla funzione chisq.test
con lopzione p=(...), che per default `e rep(1/length(x), length(x)).
154
Capitolo 6
Alcune note sui modelli lineari
Nel seguito vedremo come sia possibile arontare e risolvere in R alcuni problemi che
concernono modelli statistici lineari e, in particolare, ci occuperemo, seppur a grandi
linee data la vastit`a dellargomento, dellanalisi della regressione e dellanalisi della
varianza.
Diciamo subito che non ci occuperemo della costruzione di routine di caclolo ad hoc,
ma piuttosto illustreremo come sfruttare le principali funzioni presenti in R e raccolte
nella libreria base che in linea di massima si basano sui comandi lm, acronimo di
linear model, e aov, acronimo di analysis of variance.
6.1 La regressione lineare semplice: il modello teorico
Se consideriamo una v.c. doppia (X, Y ) a componenti non indipendenti, `e chiaro che
la conoscenza del valore assunto da X viene a modicare il nostro grado di incertezza
circa la realizzazione di Y ; in generale tale incertezza viene a diminuire, dal momento
che la distribuzione di Y condizionata allevento X = x viene a possedere in media
una varianza pi` u piccola
1
della varianza di Y .
In tutte quelle situazioni in cui si pu`o ipotizzare che un fenomeno, descrivibile me-
diante la v.c. X abitualmente detta variabile esplicativa o predittiva, possa essere
impiegato per spiegare quello descritto dalla v.c. Y , detta variabile variabile rispo-
sta, si `e portati a ricercare un legame funzionale del tipo Y

= f(X) che possa orire
una previsione per Y tramite X; in particolare si tratta di individuare una funzione f
tale che IE[Y f(X)] = 0 ed al contempo sia il pi` u vicino possibile ad Y ad esempio
in media quadratica, ovvero minimizzi IE[(Y f(X))
2
].
Dalla teoria `e noto che tali condizioni sono soddisfatte ponendo f(X) = IE[Y |X].
Tale funzione, che ad una determinazione x di X associa IE[(Y |X = x], viene detta
funzione di regressione di Y rispetto a X e, ssato un sistema di riferimento ortogonale
cartesiano, il corrispondente graco viene indicato quale curva di regressione di Y
1
Il fatto che IE[V ar(Y |X)] V ar[Y ] discende dal teorema della Scissione della Varianza Totale.
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
rispetto a X. La bont`a dellapprossimazione di Y mediante IE[Y |X], lo ricordiamo,
viene misurata attraverso il rapporto di correlazione di Pearson, dento come:

2
Y |X
=
V ar[IE[Y |X]]
V ar[Y ]
Alla luce di tali considerazioni, possiamo, dunque, porre:
Y = IE[Y |X] + (6.1)
dove = Y IE[Y |X] rappresenta il residuo della regressione o componente di distur-
bo; pi` u in particolare si pu`o dimostrare che trattasi di una v.c. non correlata n`e con
X n`e con IE[Y |X], per la quale si ha IE[] = 0 e V ar[] = V ar[Y ] (1
2
Y |X
).
6.2 La regressione lineare
Sorge naturale, a questo punto, il problema della scelta del legame funzionale f(X); a
tal proposito, perlomeno dal punto di vista applicativo, notevole importanza
2
riveste
il caso in cui per esso si scelga un polinomio di primo grado, cio`e si ponga:
IE[Y |X] = + X
s` che la (6.1) diviene:
Y = + X + (6.2)
Sotto tale ipotesi di lavoro, `e facile dedurre:
= IE[Y ] IE[X]
=
Cov(X, Y )
V ar[X]
=

Y

X
Ci`o premesso, la funzione di regressione di Y rispetto a X viene ad assumere la forma:
Y = IE[Y ] +

Y

X
(X IE[X]) + (6.3)
e viene abitualmente detta retta di regressione di Y rispetto a X.
Se si considera la varianza di ambo i membri della (6.3): V ar[Y ] =
2
V ar[Y ] +V ar[],
segue:
V ar[] = V ar[Y ] (1
2
) (6.4)
a riprova che nel caso di regressione lineare:
2
Y |X
=
2
.
2
Si osservi che qualora la v.c. doppia (X, Y ) possegga distribuzione normale bivariata, allora
IE[Y |X = Y +XY
2
X
(X X), dove XY = Cov(X, Y ).
156
E. D. Isaia, Linguaggio R e applicazioni statistiche
6.2.1 Stima della retta di regressione in base ai valori campionari
Supponendo ora vera lipoesi IE[Y |X] = + X, e dispondendo di un campione ca-
suale (X, Y) = ((X
1
, Y
1
), (X
2
, Y
2
), . . . , (X
n
, Y
n
)) di dimensione n > 2 tratto dalla v.c.
bivariata (X, Y ), il problema che ci si pone, perlomeno dal punto di vista statistico, `e
quello della stima dei parametri e nonche della varianza del termine di disturbo.
Data la n-pla campionaria (x
i
, y
i
)
i=1,2,...,n
, si tratter`a, dunque, di individuare i para-
metri della retta, di equazione poniamo y = a +b x, interpolante la nuvola di punti
di coordinate (x
i
, y
i
); il ricorso al metodo dei minimi quadrati comporta, com`e noto,
la minimizzazione della funzione:
F(a, b) =
n

i=1
(y
i
y
i
)
2
=
n

i=1
(y
i
a b x
i
)
2
La condizione
F
a
=
F
b
= 0, porge il sistema delle equazioni normali:
_
_
_

n
i=1
(y
i
a b x
i
) = 0

n
i=1
(y
i
a b x
i
) x
i
= 0
(6.5)
da cui facilmente:
b =

n
i=1
(y
i
y) (x
i
x)

n
i=1
(x
i
x)
2
=
Cov(x, y)
s
2
x
= r
s
y
s
x
(6.6)
a = y b x (6.7)
e quindi y = y +r
s
y
s
x
(x x) viene a rappresentare la versione empirica della retta di
regressione posta in (6.3).
Chiaramente, al variare della n-pla campionaria (x
i
, y
i
), le grandezze x, y, s
2
x
, s
2
y
,
r, y, a e b altro non sono che realizzazioni di altrettante v.c.; queste ultime due in
particolare sono determinazioni, rispettivamente, degli stimatori A e B deniti:
A =

Y B

X (6.8)
B =

n
i=1
(Y
i


Y ) (X
i


X)

n
i=1
(X
i


X)
2
(6.9)
157
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Desiderando procedere, si pu`o dimostrare che trattasi
3
di stimatori corretti, nel senso
che IE[A] = e IE[B] = , con varianza
4
, ssate le realizzazioni x
i
delle n v.c. X
i
:
V ar [B] =

2

n
i=1
(x
i
x)
2
(6.10)
V ar [A] =
2
_
_
1
n
+
x
2

n
i=1
(x
i
x)
2
_
_
=

2
n
+ x
2
V ar [B] (6.11)
Senza voler vericare la veridicit`a di tale aermazione, ci limitiamo ad osservare
che le dimostrazioni partono dalla semplice considerazione che il valore atteso del
valore atteso di uno stimatore condizionatamente alle realizzazioni x
i
delle n v.c. X
i
corrisponde al valor medio dello stimatore stesso.
Dal momento poi che IE[Y |X = x] = + x, possiamo aermare che y = a + b x `e
una stima corretta di + x. Quanto alla varianza dello stimatore

Y , avremo:
V ar
_

Y
_
=
2
_
_
1
n
+
(x x)
2

n
i=1
(x
i
x)
2
_
_
(6.12)
`
E bene osservare che il parametro incognito
2
, che compare in modo esplicito nelle
(6.10), (6.11) e (6.12), altro non `e che la varianza delle Y
i
, date le realizzazioni x
i
delle v.c. X
i
, cio`e:

2
= V ar[Y
i
|X
i
= x
i
] = V ar[]
Quale sua stima sorge spontaneo ricorrere alla varianza campionaria dei residui:
S
2
e
=

n
i=1
(Y
i


Y
i
)
2
n 1
tuttavia tale stimatore non risulta corretto. Infatti si pu`o dimostrare che:
n

i=1
(Y
i


Y
i
)
2
=
2
n

i=1
(1 h
i
) =
2
(n
n

i=1
h
i
) =
2
(n 2) (6.13)
dove, per X = x
i
ssato:
h
i
=

n
i=1
x
2
i
2 x
i

n
i=1
x
i
+nx
2
i
n

n
i=1
x
2
i
(

n
i=1
x
i
)
2
(6.14)
3
In verit`a essi risultano stimatori corretti a varianza minima. Per inciso tali stimatori non risultano
tra loro stocasticamente inipendenti.
4
E ci`o indipendentemente dalla legge di distribuzione delle v.c. coinvolte.
158
E. D. Isaia, Linguaggio R e applicazioni statistiche
e quindi stimatore corretto di
2
risulta:
S
2
=

n
i=1
(Y
i


Y
i
)
2
n 2
(6.15)
6.2.2 Veriche di ipotesi circa i parametri della retta di regressione
I risultati sin qui proposti prendevano le mosse dalla semplice considerazione che la
funzione di regressione di Y rispetto a X fosse esprimibile mediante un polinomio di
primo grado, cio`e IE[Y |X] = + X; in sostanza senza fare alcuna ipotesi circa le
distribuzioni delle v.c. coinvolte.
Ipotizzando, ora, che la v.c. abbia distribuzione N
_
0,
2
_
, allora la v.c. Y |X = x
segue una distribuzione N
_
+ x,
2
_
e pertanto:
A N
_
_
,
2
(
1
n
+
x
2

n
i=1
(x
i
x)
2
)
_
_
B N
_
_
,

2

n
i=1
(x
i
x)
2
_
_

Y N
_
_
+ x,
2
(
1
n
+
(x x)
2

n
i=1
(x
i
x)
2
)
_
_
mentre la v.c.
(n 2) S
2

2
viene a possedere distribuzione
2
n2
; inoltre, si dimostra
che essa `e indipendente da

Y , A e B.
Sotto tali ipotesi, dunque, le v.c. (statistiche test):
T
a
=
A
S

_
1
n
+
x
2

n
i=1
(x
i
x)
2
(6.16)
T
b
=
B
S

_
1

n
i=1
(x
i
x)
2
=
(B ) S
X
S

n 1 (6.17)
vengono entrambe a possedere distribuzione t di Student con n 2 gradi di libert`a.
159
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Tali considerazioni consentono di costruire di intervalli di condenza o eettuare veri-
che di ipotesi sui parametri del modello. A tal proposito, le ipotesi che abitualmente
vengono poste a confronto sono del tipo:
_
H
0
: = 0
H
1
: = 0
(6.18)
_
H
0
: = 0
H
1
: = 0
(6.19)
Per completezza, presentiamo un test che, basandosi sullanalisi della varianza della
regressione, ore indicazioni circa la la bont`a di adattamento dei dati alla retta di
regressione.
Dal momento che la devianza (totale) di Y pu`o essere scissa come:
n

i=1
(Y
i


Y )
2
. .
SS
Tot
=
n

i=1
(Y
i


Y )
2
. .
SS
E
+
n

i=1
(

Y
i


Y )
2
. .
SS
R
(6.20)
abbiamo:
per cose ormai note:
n

i=1
(Y
i


Y )
2

2
=
SS
E

2

2
n2
se, e solo se, `e vera lipotesi H
0
: = 0:
n

i=1
(Y
i


Y )
2

2
=
SS
Tot

2

2
n1
ed inoltre
5
:
n

i=1
(

Y
i


Y )
2

2
=
SS
R

2
=
n

i=1
B(X
i


X)
2

2

2
1
5
Si ricordi che per le ipotesi di lavoro
2

n
i=1
(B ) (Xi

X)
2

2
1
in quanto quadrato di
una N(0, 1).
160
E. D. Isaia, Linguaggio R e applicazioni statistiche
Osservando inne, lindipendenza tra le v.c.

n
i=1
(Y
i


Y )
2
e

n
i=1
(

Y
i


Y )
2
, vera
lipotesi H
0
: = 0, il rapporto tra le devianze SS
R
e SS
E
ciascuna delle quali divisa
per i rispettivi gradi di libert`a, cio`e:
(n 2)
n

i=1
(

Y
i


Y )
2
n

i=1
(Y
i


Y )
2
=
(n 2) SS
R
SS
E
(6.21)
viene a possedere
6
distribuzione F di Snedecor con un grado di libert`a a numeratore
ed n 2 gradi di libert`a a denominatore.
Ladeguatezza del modello di regressione pu`o pertanto essere vericata in base al
p value associato al valore di F sperimentale. Valori di F sperimentale prossimi
allo zero possono essere spiegati da elevati valori di
2
oppure possono suggerire che
il modello non spieghi in modo esaustivo il comportamento della variabile risposta.
Osservazione 6.2.1 Nel caso di modello di regressione lineare, il test di adeguatezza
appena illustrato viene a corrispondere al test circa il coeciente di correlazione
lineare:
_
H
0
: = 0
H
1
: = 0
(6.22)
Infatti, nel caso in esame, se osserviamo che:
1
n

n
i=1
(Y
i


Y )
2
=
_
1 R
2
_
S
2
Y
n 1
n
il rapporto posto in (6.21) pu`o essere riscritto come:
(n 2)
R
2
1 R
2
Tale v.c., sotto lipotesi nulla = 0 viene a possedere distribuzione t di Student con
(n 2) gadi di libert`a; ora, per cose note, risulta (T
n2
)
2
= F(1; n 2).
6
In virt` u del Teorema di Cochran.
161
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
6.2.3 Alcune considerazioni circa la previsione
Si immagini di volere prevedere, tramite il modello di regressione, il valore della
variabile risposta Y in corrispondenza ad unulteriore determinazione di interesse x
0
di X non osservata. Una sua stima puntuale,

Y
0
, la si ottiene semplicemente ponendo

Y
0
= a + b x
0
, ma per cose ovvie essa di per se `e di scarso interesse. Nel seguito si
vedr`a come sia possibile pervenire alla costruzione di un intervallo di previsione per
per la stima stessa.
Da quanto esposto al paragrafo precedente, le v.c.

Y
0
e Y |X = x
0
posseggono
distribuzione Normale entrambe con valor medio + x
0
e varianza rispettivamente:
V ar[

Y
0
] =
2
_
_
1
n
+
(x
0
x)
2

n
i=1
(x
i
x)
2
_
_
e:
V ar[Y |X = x
0
] =
2
Ora, mentre

Y
0
dipende dalla n-pla di valori osservati x
1
, x
2
, . . . , x
n
, Y |X = x
0
dipen-
de unicamente dal valore futuro x
0
; quindi, supponendo indipendenti le realizzazioni
della v.c. disturbo , possiamo aermare lindipendenza tra le v.c.

Y
0
e Y |X = x
0
.
Segue, dunque, che la v.c. (Y |X = x
0
)

Y
0
possiede distribuzione Normale con valor
medio nullo e varianza:
V ar[(Y |X = x
0
)

Y
0
] =
2
_
_
1 +
1
n
+
(x
0
x)
2

n
i=1
(x
i
x)
2
_
_
Si osservi come la varianza dellerrore di previsione dipende da due fattori e preci-
samente: dalla varianza intrinseca della v.c. Y |X = x
0
, cio`e
2
, e dalla variabilit`a
indotta dalle stime dei parametri e del modello di regressione, che contrariamente
alla prima pu`o essere ridotta aumentando la dimensione del campione.
Da quanto sopra, la v.c. standardizzata:
(Y |X = x
0
)

Y
0
S

_
1 +
1
n
+
(x
0
x)
2

n
i=1
(x
i
x)
2
viene a possedere distribuzione t di Student con n 2 gradi di libert`a, per cui
lintervallo di previsione per la stima y
0
, sar`a:
y
0

n2
t
1/2
s

_
1 +
1
n
+
(x
0
x)
2

n
i=1
(x
i
x)
2
(6.23)
162
E. D. Isaia, Linguaggio R e applicazioni statistiche
Si noti come lintervallo di previsione sia pi` u ampio, a parit`a di , del corrispondente
intervallo di condenza per y
i
:
y
i

n2
t
1/2
s

_
1
n
+
(x
i
x)
2

n
i=1
(x
i
x)
2
(6.24)
6.2.4 Alcune considerazioni sullanalisi dei residui
Lanalisi dei residui y
i
y
i
riveste un ruolo non secondario in quanto essa pu`o essere
di aiuto per
(a) la verica di alcune ipotesi di base, quali la linearit`a, lomoshedasticit`a, la
normalit`a degli errori stessi, ...;
(b) lindividuazione di eventuali valori anomali e/o di osservazioni che hanno un
peso determinante nel processo di stima del modello di regressione.
Generalmente e sicuramente in prima battuta, tale analisi viene condotta per via
empirica ricorrendo ai seguenti diagrammi a dispersione:
residui y
i
y
i
in funzione dei valori teorici y
i
;
residui standardizzati
7
y
i
y
i
s
_
1 h
i
in funzione dei valori teorici y
i
;
quantili empirici dei residui in funzione dei quantili teorici di una N(0, 1).
i quali non devono lasciare trasparire alcuna tendenza.
Quanto al precedente punto (b), oltre allanalisi graca teste proposta, pu`o essere di
aiuto lo studio delle cosidette distanze di Cook le quali (Cook, Weisberg 1982) con-
sentono di individuare linuenza esercitata sulla stima del coeciente di regressione
da ciascuna osservazione x
i
. Senza entrare in dettagli, osserviamo che, per ciascun
x
i
, esse possono essere denite:
d
i
=
_
y
i
y
i
s (1 h
i
)
_
2
h
i
2
(6.25)
Dal punto di vista pratico, un valore di d
i
prossimo o maggiore dellunit`a indica
uninuenza anormale sulla stima.
Si tenga presente, per concludere, che ad un residuo elevato pu`o corrispondere un
valore anomalo, tuttavia unosservazione anomala pu`o presentare un residuo piccolo
o adirittura nullo. Per approfondimenti sullargomento si confronti, ad esempio, il
testo di Belsley, Kuh e Welsch (1980).
7
A tal proposito si ricordi la (6.13) e la (6.14).
163
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
6.3 La regressione lineare semplice in R
Desiderando eettuare unanalisi della regressione lineare in R, cos` come delineata nei
paragra precedenti, si pu`o ricorrere alla funzione lm(), il cui output `e un oggetto con
struttura di lista, i cui elementi possono essere visualizzati e/o acquisiti per successive
elaboarazioni nel corso di una seduta di lavoro. Dal momento che trattasi di una
funzione assai essibile e ricca di una vasta gamma di opzioni, nel seguito introdurremo
dapprima i comandi di base, rimandando ai paragra successivi la descrizione di alcune
opzioni di interesse.
6.3.1 La funzione lm(): denizione del modello di regressione
Raccolte le osservazioni campionarie (x
i
, y
i
)
i=1,2,...,n
nei due oggetti x e y, il primo
passo consiste nella denizione del modello di regressione; per il modello lineare posto
in (6.2), `e suciente il comando:
> lm(formula = y~x)
o pi` u semplicemente:
> lm(y~x)
In seguito a tale comando, R visualizza, per default, le stime dei parametri e del
modello e ci`o in accordo alla (6.7) e (6.6).
Esempio 6.3.1 Com`e noto la concentrazione di ozono (Y ), espressa in mg per m
3
, nelle
grandi aree metropolitane dipende, oltre che da altri fattori, in gran misura dalla temperatura
ambientale (X). I dati che seguono riguardano un campione di n = 26 osservazioni, tratte
casualmente da una banca dati delle misurazioni registrate da una centralina di controllo in
altrettanti giorni feriali dei mesi di giugno e luglio alle ore 12.00 nei pressi di unimportante
crocevia:
x
i
22 24 25 25 26 26 26 26 27 27 27 27 28
y
i
9 23 21 22 31 44 45 59 9 39 65 128 16
x
i
28 29 30 30 30 31 32 32 32 34 34 36 36
y
i
28 35 44 73 78 66 89 110 122 85 118 76 84
Posto che la relazione che lega la concentrazione di ozono e la temperatura ambientale possa
essere riassumibile dal modello lineare Y = + X, la stima dei parametri ci viene oerta
dalle istruzioni:
> x<-c(22,24,25,25,26,26,26,26,27,27,27,27,28,
28,29,30,30,30,31,32,32,32,34,34,36,36)
> y<-c(9,23,21,22,31,44,45,59,9,39,65,128,16,
164
E. D. Isaia, Linguaggio R e applicazioni statistiche
28,35,44,73,78,66,89,110,122,85,118,76,84)
> lm(y~x)
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
-131.332 6.578
s` che la stima della retta di regressione diviene y
i
= 131.332 + 6.578 x
i
.
A proposito della fase di denizione del modello di regressione lineare, `e bene tenere a
mente che, posti x e y gli oggetti contenenti le n osservazioni campionarie, le istruzioni:
> lm(y~x)
> lm(y~+1+x)
sono equivalenti e deniscono entrambe il modello di regressione Y = + X, mentre
le istruzioni:
> lm(y~0+x)
> lm(y~-1+x)
> lm(y~x-1)
deniscono il modello Y = X, privo quindi della costante .
Concludiamo osservando che, anche se non necessario, `e tuttavia buona norma:
strutturare le osservazioni campionarie sottoforma di data frame e impartire
successivamente il comando lm(formula=...,data=data.frame); in tal caso, i
dati sono disponibili senza dover ricorrere allistruzione attach();
introdurre un nuovo oggetto, con struttura di formula, che servir`a appunto
a denire il modello di regresione lineare di interesse. Ad esempio valgano le
istruzioni:
> x<-c(...)
> y<-c(...)
> dati<-data.frame(Risposta=y,Predittore=x)
> formulayx<-as.formula(paste(names(dati)[1],"~",names(dati)[2]))
> formulayx
Risposta ~ Predittore
165
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
denire un nuovo oggetto che conterr`a sia il modello che i risultati dellana-
lisi di regressione richiesta; a tal ne sar`a suciente, ad esempio, listruzione
modello.analisi.1<-lm(formula=...,data=...). Lespressione del modello
di regressione in esame pu`o essere visualizzata in qualsiasi istante con listruzione
formula(modello.analisi.1)
Esempio 6.3.2 Con riferimento alla situazione di cui allEsempio 6.3.1, risultati del tutto
equivalenti, ma in forma pi` u ordinata, si ottengono ricorrendo alle seguenti istruzioni:
> x<-c(22,24,25,25,26,26,26,26,27,27,27,27,28,
28,29,30,30,30,31,32,32,32,34,34,36,36)
> y<-c(9,23,21,22,31,44,45,59,9,39,65,128,16,
28,35,44,73,78,66,89,110,122,85,118,76,84)
> (ozono.yx<-data.frame(Temperatura=x,Risposta=y))
Temperatura Risposta
1 22 9
2 24 23
3 25 21
... ... ...
24 34 118
25 36 76
26 36 84
> (formula.es1<-as.formula(paste(names(ozono.yx)[2],"~",names(ozono.yx)[1])))
Risposta ~ Temperatura
> modello.es1<-lm(formula.es1,data=ozono.yx)
> modello.es1
Call:
lm(formula = formula.es1, data = ozono.yx)
Coefficients:
(Intercept) Temperatura
-131.332 6.578
> formula(modello.es1)
Risposta ~ Temperatura
Va da se che, alla luce di quanto sopra, avremmo potuto denire:
> formula.es1<-as.formula(paste(names(ozono.yx)[2],"~1+",names(ozono.yx)[1]))
> formula.es1
Risposta ~ 1 + Temperatura
ottenendo, coerentemente, gli stessi risultati.
166
E. D. Isaia, Linguaggio R e applicazioni statistiche
6.3.2 La funzione lm(): oggetti creati in modo automatico
Come gi`a si `e detto, loutput completo della funzione lm() consiste in un oggetto
con struttura di lista, i cui elementi possono essere elencati mediante il comando
names(lm(formula=...,...)), il quale porge, appunto:
> names(lm(formula=...,...))
[1] "coefficients" "residuals" "effects"
[4] "rank" "fitted.values" "assign"
[7] "qr" "df.residual" "xlevels"
[10] "call" "terms" "model"
Ciascun elemento di tale lista pu`o essere visualizzato o acquisito per successive elabo-
razioni tramite il comando lm(...)$nome.elemento o, in modo del tutto equivalente,
con nome.elemento(lm(...)); ad esempio:
lm(...)$coefficients coefficients(lm(...))
lm(...)$fitted.values fitted.values(lm(...))
lm(...)$residuals residuals(lm(...))
Esempio 6.3.3 Sempre con riferimento alla situazione di cui agli Esempi 6.3.1 e 6.3.2, le
stime del modello di regressione lineare in esame nonche i valori teorici (o stimati) y
i
, con
i = 1, 2, . . . , n, possono essere visualizzati, con unapprossimazione alla seconda cifra decimale,
mediante le istruzioni:
> coefficients(modello.es1)
(Intercept) Temperatura
-131.332357 6.578188
> round(fitted.values(modello.es1),2)
1 2 3 4 5 6 7 8 9 10 11
13.39 26.54 33.12 33.12 39.70 39.70 39.70 39.70 46.28 46.28 46.28
12 13 14 15 16 17 18 19 20 21 22
46.28 52.86 52.86 59.44 66.01 66.01 66.01 72.59 79.17 79.17 79.17
23 24 25 26
92.33 92.33 105.48 105.48
A questo punto, siamo in grado di costruire un graco come quello proposto in gura (??.a);
a tal ne, infatti, sopperiscono le istruzioni:
> attach(ozono.yx)
> plot(Temperatura,Risposta,xlim=c(20,40),ylim=c(0,150),frame.plot = FALSE,
xlab="Temperatura (x)",ylab="Ozono (y)",pch=20,col="blue")
> lines(Temperatura,modello.es1$fitted,col="red",cex=1.5)
> detach(ozono.yx)
> grid()
167
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
oppure, in modo pi` u diretto:
> plot(ozono.yx,xlim=c(20,40),ylim=c(0,150),frame.plot = FALSE,
xlab="Temperatura (x)",ylab="Ozono (y)",
pch=20,col="blue")
> abline(modello.es1,col="red",cex=1.5)
> grid()
ottenendo il graco proposto in gura (??.b).
6.3.3 La funzione lm(): veriche di ipotesi sulle stime
Come `e noto, alla stima puntuale dei parametri di un modello di regressione si dovr`a
aancare la verica di ipotesi cos` come poste in (6.18) e (6.19). In R ci`o `e possibile,
ferma restando lassunzione che N
_
0,
2
_
, ricorrendo allistruzione:
> summary(lm(formula=... ,...))$coefficients
la quale porge, quale sottoforma di tabella, le stime (puntuali) dei parametri del
modello specicato, i rispettivi errori standard, i corrispondenti valori sperimentali
delle statistiche test adottate, in accordo alle (6.16) e (6.17), nonche il p value ad
essi associato.
A tal propostio `e bene tenere a mente che, nonostante lequivalenza, asserita al
paragrafo precedente, tra le istruzioni:
> lm(formula=... ,...)$coefficients
> coefficients(lm(formula=... ,...))
loutput del comando summary(coefficients(lm(formula=... ,...))) non avreb-
be alcun senso, in quanto esso porgerebbe, per le stime ottenute, la media, i quartili,
nonche il minimo ed il massimo.
Esempio 6.3.4 Con riferimento alla situazione di cui allEsempio 6.3.1, abbiamo:
> summary(modello.es1)$coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) -131.332357 42.474389 -3.092036 0.0049817779
Temperatura 6.578188 1.460964 4.502636 0.0001471189
Dal momento che i p value ottenuti sono prossimi allo zero, siamo portati a riutare le
ipotesi nulle H
0
: = 0 e H
0
: = 0.
Si noti come il risultato dellistruzione:
> summary(coefficients(modello.es1))
Min. 1st Qu. Median Mean 3rd Qu. Max.
-131.300 -96.850 -62.380 -62.380 -27.900 6.578
168
E. D. Isaia, Linguaggio R e applicazioni statistiche
verrebbe ad essere del tutto privo di senso.
Desiderando visualizzare anche il valore sperimentale della statistica test (6.21) ed
il corrispondente p value, onde avere unidea circa la bont`a di adattamento del
modello di regressione specicato, conviene ricorrere allistruzione:
> summary(lm(formula=... ,...))
la quale porge:
alcune statistiche riassuntive circa i residui della regressione;
la tabella riguardante la verica delle ipotesi (6.18) e (6.19) concernenti le stime
dei parametri del modello;
lerrore standard dei residui s, in accordo alla (6.15), con i rispettivi gradi di
libert`a;
il valore del quadrato del coeciente di correlazione lineare r, nonche il corri-
spondente valore corretto (cfr. Osservazione 6.4.1);
il valore sperimentale della statistica (6.21), con i relativi gradi di libert`a a
numeratore e denominatore, nonche il p value corrispondente.
Esempio 6.3.5 Sempre con riferimento alla situazione di cui allEsempio 6.3.1, da quanto
sopra, abbiamo:
> summary(modello.es1)
Call:
lm(formula = formula.es1, data = ozono.yx)
Residuals:
Min 1Q Median 3Q Max
-37.28 -19.14 -5.49 11.45 81.72
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -131.332 42.474 -3.092 0.004982 **
Temperatura 6.578 1.461 4.503 0.000147 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 26.99 on 24 degrees of freedom
Multiple R-Squared: 0.4579,Adjusted R-squared: 0.4353
F-statistic: 20.27 on 1 and 24 degrees of freedom,p-value: 0.0001471
169
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Nonostante un basso valore sperimentale del coeciente di correlazione lineare (r = 0.2097),
il p value prossimo a zero associato al valore sperimentale della statistica test (6.21) ci
consente di aermare che i dati campionari ben si adeguano al modello di regressione lineare
proposto.
Qui nel seguito riportiamo i comandi permettono di estrarre in modo diretto alcuni
elementi delloutput generato da summary(lm(formula=...,...)):
summary(lm(formula=...,...))$sigma: lerrore standard s;
df.residual(lm(formula=...,...)): i gradi di libert`a impiegati per il calcolo
di s
2
;
deviance(lm(formula=...,...)): la devianza tra valori eettivi e teorici, cio`e
il numeratore di s
2
;
summary(lm(formula=...,...))$r.squared: la frazione della varianza spie-
gata dalla retta di regressione ovvero il quadrato del coeciente di correlazione;
summary(lm(formula=...,...))$fstatistic: il valore sperimentale della sta-
tistica F con i corrispondenti gradi di libert`a.
Esempio 6.3.6 Con riferimento allanalisi di cui allEsempio 6.3.5 ed alla luce di quanto
sopra, si considerimo le istruzioni:
> summary(modello.es1)$sigma
[1] 26.99364
> df.residual(modello.es1)
[1] 24
> deviance(modello.es1)
[1] 17487.76
> (summary(modello.es1)$sigma)^2*df.residual(modello.es1)
[1] 17487.76
> summary(modello.es1)$r.squared
[1] 0.4579178
> summary(modello.es1)$fstatistic
value numdf dendf
20.27373 1.00000 24.00000
Loutput di summary(modello.es1)$fstatistic `e un vettore numerico di tre elementi, il
primo dei quali, il valore di F sperimentale, pu`o essere acquisito, ad esempio, con listruzione
> summary(modello.es1)$fstatistic[1]
value
20.27373
170
E. D. Isaia, Linguaggio R e applicazioni statistiche
Si osservi, inne, che loutput dellistruzione summary(modello.es1)$coefficients `e rap-
presentato da una matrice di ordine 2 4 e quindi desiderando estrarre, ad esempio, lerrore
standard associato alla stima del coeciente , sar`a suciente listruzione:
> summary(modello.es1)$coefficients[2,3]
[1] 4.502636

Osservazione 6.3.1 La funzione summary(...) sin qui impiegata `e assai generica;


nel caso dellanalisi della regressione si dovrebbe, a rigore di logica, ricorre alla fun-
zione specica summary.lm(...), nonostante i risultati siano del tutto equivalenti.
Il lettore, tuttavia, pu`o ottenere utili informazioni consultando laiuto in linea di
summary.lm.
6.3.4 La funzione predict.lm(): intervalli di condenza e di previ-
sione
Una volta stimata la retta di regressione e vericatane la bont`a di adattamento,
pu`o essere di interesse determinare, perlomeno in corrispondenza ad alcuni valori di
interesse del predittore, gli itervalli di condifenza e/o gli intervalli di previsione per la
variabile risposta, cos` come indicato al paragrafo 6.2.3.
A tal ne, nonostante sia sempre possibile redarre una funzione ad hoc basata sulle
(6.24) e (6.23), vediamo come sfruttare la particolare funzione predict.lm(...), la
cui sintassi minima `e:
predict.lm(object,data,interval=...,level=...)
dove:
object: `e loggetto, di classe lm, che denisce il modello di regressione in esame;
data: `e il data frame contenente le osservazioni campionarie di interesse (valori
osservati e/o valori futuri del predittore);
interval=: indica se trattasi di un intervallo di condenza (condence) ovvero
di previsione (prediction);
level=: specica il consueto livello di signicativit`a 1 da utilizzare. Per
default, level=0.95.
Loutput della funzione `e una matrice di dimensione n 3 contenente, in corrispon-
denza a ciascuno degli n valori del data frame specicato in data, la stima y (fit), il
limite inferiore (lwr) e quello superiore (upr) dellintervallo di interesse.
171
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
A tal proposito, desiderando ottenere un intervallo di condenza e/o di previsione per
uno o pi` u particolari valori del predittore, siano essi interni e/o esterni al range dei
valori osservati, si dovr`a creare un nuovo data fame ad hoc, contenente, appunto, tali
valori.
Esempio 6.3.7 Sempre con riferimento alla situazione di cui allEsempio 6.3.1, gli intervalli
di condenza e di previsione, al livello di condifenza del 95%, in corrispondenza a ciascuna
delle n = 26 osservazioni campionarie, si ottengono facilmente con le istruzioni:
> predict.lm(modello.es1,ozono.yx,interval="confidence",level=0.95)
fit lwr upr
1 13.38779 -9.968481 36.74406
2 26.54416 8.298502 44.78983
3 33.12235 17.188915 49.05579
... ... ... ...
24 92.32605 73.329223 111.32287
25 105.48242 81.302257 129.66259
26 105.48242 81.302257 129.66259
> predict.lm(modello.es1,ozono.yx,interval="prediction",level=0.95)
fit lwr upr
1 13.38779 -47.022124 73.79770
2 26.54416 -32.079605 85.16793
3 33.12235 -24.823454 91.06816
... ... ... ...
24 92.32605 33.464163 151.18793
25 105.48242 44.749216 166.21563
26 105.48242 44.749216 166.21563
Desideando, ora, costruire un intervallo di previsione, al livello di condifenza del 90%, per la
concentrazione di ozono in corrispondenza ad una temperatura ambientale di 23 e 38 gradi
Celsius, possiamo impartire le istruzioni:
> ozono.yx.new<-data.frame(Temperatura=c(23,38))
> predict.lm(modello.es1,ozono.yx.new,interval="prediction",level=0.90)
fit lwr upr
1 19.96598 -29.3131 69.24505
2 118.63880 66.3090 170.96861
Si osservi che le istruzioni:
> new<-data.frame(Temperatura=c(20:40))
> IC.modello.es1<-predict(modello.es1,new,interval="confidence",level=.95)
> IP.modello.es1<-predict(modello.es1,new,interval="prediction",level=.95)
> matplot(new$Temperatura,cbind(IC.modello.es1,IP.modello.es1[,-1]),
xlim=c(20,40),ylim=c(0,150),frame.plot=FALSE,type="l",
lty=c(1,2,2,5,5),col=c("blue","red","red","black","black"),
172
E. D. Isaia, Linguaggio R e applicazioni statistiche
ylab="Concentrazione di ozono",xlab="Temperatura ambientale")
> testo<-c("Stime","Retta di regressione","I.C. (95%)","I.P. (95%)")
> legend(20,148,lty=c(0,1,2,5),merge=TRUE,pch=c("+",-1,-1,-1),
legend=testo,col=c("green","blue","red","black"),cex=.85,bty="n")
> grid()
> points(ozono.yx$Temperatura,drop(modello.es1$fitted),type="p",pch="+",
cex=2,col="green")
consentono di ottenere la gura (??) che riporta il graco della nuvola di punti di coordinate
(x
i
, y
i
), della stima della retta di regressione, nonche i rami di iperbole corrispondenti ai limiti
inferiore e superiore degli intervalli di condenza e di previsione test`e ottenuti.
6.3.5 Per unanalisi dei residui
Alla stima ed alla verica delle ipotesi statistiche concernenti i parametri di un modello
di regressione `e buona norma, per i motivi di cui gi`a si `e detto, far seguire unanalisi
empirica dei residui,
In R ci`o `e possibile semplicemente ricorrendo alla funzione plot(lm(formula=...)),
la quale porge, in modo del tutto automatico, i graci di cui si disse al paragrafo
6.2.4.
Esempio 6.3.8 Sempre riprendendo i dati di cui allEsempio 6.3.1, le istruzioni:
> par(mfrow=c(2,2))
> plot(modello.es1,col="blue")
> par(mfrow=c(1,1))
producono i graci riportati in gura (??). *** eventuale commento ***
Val qui la pena vedere in dettaglio le possibili istruzioni che consentono di ottenere
i residui standardizzati nonche le distanze di Cook. Dal momento che entrambe
dipendono in modo esplicito dalle quanti`a h
i
, che come si `e visto concorrono alla stima
della varianza dei residui
2
, vediamo dapprima come calcolare tali grandezze.
Posto che gli oggetti xi e yi contengano le n osservazioni campionarie (x
i
, y
i
), denito
il modello di regressione lineare modello<-lm(yi~xi), ricordando la (6.14), abbiamo:
> hi<-(sum(xi^2)-2*xi*sum(xi)+n*xi^2)/(n*sum(xi^2)-(sum(xi))^2)
da cui, introdotti gli oggetti:
> residui<-modello$residuals
> summary.lm(modello)$sigma
essendo i residui standardizzati
y
i
y
i
s
_
1 h
i
, si ha:
173
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> residui.std<-residui/(s*sqrt(1-hi))
ed inne, ricordando la (6.25):
distanze.cook<-(residui/(s*(1-hi)))^2*(hi/2)
Tuttavia R prevede una particolari funzioni che consentono il calcolo diretto di tali
grandezze, pi` u precisamente trattasi delle funzioni:
lm.influence(lm(formula=...,...)): essa fornisce, sottoforma di lista, i
seguenti oggetti:
hat: i valori h
i
in corrispondenza a ciascuna realizzazione x
i
di X;
coefficients: le dierenze
8
a a
i
, b b
i
, ovvero le dierenze tra le
stime di e di e quelle che si otterrebbero qualora si escludesse la i-esima
osservazione campionaria, e ci`o i = 1, 2, . . . , n;
sigma: le stime s
2
i
di
2
qualora si escludesse la i-esima osservazione
campionaria, e ci`o i = 1, 2, . . . , n;
I valori contenuti in coefficients e sigma possono essere utilizzati per indi-
viduare quali sono le realizzazioni x
i
di X che hanno un peso determinante nel
processo di stima del modello di regressione.
rstandard(lm(formula=...,...)): fornisce i residui standardizzati;
cook.distance(lm(formula=...,...)): porge le distanze di Cook.
Esempio 6.3.9 Sempre riprendendo i dati di cui allEsempio 6.3.1, le istruzioni: *** DA
FARE ***
> ***
*** eventuale commento ***
Ricordiamo, inne, la possibilit`a di ricorrere alle seguenti due funzioni:
rstudent(lm(formula=...,...)): fornisce i residui studentizzati, cio`e i re-
sidui standardizzati ricorrendo alla stima s
2
i
di
2
;
8
Acquisibili ricorrendo alle istruzioni lm.influence(lm(formula=...,...))$coefficients[,1] e
lm.influence(lm(formula=...,...))$coefficients[,2].
174
E. D. Isaia, Linguaggio R e applicazioni statistiche
influence.measures(lm(formula=...,...)): porge, sottoforma di tabella ed
in corrispondenza a ciascuna determinazione x
i
di X, alcune misure riassuntive
di diagnosi dei residui
9
con indicazione, mediante asterisco, dei valori campionari
sospetti.
Esempio 6.3.10 Sempre riprendendo i dati di cui allEsempio 6.3.1, le istruzioni: *** DA
FARE ***
> influence.measures(modello.es1)
*** eventuale commento ***
6.4 Sulla regressione multipla: il modello
_
y, X,
2
I
n
_
Cappellino
Si immagini che le misurazioni, eettuate su n individui, di p+1 variabili quantitative
siano rappresentabili mediante i vettori di y, x
1
, x
2
, . . . , x
p
IR
n
, ed altres` si suppon-
ga di volere spiegare la variabile y mediante i p predittori (o variabili esplicative)
x
j
. Abitualmente tali predittori vengono supposti essere linearmente indipendenti, il
che non implica che essi lo siano anche sotto il prolo statistico
10
.
Si immagini che i vettori x
1
, x
2
, . . . , x
p
, y IR
n
costituiscano un campione casuale di
dimensione n di altrettante realizzazioni di p + 1 v.c. X
1
, X
2
, . . . , X
p
, Y .
Per cose note, la migliore approssimazione di Y mediante una funzione delle p v.c.
X
j
, abitualmente dette predittori o variabili esplicative, corrisponde al valor medio
condizionato IE[Y |X
1
, X
2
, . . . , X
p
]. Se introduciamo, ora, lipotesi:
IE[Y |X
1
, X
2
, . . . , X
p
] =
0
+
p

j=0

0
X
j
(6.26)
perveniamo al modello di regressione lineare multipla:
Y =
0
+
p

j=0

0
X
j
+
dove `e una v.c. non correlata con le v.c. X
j
, con valor medio nullo e varianza
2
.
Per le ipotesi fatte, tra le realizzazioni campionarie x
i1
, x
i2
, . . . , x
ip
,
i
, y
i
delle v.c.
X
1
, X
2
, . . . , X
p
, , Y sussiste, per j = 1, 2, . . . , p e i = 1, 2, . . . , n, la relazione:
y
i
=
0
+
p

j=0

0
X
ij
+ i
9
Tra esse i valori di hi e di di.
10
Inserire in nota un esempio semplice e breve.
175
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
che pu`o essere posta nella forma compatta:
y = X + (6.27)
dove y = [y
1
, y
2
, . . . , y
n
]
t
`e il vettore delle n realizzazioni campionarie indipendenti y
i
di Y , = [
0
,
1
, . . . ,
p
]
t
rappresenta il vettore dei parametri incogniti del modello,
= [
1
,
2
, . . . ,
n
]
t
`e il vettore degli errori
i
mentre:
X =
_

_
1 x
11
x
12
. . . x
1p
1 x
21
x
22
. . . x
2p
. . . . . . . . . . . . . . .
1 x
n1
x
n2
. . . x
np
_

_
(6.28)
`e una matrice di ordine n (p + 1) la cui prima colonna contiene i coecienti della
costante del modello e le colonne successive le realizzazioni campionarie indipendenti
delle p v.c. X
j
.
Seguento la letteratura, indichiamo il modello di regressione lineare multipla corri-
spondente alla (6.27) con la tripla
_
y, X,
2
I
n
_
, dove chiaramente I
n
`e una matrice
identit`a di dimensione n n.
6.4.1 Stima e verica di ipotesi sui parametri del modello
Il problema che ci si pone `e la stima dei parametri
O
,
1
, . . . ,
p
del modello nonche
della varianza del termine di disturbo .
Il ricorso al metodo dei minimi quadrati comporta la minimizzazione, rispetto ai p+1
parametri del modello, della funzione:
F(
0
,
1
, . . . ,
p
) =
n

i=1
(y
i

j=1

j
x
ij
)
2
Ora, come facilmente si pu`o vericare, i coecienti del sistema delle equazioni normali
corrispondono al prodotto matriciale X
t
X, infatti:
X
t
X =
_

_
n

n
i=1
x
i1

n
i=1
x
i2
. . .

n
i=1
x
ip

n
i=1
x
i1

n
i=1
x
2
i1

n
i=1
x
i1
x
i2
. . .

n
i=1
x
i1
x
ip

n
i=1
x
i2

n
i=1
x
i1
x
i2

n
i=1
x
2
i2
. . .

n
i=1
x
i2
x
ip
.
.
.
.
.
.
.
.
. . . .
.
.
.

n
i=1
x
ip

n
i=1
x
i1
x
ip

n
i=1
x
i2
x
ip
. . .

n
i=1
x
2
ip
_

_
176
E. D. Isaia, Linguaggio R e applicazioni statistiche
mentre i termini noti del sistema delle equazioni normali corrispondono al vettore
Xy, infatti:
Xy =
_

n
i=1
y
i

n
i=1
x
i1
y
i

n
i=1
x
i2
y
i
.
.
.

n
i=1
x
ip
y
i
_

_
Pertanto la condizione dei minimi quadrati porge, quale stima di , il vettore:
b =
_
X
t
X
_
1
X
t
y (6.29)
Ci`o premesso, `e immediato dimostare che lo stimatore b,ottenuto in accordo al metodo
dei minimi quadrati, `e uno stimatore corretto di .
Infatti, dal momento che X `e una costante ed osservando che IE[y] = X, si ha:
IE[b] = IE[(X
t
X)
1
X
t
y] = (X
t
X)
1
X
t
X =
Con un ragionamento simile, otteniamo la varianza dello stimatore b; ricordando che
V ar[y] = V ar[] =
2
I
n
, sar`a:
V ar[b] = V ar[(X
t
X)
1
X
t
y] = (X
t
X)
1
(X
t
X)
1
X
t
V ar[y] X =
=
2
(X
t
X)
1
(X
t
X)
1
X
t
I
n
X =
2
(X
t
X)
1
(6.30)
mentre una stima corretta della varianza
2
`e oerta dallo stimatore:
S
2
=
||y y||
2
n p 1
=
||y Xb||
2
n p 1
(6.31)
`
E qui appena il caso di osservare che tra tutti gli stimatori corretti di , b `e quello
a varianza minima; tale propriet`a nonche quella circa la correttezza dello stimatore
posto in (6.31) discendono dal teorema di Gauss-Markov generalizzato.
Per approfondimenti a tal riguardo, si rimanda ai testi di McCullagh, Nelder (2000)
e Saporta (1990).
Se introdiciamo, ora, lipotesi che i = 1, 2, . . . , n
i
N(0, 1), y pu`o allora essere
inteso quale vettore gaussiano multidimensionale, cio`e:
y N
n
_
X,
2
I
n
_
)
177
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
con densit`a di probabilit`a, quindi:
L(y, ,
2
) =
1

n
(

2 )
n
exp
_

(y X)
t
(y X)
2
2
_
=
1

n
(

2 )
n
exp
_

yy
t
2
t
X
t
y
t
X
t
X
2
2
_
Sotto tale ipotesi, la stima di massimaverosomiglianza per viene a coincidere con la
stima proposta in (6.29) e ottenuta con il metodo dei minimi quadrati; in pi` u, essendo
b una trasformata lineare di un vettore gaussiano, si ha:
b N
p+1
_
,
2
(X
t
X)
1
_
(6.32)
Quanto alla varianza
2
, il metodo della massimaverosomiglianza porge la stima
n
1
||yXb||
2
, la quale dovr`a, quindi, essere corretta, in accordo alla (6.31), mediante
il fattore
n
n p 1
. A tal proposito, si dimostra, poi, che:
||y Xb||
2

2
=
(n p 1) S
2

2

2
np1
(6.33)
Focalizzando lattenzione sul j-esimo coeciente di regressione empirico b
j
, in virt` u
della (6.30) sar`a:
V ar[b
j
] =
2
b
j
=
2
(X
t
X)
1
jj
(6.34)
dove (X
t
X)
jj
indica lelemento jj-esimo di (X
t
X)
1
e, ricordando la (6.31), la stima
corretta di
2
b
j
`e oerta da:
s
2
b
j
=
||y Xb||
2
n p 1
(X
t
X)
1
jj
Ne segue
11
, che la variabile test:
T
b
j
=
b
j

j
s
b
j
=
b
j

j

||y Xb||
2
n p 1
(X
t
X)
1
jj
(6.35)
viene a possedere ditribuzione t di Student con n p 1 gradi di libert`a.
11
Si noti che, per le ipotesi fatte, bj N(j,
2
b
j
).
178
E. D. Isaia, Linguaggio R e applicazioni statistiche
Tali considerazioni consentono di pervenire alla costruzionione di intervalli di con-
denza, ad un pressato livello 1 , per i p + 1 parametri incogniti
0
,
1
, . . . ,
p
o
di sottoporre a verica le seguenti ipotesi statistiche, j = 0, 1, 2, . . . , p:
_
H
0
:
j
= 0
H
1
:
j
= 0
(6.36)
con lavvertenza che le statistiche test coinvolte non risultano tra loro indipendenti,
non essendolo i coecienti b
j
tra loro.
6.4.2 Sul coeciente di correlazione multipla
Com`e noto, il coeciente di correlazione multipla tra Y e le p+1 variabili esplicative
12
pu`o essere calcolato direttamente in base alla matrice X dei coecienti del modello
di regressione lineare; infatti, indicando con X

la matrice centrata di X
13
e con
y

il vettore centrato di y
14
, risulta:
R
2
=
y

t
X

(X

t
X

)
1
X

t
y

t
y

(6.37)
Ora, un semplice calcolo consente di porre la (6.37) nella forma:
R
2
=
||y y||
2
||y Xb||
2
||y y||
2
il che indica che il quadrato del coeciente di regressione multipla pu`o essere inteso
quale rapporto tra la varianza spiegata dal modello di regressione e la varianza totale
di Y . Tale considerazione (cfr. Osservazione 6.4.1) ci permette eettuare un test
circa la bont`a di adattamento del modello di regressione sulla base di unopportuna
trasformata di R
2
.
Infatti, dal momento che:
||y y||
2
= ||y Xb||
2
+ ||Xb y||
2
e tenendo presente lipotesi intordotta sulle
i
, si ha:
:
||y Xb||
2

2

2
np1
12
Includendo la costante.
13
Ossia la matrice di di dimensione n p + 1 le cui colonne contengono gli scarti xij

xj, con
ovviamente

xj =

n
i=1

p
j=1
xij.
14
Leggasi il vettore degli scarti yi y.
179
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
vera lipotesi
j
= 0, con j = 1, 2, . . . , p e
0
qualsiasi:
||Xb y||
2

2

2
p
vera lipotesi
j
= 0, con j = 1, 2, . . . , p e
0
qualsiasi:
||y y||
2

2

2
n1
La bont`a di adattamento del modello di regressione multipla pu`o essere misurata
ricorrendo al rapporto tra la varianza spiegata dal modello di regressione e la varianza
residua, in simboli
||Xb y||
2
||y Xb||
2
=
R
2
1 R
2
.
Ora, sotto lipotesi
j
= 0, con j = 1, 2, . . . , p e
0
qualsiasi, risulta:
R
2
1 R
2
n p 1
p
F
p;np1
dove, come di consueto, F
p;np1
indica la ditribuzione F di Snedecor con, rispetti-
vamente, p gradi di libert`a a numeratore e n p 1 gradi di libert`a a denominatore.
Si tenga presente che la lettura del solo valore empirico del coeciente di correlazione
multipla potrebbe trarre in inganno; infatti si potrebbe osservare un R
2
prossimo
allunit`a e al contempo accettare in blocco le ipotesi H
0
: b
j
= 0. Tale `e certamente
il caso se i predittori sono fortemente correlati tra loro (cfr. paragrafo 6.4.4).
Osservazione 6.4.1 Laccettazione, j = 1, 2, . . . , p, delle ipotesi di nullit`a dei coef-
cienti di regressione (H
0
:
j
= 0, con
0
qualunque) equivale pertanto allaccetta-
zione che il coeciente di correlazione multiplo (teorico) sia nullo, cio`e dellipotesi
di non-regressione. Se tale `e il caso, allora viene a possedere distribuzione Beta di
parametri p/2 e (n p 1)/2, per cui:
IE[R
2
] =
p
n 1
V ar[R
2
] =
2 p (n p 1
(n
2
1) (n 1)
Viceversa se lipotesi di non-regressione `e riutata ( = 0), allora la distribuzione di
R
2
assume una forma pi` u complessa ed R
2
viene ad essere uno stimatore distorto. A
tal propostito si dimostra che IE[R
2
] =
2
+
p
n 1
(1 ) + O(n
1
). Per tali motivi
a volte si ricorre ad un valore di R
2
corretto (adjusted R squared):
R
2

=
(n 1) R
2
p
n p 1
che presenta, per`o, lo svantaggio di condurre a valori negativi (!) se il coeciente di
correlazione multipla `e prossimo allo zero.
180
E. D. Isaia, Linguaggio R e applicazioni statistiche
6.4.3 Sulla previsione e lanalisi dei residui
Dal momento che su tali argomenti valgono, in generale, le considerazioni fatte in
occasione dellanalisi della regressione lineare semplice, nel seguito ci limitiamo a
presentare alcuni risultati di interesse, rimandando per dettagli ai paragra 6.2.3 e
6.2.4.
intervallo di previsione: posto x
0
= [1, x
10
, x
20
, . . . , x
p0
]
t
il vettore contenente i
valori di interesse dei predittori i corrispondenza ai quali si desidera prevedere
il valore di y, la v.c. y
0
= x
t
0
b, sotto le ipotesi fatte circa le
i
, ha distribuzione
normale di parametri x
t
0

0
e
2
x
t
0
(X
t
X)
1
x
0
.
Posto y
0
= IE[y|X
1
= x
10
. . . X
p
= x
p0
] la v.c. standardizzata y
0
y
0
,
utilizzando lo stimatore corretto posto in (6.31):
y
0
y
0
S
_
1 +x
t
0
(X
t
X)
1
x
0
viene a possedere distribuzione t di Student con n p 1 gradi di libert`a., da
cui lintervallo di previsione per y
0
:
y
0

np1
t
1/2
s
_
1 +x
t
0
(X
t
X)
1
x
0
i residui standardizzati: prendendo le mosse dalluguaglianza y = yXb+Xb
e ricordando che (y Xb) Xb, si ha:
V ar[y] = V ar[y Xb] +V ar[Xb]
da cui:
V ar[y Xb] =
2
[I
n
X(X
t
X)
1
X
t
]
Indicando con h
i
il generico i-esimo termine della diagonale di X(X
t
X)
1
X
t
,
con n
1
h
i
1 e

n
i=1
h
i
= n p 1, abbiamo
2
y
i
y
i
=
2
(1 h
i
), donde,
sostituendo a
2
la sua stima corretta, la stima della varianza dei residui:
s
2
y
i
y
i
= s
2
(1 h
i
)
181
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
6.4.4 Sulla multicollinearit`a
La principale fonte di instabilit`a della stima di `e rappresentata dallordine di gran-
dezza delle varianze
2
b
j
; tenendo a mente la (6.34), `e facile intuire che qualora il
determinante di X
t
X fosse prossimo a zero, gli elementi di (X
t
X)
1
tenderebbero
ad assumere valori elevati e di conseguenza le
2
b
j
, s` che i parametri del modello
verrebbero ad essere stimati in modo impreciso.
Tra le svariate cause che producono tale anomalia, una `e certamente la la corre-
lazione tra le variabili esplicative; tale situazione viene indicata con il termine di
multicollinearit`a.
Desiderando, in qualche modo, vericare tale aermazione, posto, per semplicit`a,

X una matrice standardizzata


15
di dimensione n p ed indicando con con R la
matrice di correlazione tra i p predittori, `e facile vericare la relazione nR =

X
t
X.
Ci`o premesso, si ha V ar[b] =
2
n
1
R
1
e, pertanto, con riferimento al suo j-esimo
elemento, la corrispondente stima corretta pu`o essere posta nella forma:
s
2
b
j
=

2
n
(R
1
)
jj
(6.38)
dove, chiaramente, (R
1
)
jj
indica il j-esimo termine della diagonale di R
1
.
Per inciso, si osservi che (R
1
)
jj
= (1 R
2
j
)
1
, dove R
2
j
corrisponde al quadrato del
coeciente di correlazione multipla tra j-esimo predittore e le restanti p 1 variabili
esplicative. Evidentemente, qualora i predittori fossero tra loro ortogonali si avrebbe,
j = 1, 2, . . . , p, R
2
j
= 0 e di conseguenza s
2
b
j
=
2
n
1
. In particolare, poi, i termini
(1 R
2
j
)
1
vengono abitulamente detti fattori di inazione della varianza (VIF), e la
loro media pu`o essere considerata quale indice globale di multicollinearit`a.
Il problema della multicollinearit`a tra i predittori pu`o essere risolto, o perlomeno
attenuato, ricorrendo a diverse strategie
16
proposte in letteratura, quali ad esempio,
la regressione per componenti principali, la ridge regression, o le tecniche di selezione,
quali la backward regression, la forward regression o, ancora, la stepwise regression.
Gli algoritmi pi` u diusi, e implementati sulla maggior parte dei pacchetti statistici in
commercio, sono senza dubbio quelli basati sulle tecniche di selezione, anche se queste
non sono esenti da critiche, ad esempio mal si prestano l`a dove si richiede la stima di
un modello di previsione.
Sostanzialmente tali tecniche tendono a ridurre un problema di regressione multipla
a p variabili esplicative ad un analogo a q < p predittori, questi ultimi scelti tra quelli
che apportano il maggior contributo ad R
2
. In particolare:
15
In altri termini, si suppone, cio`e che tutte le variabili del modello di regressione multipla siano
standardizzate. Ovviamente, sotto tali ipotesi, si ha b = (X
t
X)
1
= (

X
t
X)
1
.
16
Presupponendo una certa discrezionalit`a, da parte del ricercatore, sul numero dei predittori che
concorrono a spiegare y.
182
E. D. Isaia, Linguaggio R e applicazioni statistiche
con la backward regression si inizia con la stima del modello completo a p
predittori e si elimina la variabile esplicativa che ha la minore inuenza su R
2
,
o equivalentemente quella che presenta il maggior p value associato al test
su
j
. Quindi si eettua una nuova stima del modello a p 1 predittori e cos`
via sino alleliminazione di p 1 variabili esplicative o al raggiungimento di una
condizione di arresto.
con la forward regression si inizia con la stima del modello ad una sola variabile
esplicativa, quella che ha maggior inuenza su R
2
, e via, via, secondo lo stesso
criterio, si aggiungono i restanti predittori. Il processo iterativo ha termine non
appena R
2
raggiunge una soglia pressata.
la stepwise regression pu`o essere intesa come un perfezionamento dellalgoritmo
della forward regression, nel senso che ad ogni passo viene eettuato un test
(su
j
o su R
2
) teso a non introdurre un predittore non signicativo oppure ad
eliminare le eventuali variabili esplicative non pi` u signicative una volta inserita
nel modello lultima variabile selezionata. Abitualmente il processo ha termine
non appena R
2
raggiunge una soglia pressata.
6.5 La regressione multipla in R
Nel caso si debba arontare unanalisi di regressione lineare multipla in R si ricorre
alla funzione lm() gi`a arontata in dettaglio e per la quale, in linea generale, valgono
le considerazioni fatte ai paragra 6.3 e successivi.
Nel seguito, pertanto, focalizzeremo la nostra attenzione alla risoluzione di problemi
pi` u specici, quali ... ***
6.5.1 Denizione del modello e listruzione model.matrix(lm(...))
Come gi`a si disse, in R `e buona norma organizzare le ossevazioni campionarie in
un data frame, introdurre in modo esplicito il modello di regressione lineare mediante
unopportuna formula, che nel caso del modello
_
y, X,
2
I
n
_
a p predittori potrebbe
presentarsi:
> formula<-as.formula(Risposta~var1+var2+ ... +varp)
o, in modeo del tutto equivalente:
> formula<-as.formula(Risposta~.)
e successivamente denire loggetto di classe lm che conterr`a i risultati di interesse
nonche altre informazioni necessarie per uleriori elaborazioni; ad esempio mediante
listruzione:
183
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
> modello<-lm(formula,data=data frame)
Un dierente modo di procedere consiste nel denire la formula a partire dal vettore
delle n osservazioni campionarie di Y e dalla matrice delle realizzazioni campionarie
dei p predittori X
j
, oggetti che potrebbero coincidere con gli elementi del data frame;
seguendo tale approccio, potrebbero valere le istruzioni:
> formula<-as.formula(y~Xp)
> modello<-lm(formula)
dove, `e bene tenerlo a mente, Xp `e una matrice di ordine n p.
Esempio 6.5.1 A puro scopo didattico, si immagini che per un modello di regressione lineare
multipla a due sole variabili esplicative si siano ottenute le seguenti osservazioni campionarie:
x
i1
8.04 6.95 7.58 8.81 8.33 9.96 7.24 4.26 10.84 4.82 5.68
x
i2
7.46 6.77 12.74 7.11 7.81 8.84 6.08 5.39 8.15 6.42 5.73
y
i
10.2 8.5 13.1 9.0 11.5 14.9 6.5 4.0 12.2 7.0 5.5
Scelto di raccogliere tali informazioni nel data frame dati composto dai tre oggetti x1, x2 e
Risposta:
> dati<-data.frame(
x1=c(8.04,6.95,7.58,8.81,8.33,9.96,7.24,4.26,10.84,4.82,5.68),
x2=c(7.46,6.77,12.74,7.11,7.81,8.84,6.08,5.39,8.15,6.42,5.73),
Risposta=c(10.2,8.5,13.1,9.0,11.5,14.9,6.5,4.0,12.2,7.0,5.5))
possiamo denire la formula per il modello di regressione Y =
0
+
1
X
1
+
2
X
2
+ e,
successivamente, loggetto modello.1 di classe lm tramite le consuete istruzioni:
> formula.1<-as.formula(Risposta~.)
> modello.1<-lm(formula,data=dati)
Alternativamente, ferma restando la sruttura del data frame dati, introdotta la matrice Xp
delle n realizzazioni campionarie y
i1
e x
i2
:
> attach(dati)
> Xp<-as.matrix(cbind(x1,x2))
> detach(dati)
possiamo denire la formula e successivamente loggetto modello.2 di classe lm come:
> formula.2<-as.formula(Risposta~Xp)
> modello.2<-lm(formula.2,data=dati)
184
E. D. Isaia, Linguaggio R e applicazioni statistiche
Naturalmente, i due oggetti modello.1 e modello.2 sono equivalenti e si riferiscono al
medesimo modello di regressione.
Ora, perlomeno in alcune situazioni, potrebbe tornare utile operare direttamente sulla
matrice X del modello
_
y, X,
2
I
n
_
. Naturalmente, questa potrebbe essere denita
in modo esplicito, ricorrendo ad esempio allstruzione:
> X<-cbind(c(rep(1,length(var1))),var1+var2+ ... +varp)
dove c(rep(1,length(var1))) crea un vettore colonna di n =length(var1) ele-
menti unitari. Tuttavia in R possiamo automatizzare tale processo ricorrendo alla
semplice istruzione:
> X<-model.matrix(modello)
Esempio 6.5.2 Come si disse, gli oggetti modello.1 e modello.2, deniti allEsempio 6.5.1,
si riferiscono entrambi al modello di regressione Y =
0
+

2
j=1

j
X
j
+ ; entrambi, quindi,
saranno dotati della stessa matrice X, la cui trasposta (X
t
) risulta infatti:
> t(model.matrix(modello.1))
1 2 3 4 5 6 7 8 9 10 11
(Intercept) 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
x1 8.04 6.95 7.58 8.81 8.33 9.96 7.24 4.26 10.84 4.82 5.68
x2 7.46 6.77 12.74 7.11 7.81 8.84 6.08 5.39 8.15 6.42 5.73
attr(,"assign")
[1] 0 1 2
> t(model.matrix(modello.2))
1 2 3 4 5 6 7 8 9 10 11
(Intercept) 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
Xpx1 8.04 6.95 7.58 8.81 8.33 9.96 7.24 4.26 10.84 4.82 5.68
Xpx2 7.46 6.77 12.74 7.11 7.81 8.84 6.08 5.39 8.15 6.42 5.73
attr(,"assign")
[1] 0 1 1
Nonostante laspetto, loutput di model.matrix(...) `e, a tutti gli eetti una matrice, infatti:
> is.matrix(model.matrix(modello.1))
[1] TRUE
e di conseguenza pu`o essere utilizzato per successive elaborazioni.
Palesemente, le considerazioni sinora fatte si applicano, mutatis mutandi, ad un
modello di regressione lineare semplice, per cui evidentemente risulta p = 1.
185
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Esempio 6.5.3 Con riferimento alla situazione di cui allEsempio 6.3.1, denita la matrice
X come X<-model.matrix(modello.es1), il vettore delle stime dei parametri
0
e
1
del
modello di regressione semplice Y =
0
+
1
X
1
+ pu`o essere calcolato in modo diretto come:
> solve(t(X)%*%X)%*%t(X)%*%y
[,1]
[1,] -131.332357
[2,] 6.578188
risultato ovviamente coincidente con louput di modello.es1.
6.5.2 Ridenizione del modello: listruzione update(lm(...))
A volte, per svariati motivi, nel corso di una sessione di lavoro pu`o accadere di dovere
ridenire un modello di regressione: aggiungere o eliminare alcuni predittori, sop-
primere la costante, ... Anziche ridenire il modello ex-novo, R prevede la funzione
update(lm(...)), la cui sintassi autoesplicativa `e:
update(lm(<old>),lm(<new>))
Posto di avere precedentemente denito loggetto modello<-lm(y~x1), si immagini
di volere vedere leetto sul coeciente di correlazione multipla R dellinserimento di
un secondo predittore x2; ci`o pu`o avvenire ricorrendo alla semplice istruzione:
> sqrt(summary(update(modello,y~x1+x2))$r.squared)
o, tpi` u brevemente ancora:
> sqrt(summary(update(modello,.~.+x2))$r.squared)
Naturalmente desiderando ridenire il modello in modo permanente si potr`a ricorrere
ad un assegnazione del tipo modello<-update(modello,. .+x2).
`
E appena il caso di ricordare che, qualora loggetto di classe lm fosse denito in base
ad una formula, questa pu`o essere aggiornata, nel senso di cui sopra, ricorrendo
allistruzione update.formula().
Esempio 6.5.4 Con riferimento alla situazione di cui allEsempio 6.3.1, denito, per il
modello di regressione Y =
0
+
1
X
1
+ , loggetto di classe lm:
> modello<-lm(Risposta~x1,data=dati)
la frazione della varianza totale di Y spiegata dal modello, ovvero R
2
, `e circa il 68%, infatti:
186
E. D. Isaia, Linguaggio R e applicazioni statistiche
> summary(modello)$r.squared
[1] 0.6796644
Lintroduzione nel modello del secondo predittore X
2
riduce ulteriormente tale indicatore e
precisamente del 21%, risultando:
> summary(update(modello,.~.+x2))$r.squared
[1] 0.8933146
A tal proposito si osservi il comportamento delle istruzioni:
> formula<-as.formula(Risposta~x1)
> summary(lm(formula,data=dati))$r.squared
[1] 0.6796644
> summary(lm(update.formula(formula, ~ . + x2),data=dati))$r.squared
[1] 0.8933146
che evidentemente porgono gli stessi risultati.
6.5.3 Sulla multicollinearit`a e la stepwise regression
Come si `e gi`a osservato, in alcune situazioni, pu`o accadere che i test sui parametri

j
conducano allaccettazione delle ipotesi nulle e ci`o indipendentemente dal valore
assunto da R
2
. Una delle possibili cause di tale comporamento `e imputabile alla
varianza delle stime, la quale, come si accenn`o al paragrafo 6.4.4, viene a sua volta
dipendere dalla matrice di correlazione tra le variabili esplicative. Nel caso, dunque,
di multicollinearit`a, si pu`o tentare di pervenire ad un modello di regressione stabile
operando discrezionalmente sul numero dei predittori da inserire nel modello stesso.
LEsempio che segue presenta un semplice problema di regressione multipla in presen-
za di multicollarineit`a tra i predittori, risolvibile eettuando una selezione manuale
delle variabili esplicative.
Esempio 6.5.5 Un campione casuale di n = 10 autovetture di piccola cilindrata ad ali-
mentazione a benzina ha fornito i seguenti risultati in corrispondenza a quattro variabili di
interesse:
Cilindrata Potenza Peso Consumi
(cc) (cv.Din) (kg) (l 100)
1075 45 750 5.0
1255 62 805 6.5
1075 45 710 4.8
1306 72 805 6.7
1455 60 820 6.5
1055 53 850 6.3
1175 57 755 4.8
1175 54 815 5.9
1375 72 810 6.4
1255 75 805 6.5
187
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Desiderando spiegare il Consumo di carburante in funzione dei tre predittori, scegliamo di
ricorrere al modello di regressione multipla Y =
0
+

3
j=1

j
X
j
+ .
Dal punto di vista pratico, inserite le osservazioni campionarie nel data frame auto e denito
il modello di regressione a tre predittori:
> auto<-data.frame(
Cilindrata=c(10.75, 12.55, 10.75, 13.06, 14.55, 10.55,
11.75,11.75, 13.75, 12.55)*100,
CV.Din=c(45, 62, 45, 72, 60, 53, 57, 54, 72, 75),
Peso=c(750, 805, 710, 805, 820, 850, 755, 815, 810, 805),
Consumo=c(5, 6.5, 4.8, 6.7, 6.5, 6.3, 4.8, 5.9, 6.4, 6.5))
> modello<-lm(Consumo~.,data=auto)
otteniamo
17
i seguenti risultati:
> summary(modello)$coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) -5.7378368 2.288926 -2.5068 0.046103
Cilindrata 0.0009164 0.001188 0.7713 0.469800
CV.Din 0.0230951 0.015522 1.4879 0.187354
Peso 0.0115907 0.003114 3.7221 0.009828
sicche saremo propensi ad accettare le ipotesi nulle circa i coecienti
1
e
2
. Tuttavia, tale
soluzione non `e certo soddisfaciente! La natura stessa dei predittori Cilindrata e Potenza fa
s` che essi siano correlati tra loro, ed infatti
18
:
> (R<-cor(model.matrix(update(modello,.~.-1))))
Cilindrata CV.Din Peso
Cilindrata 1.0000 0.7167 0.4091
CV.Din 0.7167 1.0000 0.5015
Peso 0.4091 0.5015 1.0000
donde i fattori di inazione della varianza (VIF):
> (vif<-diag(solve(R)))
[1] 2.070 2.303 1.345
nonche i coecienti di correlazione multipla tra i predittori:
> 1-(1/vif)
[1] 0.5170 0.5658 0.2566
Si noti che questi ultimi potrebbero essere calcolati in modo diretto ricorrendo, ad esempio,
allistruzione:
17
Ipotizzando la normalit`a del termine di disturbo.
18
Per una migliore leggibilit`a dei risultati, si `e scelto di porre options(digits=4).
188
E. D. Isaia, Linguaggio R e applicazioni statistiche
> cbind(summary(update(modello,Cilindrata~CV.Din+Peso))$r.squared,
summary(update(modello,CV.Din~Cilindrata+Peso))$r.squared,
summary(update(modello,Peso~Cilindrata+CV.Din))$r.squared)
[,1] [,2] [,3]
[1,] 0.517 0.5658 0.2566
Ci`o premesso, possiamo pensare di eliminare una delle due variabili esplicative al modello e
ri-sottoporre a verica i parametri dello stesso.
> summary(update(modello,.~Cilindrata+Peso))$coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) -6.963191 2.3133772 -3.010 0.019663
Cilindrata 0.002062 0.0009802 2.103 0.073507
Peso 0.013107 0.0031873 4.112 0.004502
> summary(update(modello,.~CV.Din+Peso))$coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) -5.23809 2.130841 -2.458 0.043579
CV.Din 0.03085 0.011476 2.689 0.031152
Peso 0.01179 0.003012 3.913 0.005798
Unattenta lettura dei risultati, ci porta a ritenere che il Consumo possa essere spiegato
mediante le varibili Peso e Potenza.
Si noti che saremmo giunti alle stesse conclusioni valutando:
la frazione della varianza spiegata dai due modelli a due predittori:
> summary(update(modello,.~Cilindrata+Peso))$r.squared
[1] 0.8298
> summary(update(modello,.~CV.Din+Peso))$r.squared
[1] 0.8633
la sitma della varianza
2
oerta dai due modelli a due predittori:
> summary(update(modello,.~Cilindrata+Peso))$sigma
[1] 0.3605
> summary(update(modello,.~CV.Din+Peso))$sigma
[1] 0.3230

Il problema della identicazione dei predittori nel caso di multicollinearit`a pu`o essere
arontato, come si disse al paragrafo 6.4.4, ricorrendo alla stepwise regression, tenica
implementata in R quale funzione step, la cui sintassi, perlomeno nella sua veste pi` u
dimessa, `e:
step(modello, trace=1, test="F")
189
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
A tal proposito `e bene tenere a mente che:
modello `e un oggetto di classe lm denito via lm(formula=..., ...);
con lopzione trace=0 viene soppressa la visualizzazione dei passi intermedi che
conducono al modello denitivo; la situazione di default prevede trace=1;
lopzione test="F" stabilisce quale criterio di selezione dei predittori quello
basato su R
2
;
in modo automatico, alla ne del processo, vengono elencati i predittori selezio-
nati e le corrispondenti stime dei parametri;
step(...) `e, a sua volta, un oggetto di classe lm e, in quanto tale, per esso
valgono le considerazioni fatte a proposito di tali oggetti. Ad esempio con
model.matrix(step(...,...)) viene visualizzata la matrice X associata al
modello di regressione con i k p predittori selezionati.
Esempio 6.5.6 Con riferimento alla situazione di cui allEsempio 6.5.6, la risoluzione del
problema di multicollinearit`a viene risolta, ricorrendo alla funzione step, mediante le istru-
zioni:
> step(modello,trace=1,test="F")
Start: AIC= -19.11
Consumo ~ Cilindrata + CV.Din + Peso
Df Sum of Sq RSS AIC F value Pr(F)
- Cilindrata 1 0.0659 0.7303 -20.1685 0.5949 0.469800
<none> 0.6644 -19.1139
- CV.Din 1 0.2451 0.9096 -17.9735 2.2137 0.187354
- Peso 1 1.5342 2.1987 -9.1474 13.8542 0.009828 **
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Step: AIC= -20.17
Consumo ~ CV.Din + Peso
Df Sum of Sq RSS AIC F value Pr(F)
<none> 0.7303 -20.1685
- CV.Din 1 0.7541 1.4845 -15.0754 7.2282 0.031152 *
- Peso 1 1.5979 2.3282 -10.5750 15.3151 0.005798 **
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Call:
190
E. D. Isaia, Linguaggio R e applicazioni statistiche
lm(formula = Consumo ~ CV.Din + Peso, data = auto)
Coefficients:
(Intercept) CV.Din Peso
-5.23809 0.03085 0.01179
Per concludere, osserviamo che la matrice delle osservazioni associata al modello di regressione
a due predittori e il data frame contenente le sole realizzazioni delle (tre) variabili di interesse,
possono ottenersi con le istruzioni
19
:
> t(model.matrix(step(modello,trace=0,test="F")))
1 2 3 4 5 6 7 8 9 10
(Intercept) 1 1 1 1 1 1 1 1 1 1
CV.Din 45 62 45 72 60 53 57 54 72 75
Peso 750 805 710 805 820 850 755 815 810 805
attr(,"assign")
[1] 0 1 2
> t(model.frame(step(modello,trace=0,test="F")))
1 2 3 4 5 6 7 8 9 10
Consumo 5 6.5 4.8 6.7 6.5 6.3 4.8 5.9 6.4 6.5
CV.Din 45 62.0 45.0 72.0 60.0 53.0 57.0 54.0 72.0 75.0
Peso 750 805.0 710.0 805.0 820.0 850.0 755.0 815.0 810.0 805.0
utili al ne di successive elaborazioni.
6.6 Lanalisi della varianza
Una delle tecniche statistiche di impiego pi` u frequente nelle ricerche sperimentali `e
rappresentata dallanalisi della varianza (ANOVA); com`e noto, essa consente essen-
zialmente, a partire da campioni indipendenti estratti da popolazioni con distribuzione
normale, di vericare se le medie delle popolazioni poste a confronto possono essere
ritenute statisticamente uguali, ad un pressato livello di signicativit`a.
Data la vastit`a dellargomento, nel seguito considereremo unicamente lanalisi della
varianza per esperimenti ad uno e due fattori.
In R possiamo procedere in modo diretto allanalisi della varianza ricorrendo al co-
mando aov(formula=,data=). Oltre alla consueta tabella ANOVA riassuntiva, tale
funzione restituisce, sottoforma di lista, una serie piuttosto estesa di risultati che
possono, come vedremo, essere ripresi per ulteriori analisi mirate ***
ANOVA per esperimenti ad un fattore Immaginiamo di voler studiare linuenza
di un certo fattore A su di una grandezza quantitativa Y . Indicati con a
1
, a
2
, . . . , a
k
19
Per ovvi motivi si presentano le trasposte delle corrispondenti matrici.
191
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
le varie e distinte condizioni sperimentali (livelli, classi o trattamenti) in cui pu`o
presentarsi il fattore A, organizziamo un esperimento che preveda:
n
1
misurazioni di Y con il fattore A al livello a
1
n
2
misurazioni di Y con il fattore A al livello a
2
... ......................................
n
k
misurazioni di Y con il fattore A al livello a
k
`
E quasi il caso di notare come il problema posto sia analogo a quello di avere a che fare
con k diversi campioni indipendenti, ciascuno di dimensione n
i
, tratti da altrettante
popolazioni.
Supposto che i k campioni casuali (Y
i1
, Y
i2
, . . . , Y
in
i
), siano indipendenti e provenga-
no da popolazioni normali con valor medio +
i
e comune varianza
2
, possiamo
introdurre un modello che considera le v.c. Y
ij
come una combinazione lineare del
tipo Y
ij
= +
i
+
ij
, dove le e
ij
sono v.c. i.i.d. N(0,
2
).
Se i diversi livelli del fattore A inuenzano i dati del campione allo stesso modo, `e lecito
formulare lipotesi nulla che siano uguali i corrispondenti valori medi da sottoporre
a verica contro lipotesi alternativa che almeno due di essi siano diversi tra loro; in
simboli:
_
H
0
:
1
=
2
= . . . =
k
=
0
H
1
: i, j; i = j :
i
=
j
(6.39)
LANOVA `e lo strumento adatto appunto alla verica di tali ipotesi statistiche; essa si
basa essenzialmente sul concetto di scissione della devianza di Y nelle due componenti
SS
A
e SS
E
; la prima rappresenta la devianza imputabile ai diversi livelli del fattore
A, la seconda quella derivante dalleetto di altre cause non esplicitamente prese in
considerazione. Se H
0
`e vera, SS
A
dipender`a unicamente dalla varianza
2
, mentre
in caso contrario dipender`a, oltre che dalla varianza, anche dai parametri a
i
. Ai
ni dellANOVA `e pertanto necessario confrontare tra loro la devianza SS
A
con la
devianza SS
E
. Se SS
A
`e signicativamente maggiore di SS
E
, si pu`o concludere che
le quantit`a a
i
risultano diverse da zero; in altri termini, il fattore A inuenza il valor
medio della v.c. osservata Y , ovvero la popolazione oggetto di studio non `e omogenea
rispetto al fattore di classicazione.
Ricordando che il rapporto tra due v.c.
2
indipendenti divise per i rispettivi gradi
di libert`a ha distribuzione F di Snedecor, lANOVA assumer`a quale funzione test il
rapporto:
n k
k 1
SS
A
SS
E
che, vera H
0
, ha appunto distribuzione F di Snedecor con (k 1) gradi di libert`a a
numeratore e (n k) gradi di libert`a a denominatore.
192
E. D. Isaia, Linguaggio R e applicazioni statistiche
Esempio 6.6.1 Si immagini che i dati che seguono rappresentino il risultato di una serie
di misurazioni (espresse in Kg/m
2
) del valore di resistenza a compressione di esemplari di
cemento sottoposti a cinque diversi trattamenti A
i
, i = 1, 2, . . . , 5:
A
1
A
2
A
3
A
4
A
5
59.1 62.7 58.9 60.5 59.8
60.2 62.3 60.2 62.0 60.6
58.9 59.9 59.7 62.3 61.7
60.1 60.3 60.5 59.7 61.3
59.3 59.7 59.9 61.4 60.2
`
E interessante vericare se i risultati sperimentali ottenuti siano, in media, inuenzati dal
particolare tipo di trattamento a cui sono stati sottoposti gli esemplari.
Creato, per comodit`a, il data frame cemento contenente i risultati sperimentali:
> y<-c(59.1,62.7,58.9,60.5,59.8,60.2,62.3,60.2,62.0,60.6,
58.9,59.9,59.7,62.3,61.7,60.1,60.3,60.5,59.7,61.3,
59.3,59.7,59.9,61.4,60.2)
> a<-factor(c(rep(c(1:5),5)))
> (cemento<-data.frame(tratta=factor(a),risposta=y))
tratta risposta
1 1 59.1
2 2 62.7
3 3 58.9
4 4 60.5
5 5 59.8
..................
21 1 59.3
22 2 59.7
23 3 59.9
24 4 61.4
25 5 60.2
> rm(y,a)
> attach(cemento)
`e facile vericare che, per ciascun tipo di trattamento, media e varianza campionarie risultano:
> for (i in 1:length(unique(tratta))){
cat("A=",i," media =>",round(mean(split(risposta,tratta)[[i]]),2),
" varianza =>",var(split(risposta,tratta)[[i]]),"\n")}
A= 1 media => 59.52 varianza => 0.352
A= 2 media => 60.98 varianza => 1.992
A= 3 media => 59.84 varianza => 0.368
A= 4 media => 61.18 varianza => 1.157
A= 5 media => 60.72 varianza => 0.607
193
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Vericata lomoschedasticit`a delle varianze tramite il test di Bartlett (cfr. paragrafo 5.3):
> bartlett.test(risposta,tratta)
Bartlett test for homogeneity of variances
data: risposta and tratta
Bartletts K-squared = 4.1982, df = 4, p-value = 0.3798
> detach(cemento)
se assumiamo che i risultati sperimentali siano determinazioni di altrettanti campioni casuali
X
j
N(
j
, ), ciascuno di cardinalit`a n = 5, con j = 1, 2, . . . , 5, possiamo procedere alla
verica delle seguenti ipotesi statistiche:
H
0
:
1
=
2
=
3
=
4
=
5
H
1
: (i, j)
i=j

i
=
j
cio`e eettuare unanalisi della varianza ad un solo fattore di classicazione (il tipo di tratta-
mento) sulla grandezza quantitativa Y , la resistenza a compressione.
A tal ne, deniamo loggetto my.anova, che conterr`a il modello statistico, la sorgente dei
dati e le informazioni di base per la verica delle ipotesi di interesse, tramite il comando:
> (my.anova<-aov(risposta ~ tratta,data=cemento))
Call:
aov(formula = risposta ~ tratta, data = cemento)
Terms:
tratta Residuals
Sum of Squares 10.6184 17.9040
Deg. of Freedom 4 20
Residual standard error: 0.94615
Desiderando procedere, ovvero calcolare il p value associato al test, possiamo ricorrere al
comando summary(), il quale coerentemente fornisce:
> summary(my.anova)
Df Sum Sq Mean Sq F value Pr(>F)
tratta 4 10.6184 2.6546 2.9654 0.04486 *
Residuals 20 17.9040 0.8952
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
In sostanza saremo portati (ad un livello di signicativit`a di poco inferiore al 5%) a riutare
lipotesi nulla e a ritenere che i diversi tipi di trattamento eettivamente inuiscono sulla
capacit`a di resistenza a compressione del cemento.
Osserviamo che il ricorso al comando model.tables() consente di visualizzare alcune utili
informazioni circa i valori medi campionari; infatti:
194
E. D. Isaia, Linguaggio R e applicazioni statistiche
> model.tables(my.anova, type="means")
Tables of means
Grand mean
60.448
tratta
1 2 3 4 5
59.52 60.98 59.84 61.18 60.72

ANOVA per esperimenti a due fattori senza replicazioni Si immagini, ora, di


voler studiare leetto di due fattori, diciamo A e B, su di una certa grandezza quanti-
tativa Y e si supponga che al fattore A siano associati r distinti livelli a
1
, . . . , a
i
, . . . , a
r
,
convenzionalmente detti trattamenti, ed analogamente al fattore B siano associati s
distinti livelli b
1
, . . . , b
j
, . . . , b
s
, convenzionalmente detti blocchi, di modo che siano
complessivamente possibili r s dierenti condizioni sperimentali. Si ipotizzi, al-
tres`, di eettuare per ciascuna combinazione dei livelli dei fattori in esame ununica
osservazione Y
ij
, con i = 1, 2, . . . , r; j = 1, 2, . . . , s. Tali risultati sperimentali sono
interpretabili come determinazioni campionarie di altrettante v.c. Y
ij
i.i.d. secondo
una N( +
i
+
j
,
2
).
In altri termini possiamo modellizzare le v.c. Y
ij
come una combinazione lineare del
tipo Y
ij
= +
i
+
j
+
ij
, dove indica il valor medio di Y , mentre
i
=
i.

e
j
=
.j
rappresentano, rispettivamente leetto del i-esimo trattamento e del
j-esimo blocco e le
ij
sono v.c. i.i.d. N(0,
2
).
Se i diversi livelli del fattore A inuenzano Y nella stessa misura, `e lecito formulare
lipotesi che i diversi trattamenti abbiano ugual valor medio, cio`e H
(1)
0
:
i
= 0, i da
sottoporre a verica contro lipotesi alternativa H
(1)
1
: i :
i
= 0. In modo del tutto
analogo, per il fattore B possiamo ipotizzare che i diversi blocchi abbiano ugual valor
medio, ovvero H
(2)
0
:
j
= 0, j da sottoporre a verica contro lipotesi alternativa
H
(2)
1
: j :
j
= 0. Riasumendo consideriamo i seguenti sistemi di ipotesi:
_
H
(1)
0
:
i
= 0
H
(1)
1
: i :
i
= 0
(6.40)
_
H
(2)
0
:
j
= 0
H
(2)
1
: i :
i
= 0
(6.41)
Anche in questo caso, con opportuni passaggi, si pu`o scindere la devianza totale di
Y
ij
nei tre addendi SS
A
, SS
B
e SS
E
, che rappresentano, rispettivamente, la devianza
tra i trattamenti, la devianza tra i blocchi e la devianza residua.
195
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Il procedimento per vericare le ipotesi statistiche precedentemente poste, si basa
sulla seguente osservazione: se H
(1)
0
e H
(2)
0
sono vere, SS
A
e SS
B
dipendono uni-
camente da
2
, mentre in caso contrario dipenderanno anche dai parametri
i
e
j
rispettivamente.
Ai ni dellANOVA si tratter`a, pertanto, di confrontare le devianze SS
A
e SS
B
rispetto a SS
E
. Le funzioni test atte a tal ne sono:
SS
A
r 1
SS
E
(r 1) (s 1)
SS
B
s 1
SS
E
(r 1) (s 1)
che, vere le corrispondenti ipotesi nulle, si ditribuiscono secondo una F di Snedecor
con, rispettivamente, (r 1) e (s 1) gradi di libert`a a numeratore e (r 1) (s 1)
gradi di libert`a a denominatore.
Esempio 6.6.2 Si immagini che al ne di una simulazione numerica siano state approntate
tre routine di calcolo (r
1
, r
2
, r
3
), ciascuna delle quali redatta in accordo a tre diversi algoritmi;
al ne di vericare la velocit`a di esecuzione (Y ), si `e fatto ricorso ad un esperimento che
prevedeva la misurazione dei tempi di esecuzione (in secondi) delle tre routine (fattore A a tre
livelli) su altrettanti PC (fattore B a tre livelli o blocchi),con uguali caratteristiche, ottenendo
i seguenti risultati sperimentali:
Routine Pc pc
1
pc
2
pc
3
r
1
2.42 2.44 2.43
r
2
2.45 2.44 2.46
r
3
2.46 2.47 2.48
Trattasi evidentemente di un esperimento a due fattori (A,B) a tre livelli ciascuno con una
sola replicazione per cella.
Procedendo, creiamo, per comodit`a, il data frame dati contenente i risultati sperimentali:
> y<-c(2.44,2.42,2.43,2.45,2.44,2.46,2.46,2.47,2.48)
> a<-factor(c(1,1,1,2,2,2,3,3,3))
> b<-factor(c(1,2,3,1,2,3,1,2,3 ))
> (dati<-data.frame(fattoreA=a,fattoreB=b,risposta=y))
fattoreA fattoreB risposta
1 1 1 2.44
2 1 2 2.42
3 1 3 2.43
4 2 1 2.45
5 2 2 2.44
6 2 3 2.46
7 3 1 2.46
8 3 2 2.47
9 3 3 2.48
> rm(a,b,y)
196
E. D. Isaia, Linguaggio R e applicazioni statistiche
e successivamente, al ne di vericare le ipotesi statistiche (6.40) e (6.41), deniamo loggetto
my.anova, che conterr`a il modello statistico, la sorgente dei dati nonche le informazioni di
base per la verica delle ipotesi di interesse, tramite il comando:
> (my.anova<-aov(risposta ~ fattoreA+fattoreB,data=dati))
Call:
aov(formula = risposta ~ fattoreA + fattoreB, data = dati)
Terms:
fattoreA fattoreB Residuals
Sum of Squares 0.0024000000 0.0002666667 0.0003333333
Deg. of Freedom 2 2 4
Residual standard error: 0.00912871
A questo punto ricorrendo al comando summary(), otteniamo i risultati desiderati:
> summary(my.anova)
Df Sum Sq Mean Sq F value Pr(>F)
fattoreA 2 0.00240000 0.00120000 14.4 0.01487 *
fattoreB 2 0.00026667 0.00013333 1.6 0.30864
Residuals 4 0.00033333 0.00008333
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Risultati che ci portano a ritenere che le tre routine abbiano, perlomeno dal punto di vista sta-
tistico, un diverso comportamento (si riuta H
(1)
0
), mentre, come auspicabile, non emergono
dierenze signicative circa il comportamento dei PC (si accetta H
(2)
0
).
ANOVA per esperimenti a due fattori con replicazioni Nello schema di clas-
sicazione illustrato al punto precedente si assumeva lassenza di interazione tra i
fattori A e B. Per potere individuare la presenza di uneventuale interazione tra
i fattori, `e necessario disporre di pi` u osservazioni per ciascuna delle r s situazio-
ni sperimentali. Nel seguito supporremo che ogni cella contenga un ugual numero
n > 1 di osservazioni, s` che risultati sperimentali possano essere indicati Y
ijk
, dove
k = 1, 2, . . . , n rappresenta la k-esima osservazione relativa alla ij-esima cella. Pos-
siamo aermare che i valori sperimentali costituiscono determinazioni campionarie di
altrettante v.c. Y
ijk
i.i.d. N( +
i
+
j
+
ij
,
2
). Ricordando che
ij.
= E[

Y
ij.
],

i..
= E[

Y
i..
],
.j.
= E[

Y
.j.
], = E[

Y
...
], possiamo esprimere le v.c. Y
ijk
quale combi-
nazione lineare Y
ijk
= +
i
+
j
+
ij
+
ijk
, dove
i
=
i..
rappresenta leetto
del i-esimo livello del fattore A,
j
=
.j.
quello del j-esimo livello del fattore B,

ij
=
ij.

i..

.j.
+ quello delleetto congiunto del i-esimo livello del fattore A
e del j-esimo livello del fattore B, mentre
ijk
sono v.c. i.i.d. N(O,
2
).
197
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Le ipotesi statistiche che sottoponiamo a verica saranno dunque:
H
2
0
:
i
= 0, i H
2
1
: i :
i
= 0 (6.42)
H
2
0
:
j
= 0, j H
2
1
: j :
j
= 0 (6.43)
H
3
0
:
ij
= 0, i, j H
3
1
: i, j; i = j :
ij
= 0 (6.44)
Anche in questo caso, con opportuni passaggi, si pu`o scindere la devianza totale di
Y
ijk
nei quattro addendi SS
A
, SS
B
, SS
AB
e SS
E
, che rappresentano, rispettivamen-
te, la devianza tra i trattamenti, la devianza tra i blocchi, la devianza imputabile
allinterazione fra trattamenti e blocchi e la devianza residua.
Ai ni dellANOVA si tratter`a di confrontare le devianze SS
A
, SS
B
e SS
AB
rispetto
a SS
E
; le statistiche test atte a tal ne sono:
SS
A
r 1
SS
E
r s (n 1)
SS
B
s 1
SS
E
r s (n 1)
SS
AB
(r 1) (s 1)
SS
E
r s (n 1)
che, vere le corrispondenti ipotesi nulle, si ditribuiscono secondo una F di Snedecor
con, rispettivamente, (r 1), (s 1) e (r 1) (s 1) gradi di libert`a a numeratore
e r s (n 1) gradi di libert`a a denominatore.
Esempio 6.6.3 I responsabili del Controllo di Qualit`a di un importante lanicio ritengono
che le propriet`a meccaniche e dimensionali (individuabili ricorrendo a specici parametri)
del tessuto siano inuenzate, nel corso del processo di decantissaggio in autoclave, da due
particolari fattori; la posizione (fattore A) del tessuto allinterno del cilindro di decantissaggio
e la dierenza (fattore B) fra pezza e pezza di uno stesso tipo di tessuto. Per vericare
tale convinzione venne progettato un esperimento che prevedeva la misurazione dei succitati
parametri su campioni di stoa prelevati casualmente in corrispondenza a diverse combinazioni
dei due fattori A e B. In particolare, per ciascun fattore si sono considerati tre livelli e per
ciascuna delle nove condizioni sperimentali si sono eettuate cinque misurazioni. Trattasi,
manifestamente, di un esperimento a due fattori di classicazione con un ugual numero di
osservazioni per cella, di cui il fattore A costituisce il fattore di interesse dellindagine mentre
il fattore B esprime la variabilit, non eliminabile, del processo produttivo. Le ipotesi che si
vogliono vericare, limitatamente alla sola grandezza di interesse Y sono:
H
(1)
0
: il fattore A non ha alcuna inuenza su Y ;
H
(2)
0
: il fattore B non ha alcuna inuenza su Y ;
H
(3)
0
: non esiste interazione tra i fattori A e B.
sulla base delle seguenti realizzazioni sperimentali:
198
E. D. Isaia, Linguaggio R e applicazioni statistiche
A B Y A B Y A B Y
1 1 476 2 1 517 1 513
1 1 474 2 1 499 1 483
1 1 465 2 1 501 1 507
1 1 477 2 1 503 1 504
1 1 490 2 1 485 1 483
1 2 481 2 2 491 2 501
1 2 487 2 2 501 2 517
1 2 492 2 2 487 2 505
1 2 485 2 2 504 2 495
1 2 469 2 2 498 2 510
1 3 490 2 3 514 3 533
1 3 486 2 3 495 3 514
1 3 473 2 3 506 3 525
1 3 475 2 3 525 3 510
1 3 479 2 3 503 3 504
> y<-c(476,474,465,477,490,481,487,492,485,469,490,486,473,475,479,
517,499,501,503,485,491,501,487,504,498,514,495,506,525,503,
513,483,507,504,483,501,517,505,495,510,533,514,525,510,504)
> a<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3)
> b<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,
1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
> dati<-data.frame(fattoreA=factor(a),fattoreB=factor(b),risposta=y)
> my.anova<-aov(risposta ~ fattoreA+fattoreB+fattoreA*fattoreB,data=dati)
porgono la seguente tabella ANOVA:
> summary(my.anova)
Df Sum Sq Mean Sq F value Pr(>F)
fattoreA 2 6190.0 3095.0 30.1690 2.019e-08 ***
fattoreB 2 844.9 422.5 4.1181 0.02452 *
fattoreA:fattoreB 4 586.7 146.7 1.4297 0.24407
Residuals 36 3693.2 102.6
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
In sostanza siamo portati a credere che i due fattori A e B inuenzano singolarmente, ma non
congiuntamente la grandezza Y in esame.
199
Capitolo 7
Elementi di simulazione *** da rifare
Arontiamo, ora, alcuni specici problemi connessi alla simulazione. Si tratta di
semplici esempi di specie che tendono ad illustrare, ancora una volta, le potenzialit`a
del linguaggio di programmazione.
7.1 Sul lancio simultaneo di n monete
Con riferimento ad un esperimento casuale che consiste nel lancio simultaneo di n 1
monete, il numero di Teste apparse pu`o essere descritto mediante una v.c. X che, per
cose note, possiede distribuzione binomiale di parametri n e p, per x = 0, 1, . . . , n.
Nel seuito ci proponiamo di simulare la ripetizione, poniamo k > 1 volte, di tale
esperimento casuale e di ottenere la distribuzione di frequenze empirica del numero
di Teste apparse ad ogni lancio.
A tal ne deniamo la seguente funzione lancio i cui input sono k, n e p:
> lancio<-function(k,n,p,graph=FALSE) 1
{ 2
x<-sort(rbinom(k,n,p)) 3
fi<-diag(table(x,x)) 4
lancio.out<<-list(n.teste=x,detx=unique(x),freq=fi) 5
if(graph) 6
plot(unique(x),fi,type="h",xlim=c(-1,max(unique(x))+1), 7
xlab="Determinazioni x",ylab="Frequenze empiriche") 8
} 9
A commento:
in riga [3] viene denita e generata la sequenza delle determinazioni di X in
ciascuna delle k repliche dellesperimento;
E. D. Isaia, Linguaggio R e applicazioni statistiche
in fi immettiamo le frequenze corrispondenti ad ogni valore di xi (riga [4]). Si
noti il ricorso allistruzione table di cui si considerano i valori appartenenti alla
sola diagonale principale, essendo nulli altrove;
in riga [5] viene creata la lista lancio.out contenente i risultati della simula-
zione;
in riga [7] viene proposto, a patto che graph=TRUE, il graco della distribu-
zione empirica; si noti che unique(x) porge, in ordine crescente, le possibili
determinazioni x = 0, 1, . . . , n di X in ciascuna prova.
Cos`, ad esempio:
> lancio(20,5,.5,graph=FALSE)
> lancio.out$freq
0 1 2 3 4 5
1 3 4 5 5 2
simula il lancio, ripetuto 20 volte, di cinque monete regolari.
7.2 Sulle catene di Markov
Si immagini che un gioco consista nel lancio di una moneta e che in caso si ottenga
Testa si vincano 100 lire, mentre in caso contrario se ne perdano 100 e che inoltre il
gioco abbia termine non appena si siano perse o guadagnate 500 lire.
`
E interessante
indagare sui tempi di durata gioco, o perlomeno farsi unidea della durata media
dello stesso. Se, accanto alla v.c. X che indica il numero di Teste ottenute dal lancio,
introduciamo le v.c.:
g(X
t
) =
_
100 X
t
= Croce
+100 X
t
=Testa
C
t
=
_
0 t = 0
C
t1
+g(Xt) t = 1, 2, . . .
possiamo modelizzare il gioco quale catena di Markov a tempi discreti denita sugli
stati E
i
per cui C
t
= i, con i = 5, 4, . . . , 4, 5. Gli stati E
5
ed E
5
, in accordo alle
premesse fatte, sono di tipo assorbente, mentre i restanti sono transienti.
La catena proposta, a ben vedere, `e la modellizzazione di un ben noto processo sto-
castico abitualmente detto passeggiata casuale tra due barriere assorbenti che si
presta, anche in forme alternative a quella presentata, a diverse applicazioni anche in
campo economico ed industriale.
Se si osserva, poi, che i passaggi tra gli stati E
i
a E
i+1
o ad E
i1
avvengono con
probabilit`a p e 1 p rispettivamente, la matrice dei transizione del primo ordine
201
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
della catena, avendo cura di riordinare gli stati come E
5
, E
5
, E
4
, . . . , E
4
, verr`a ad
assumere la forma:
P =
_

_
1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0
1 p 0 0 p 0 0 0 0 0 0 0
0 0 1 p 0 p 0 0 0 0 0 0
0 0 0 1 p 0 p 0 0 0 0 0
0 0 0 0 1 p 0 p 0 0 0 0
0 0 0 0 0 1 p 0 p 0 0 0
0 0 0 0 0 0 1 p 0 p 0 0
0 0 0 0 0 0 0 1 p 0 p 0
0 0 0 0 0 0 0 0 1 p 0 p
0 p 0 0 0 0 0 0 0 1 p 0
_

_
In sostanza la matrice P pu`o essere vista come:
P =
_
R S
W Q
_
dove Q ne rappresenta cosidetta matrice fondamentale.
Desiderando indagare sulla durata media della passeggiata, tralasciando voluta-
mente la ricerca di una soluzione analitica che potremmo individuare ricorrendo ad
unequazione alle dierenze con opportuni vincoli, sfruttiamo il seguente risultato, do-
vuto a Brook, Evans (1982), che consente, appunto di ottenere il vettore dei momenti
primi della v.c. T
E
i
che rappresenta il numero di transizioni che occorrono, partendo
da un pressato stato iniziale non transiente E
i
, i = 4, . . . , 4,, per raggiungere
uno degli stati assorbenti:

E
i
= (I Q)
1
1
Ancor pi` u interessante `e analizzare il comportamento di
E
i
, abitualmente detto Ave-
rage Run Length, al variare di p, cio`e sotto lipotesi di non correttezza della moneta.
A tal ne `e suciente far variare i valori di p in (0, 1) o meglio, per la simmetria, in
(0.5, 1).
Per il nostro scopo, ricordando che concentriamo la nostra attenzione al valor medio
di T
E
0
, sono sucienti le istruzioni che seguono:
> n<-51; p<-.5; q<-1-p 1
> I <- matrix(0,nrow=9,ncol=9); I[row(I)==col(I)] <- 1 2
> one<-cbind(diag(I)) 3
202
E. D. Isaia, Linguaggio R e applicazioni statistiche
> arl<-real(n) 4
> for (i in 1:n){ 5
Q<-matrix(c(0,q,0,0,0,0,0,0,0,p,0,q,0,0,0,0,0,0, 6
0,p,0,q,0,0,0,0,0,0,0,p,0,q,0,0,0,0,0,0,0,p,0,q,0,0,0, 7
0,0,0,0,p,0,q,0,0,0,0,p,0,0,p,0,q,0,0,0,0,0,0,0,p,0,q, 8
0,0,0,0,0,0,0,p,0),nrow=9,ncol=9) 9
W<-((solve(I-Q))%*%one) 10
arl[i]<-(((solve(I-Q))%*%one))[5,] 11
p<-p+0.01; q<-1-p} 12
> plot(seq(.5,1,by=0.01),arl,type="p",main="",ylab=" A.R.L.", 13
xlab="p=P[X=1]",col="blue") 14
> lines(seq(.5,1,by=0.01),arl,col="red") 15
> grid() 16
A commento, osserviamo:
in riga [2] e [3] deniamo la matrice identit`a (9x9) ed il vettore colonna unitario;
in riga [4] deniamo loggetto arl che conterr`a le soluzioni desiderate;
dalla riga [5] alla [12] vi `e il ciclo di calcolo vero e proprio. Si noti che arl dovr`a
contenere il valor medio relativo allo stato E
0
, cio`e il quinto elemento dei vettori
(I Q)
1
1 via via calcolati.
I risultati ottenuti per i valori di p = 0.50, (0.01), 1 sono:
340.000 214.880 151.775 114.447 90.155 73.297
61.042 51.813 44.665 39.005 34.436 30.691
27.579 24.963 22.741 20.837 19.192 17.762
16.500 15.406 14.430 13.561 12.784 12.088
11.460 10.892 10.377 9.909 9.481 9.089
8.729 8.397 8.092 7.808 7.546 7.302
7.074 6.862 6.663 6.477 6.302 6.137
5.982 5.835 5.697 5.565 5.441 5.322
5.210 5.102 5.000
mentre in gura (7.1) se ne riporta il graco.
7.3 Sul teorema limite centrale
Immaginiamo di estrarre k > 1 campioni di numerosit`a n da una specica densit`a
f(x), di calcolare, per ciascuno di essi, il valor medio x e quindi rappresentare gra-
camente la distribuzione empirica di

X, che sappiamo distribuirsi asintoticamente
secondo una N(, k
1/2
) e ci`o indipendentemente dalla forma di f(x).
203
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
0.5 0.5 0.6 0.6 0.7 0.7 0.8 0.8 0.9 0.9 1.0 1.0
0
5
0
1
0
0
1
5
0
2
0
0
2
5
0
3
0
0
3
5
0
p=P[X=1] p=P[X=1]

A
.
R
.
L
.
Figura 7.1: Numero medio di giocate al variare di p in (0.5, 1)
A titolo di esempio, posto:
densit`a n k
f(x) = 2
1
, 0 < x < 2 5 2000
il problema pu`o essere risolto semplicemente ricorrendo alle istruzioni:
> k<-2000
> medie.x<-real(k)
> for (i in 1:k) {x<-runif(5,0,2); medie.x[i]<-mean(x)}
> hist(medie.x,breaks=20,freq=FALSE,main="",xlab="Medie campionarie",
ylab="Frequenze empiriche",col="lightgray",xlim=c(0,2))
In gura (7.2) `e riportato listogramma dei risultati dalla simulazione.
Una variante, lasciando al Lettore il gusto della programmazione, potrebbe essere
quella di ripetere la simulazione proposta per diversi valori di k.
A titolo di esempio in gura (7.3) riportiamo i risultati di una simulazione caratteriz-
zata da:
204
E. D. Isaia, Linguaggio R e applicazioni statistiche
Medie campionarie Medie campionarie
F
r
e
q
u
e
n
z
e

e
m
p
i
r
i
c
h
e
0.0 0.0 0.5 0.5 1.0 1.0 1.5 1.5 2.0 2.0
0
.
0
0
.
5
1
.
0
1
.
5
Figura 7.2: Distribuzione delle medie campionarie
densit`a n k
f(x) = 2
1
, 0 < x < 20 5 10
i
, i = 1, 2, 3, 4
7.4 Sulla funzione di ripartizione empirica
Dato un campione casuale ordinato (X
(1)
, X
(2)
, . . . , X
(n)
) tratto da una v.c. X, la
funzione di ripartizione empirica o campionaria, F
n
(x), `e denita:
F
n
(x) =
_
_
_
0 x < X
(1)
i/n X
(1)
x < X
(n)
1 x X
(n)
Evidentemente trattasi di una funzione a scalini che si avvicina alla funzione di
ripartizione F(x) della v.c. X; nel caso sia vera lipotesi che il campione provenga da
X, le dierenze F
n
(x) F(x) sono da attribuirsi unicamente al caso.
Per inciso, osserviamo che tali considerazioni costituiscono la base dei cosiddetti te-
st basati sulla funzione di distribuzione empirica (EDF test), tra i quali merita un
205
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
k=10 k=10
Medie campionarie Medie campionarie
F
r
e
q
u
e
n
z
e

e
m
p
i
r
i
c
h
e
0.0 0.0 0.5 0.5 1.0 1.0 1.5 1.5 2.0 2.0
0
.
0
0
.
5
1
.
0
1
.
5
2
.
0
k=100 k=100
Medie campionarie Medie campionarie
F
r
e
q
u
e
n
z
e

e
m
p
i
r
i
c
h
e
0.0 0.0 0.5 0.5 1.0 1.0 1.5 1.5 2.0 2.0
0
.
0
0
.
5
1
.
0
1
.
5
2
.
0
k=1000 k=1000
Medie campionarie Medie campionarie
F
r
e
q
u
e
n
z
e

e
m
p
i
r
i
c
h
e
0.0 0.0 0.5 0.5 1.0 1.0 1.5 1.5 2.0 2.0
0
.
0
0
.
5
1
.
0
1
.
5
k=10000 k=10000
Medie campionarie Medie campionarie
F
r
e
q
u
e
n
z
e

e
m
p
i
r
i
c
h
e
0.0 0.0 0.5 0.5 1.0 1.0 1.5 1.5 2.0 2.0
0
.
0
0
.
5
1
.
0
1
.
5
Figura 7.3: Distribuzione delle medie campionarie
posto, per cos` dire, di primo piano, perlomeno dal punto di vista storico, quello di
Kolmogorov-Smirnov.
Riprendendo in parte quanto detto in (7.3), la funzione di ripartizione empirica della
v.c. media campionaria,

X = k
1

k
i=1

X
i
, dovrebbe, per k , avvicinarsi a quella
di una N(, k
1/2
).
A titolo illustrativo, si immagini di aver tratto k > 1 campioni di numerosit`a n da
una distribuzione Uniforme in (80, 120) e di aver calcolato, per ciascuno di essi, il
valor medio x e di volere rappresentare gracamente sia la funzione di ripartizione
empirica F
k
( x) sia quella di una N( = 100, 10k
1/2
).
A tal ne, scelto arbitrariamente di porre k = 30 ed n = 20, sono sucienti le seguenti
istruzioni:
> k<-30
> n<-20
206
E. D. Isaia, Linguaggio R e applicazioni statistiche
> medie.x<-real(k)
> Femp<-real(0)
> for (i in 1:k) {medie.x[i]<-mean(runif(20,80,120))}
> medie.x<-sort(medie.x)
> Fteor<-pnorm(medie.x,100,10/sqrt(k))
> for (i in 1:k){Femp<-append(Femp,i/k)}
> plot(medie.x,Femp,type="s",main="",ylab="Funzione di ripartizione
empirica e teorica",xlab="Determinazioni campionarie",col="blue")
> lines(medie.x,Fteor,col="red")
> grid()
Landamento delle due funzioni di ripartizione `e proposto in gura (7.4).
96 96 98 98 100 100 102 102 104 104
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
Determinazioni campionarie Determinazioni campionarie
F
u
n
z
i
o
n
e

d
i

r
i
p
a
r
t
i
z
i
o
n
e

e
m
p
i
r
i
c
a

e

t
e
o
r
i
c
a
Figura 7.4: Funzioni di ripartizione empirica e teorica
207
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
7.5 Sul bootstrap
Nel seguito descriviamo come sia possibile raggiungere alcuni semplici risultati concer-
nenti la tecnica bootstrap. Tale tecnica non-parametrica, com`e noto, viene applicata
ad uno stimatore

(x
1
, x
2
, . . . , x
n
) mediante il ricampionamento con rimessa eettua-
to k > 1 volte della npla campionaria osservata (x
1
, x
2
, . . . , x
n
) in modo da ottenere
altrettanti campioni bootstrap (x

1
, x

2
, . . . , x

n
) su ciascuno dei quali verr`a calcolato

=

(x

1
, x

2
, . . . , x

n
). La distribuzione dei valori

servir`a quale base per la stima


del parametro .
Per maggiori ragguagli, il Lettore pu`o consultare il testo, assai ricco di spunti ed
esempi applicativi, di Efron, Tibshirani (1993).
Vediamo ora come sia possibile applicare tale tecnica perlomeno nel caso di stima del
valor medio .
Pertanto, dati i seguenti valori campionari:
8.00 8.00 8.00 8.15 8.20 8.25 8.25 8.30 8.30 8.34
8.34 8.35 8.35 8.36 8.40 8.40 8.40 8.40 8.40 8.00
8.45 8.49 8.49 8.49 8.50 8.50 8.50 8.50 8.50 8.50
8.50 8.50 8.50 8.52 8.70 8.75 8.78 7.51 7.75 7.90
deniamo, ora, il massimo numero di itrazioni desiderate (maxloop) e al contem-
po loggetto medie.bootstrap che conterr`a, appunto, le medie bootstrap via, via
ottenute, mediante le istruzioni:
> maxloop<-5000; medie.bootstrap<-real(maxloop)
A questo punto, procediamo allestrazione con rimessa di 5.000 campioni casuali
estratti senza rimessa da (x
1
, x
2
, . . . , x
n
) e, per ciascuno di essi, calcoliamo il valor
medio che inseriamo in media.bootstrap. A ci`o sopperisce il ciclo:
> for(i in (1:maxloop))
{
medie.bootstrap[i]<-mean(sample(x,replace=TRUE))
}
> hist(medie.bootstrap,xlim=c(8.1,8.5),breaks=20,main="",
xlab="Medie Boostrap",ylab="Frequenze empiriche",col="lightblue")
In gura (7.5) riportiamo listogramma dei risultati ottenuti che sintetizziamo in:
valor medio deviazione standard errore standard
originale 8.338 0.2592019 0.04098342
bootstrap 8.340044 0.04044345 0.0005719567
208
E. D. Isaia, Linguaggio R e applicazioni statistiche
Medie Boostrap Medie Boostrap
F
r
e
q
u
e
n
z
e

e
m
p
i
r
i
c
h
e
8.1 8.1 8.2 8.2 8.3 8.3 8.4 8.4 8.5 8.5
0
1
0
0
2
0
0
3
0
0
4
0
0
5
0
0
Figura 7.5: Risultati del bootstrap
209
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
7.6 La libreria rnotes e gli archivi di dati
Per completezza e a vantaggio dellutente si `e pensato di raccogliere tutte le fun-
zioni presentate nel corso della trattazione nella libreria rnotes posta nella directo-
ry ...\library\rnotes\R; parimenti la directory \library\rnotes\data conetiene
tutti gli archivi di dati *** formato ***
7.7 Esercizi vari
Riportiamo nel seguito, in modo piuttosto informale, alcuni esercizi che possono essere
risolti facilmente in R ed orono, condiamo, spunto per ulteriori applicazioni.
Esercizio 7.7.1
Calcolare la media aritmetica, la media quadratica e la media armonica dei seguenti valori:
12, 10, 11, 11, 12, 13, 15, 16, 17, 10.
Esercizio 7.7.2
Calcolare la mediana e la varianza dei valori riportati in (7.7.1).
Esercizio 7.7.3
Dato loggetto x contenente i primi dieci interi consecutivi, ridenirlo in modo che esso
contenga gli stessi elementi, la loro media e quindi gli stessi elementi ancora ma ordinati
in senso decrescente.
Esercizio 7.7.4
A partire dalle seguenti osservazioni individuali:
12 10 11 12 13 14 14 13 15 10 12 11 10 11
costruire una tabella di frequenze relative.
Esercizio 7.7.5
Dati i valori {20, 21, 24, 20, 21, 23, 24, 25, 27, 30, 25}, creare un oggetto che contega le fre-
quenze relative cumulate di essi.
Esercizio 7.7.6
Date le seguenti osservazioni individuali:
sesso: M M M F F M F M F F F M F
Prov: To To Cn At To At Vc To Cn At AL Vc Cn
costruire una tabella doppia di frequenze relative.
Esercizio 7.7.7
Rappresentare gracamente nel piano (x, y) la funzione y
2
= x
2
(1 x
2
).
210
E. D. Isaia, Linguaggio R e applicazioni statistiche
Esercizio 7.7.8
Rappresentare gracamente nel piano (x, y) la funzione y
2
= x
1/2
(1 x
1/2
).
Esercizio 7.7.9
Dati:
x =
_
0.8 0.2

Y =
_
_
0.2 0.8
0.3 0.7
0.5 0.5
_
_
calcolare Z = xY e, successivamente, Zx
t
.
Esercizio 7.7.10
Una mutabile statistica doppia presenta la seguente distribuzione congiunta:
B/A a
1
a
2
a
3
a
4
a
5
a
6
b
1
2 5 7 10 12 15
b
2
4 6 7 7 9 10
b
3
10 9 6 4 2 1
individuare le distribuzioni marginali dei due caratteri A e B e rappresentarle mediante
un diagramma a torta.
Esercizio 7.7.11
Con riferimento allEsempio posto in (7.7.10), costruire la tabella doppia delle frequenze
relative.
Esercizio 7.7.12
Con riferimento allEsempio posto in (7.7.10), individuare le distribuzioni condizionate
A|B = b
i
, con i = 1, 2, 3.
Esercizio 7.7.13
Le misurazioni del peso (Kg) e dellaltezza (cm) eettuate su un gruppo di individui di
sesso maschile porgono la seguente tabella a doppia entrata:
Altezza/Peso 50-60 60-70 70-80 80-90
140-150 5 2 1 0
150-160 4 12 7 1
160-150 2 12 13 11
170-180 1 2 8 10
180-190 0 0 10 15
Si costruiscano, a partire da essa, le matrici di varianza-covarianza e di correlazione.
Esercizio 7.7.14
Con riferimento alla situazione di cui al punto (7.7.13), si rappresenti nel piano (x, y) la
spezzata di regressione e si proceda, altres` al calcolo di .
211
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Esercizio 7.7.15
Sia Data la seguente matrice delle varianze-covarianze:
Cov
X,Y
=
_
_
2 1 3
1 4 1
2 1 2
_
_
estrarre da essa gli elementi per cui risulta
X,Y
0.35.
Esercizio 7.7.16
Si risolva il seguente sistema di equazioni:
_
1.2x + 2.5y z = 10
2.5x 1.5y +z = -10
x +y +z = 0
e si verichi la correttezza dei risultati ottenuti.
Esercizio 7.7.17
Rappresentare gracamente la funzione di ripartizione di una variabile casuale (v.c.) con
distribuzione Binomiale di parametri n = 10 e p = .5
Esercizio 7.7.18
Rappresentare gracamente le funzioni di densit`a di probabilit`a di una v.c. con distribu-
zione Binomiale di parametri n = 10 e p = .75
Esercizio 7.7.19
Posto X una v.c. con distribuzione Binomiale di parametri n = 50 e p = .15, calcolare la
probabilit`a attinente agli eventi {0 < X < 20} e {X 20}.
Esercizio 7.7.20
Si rappresentino gracamente le v.c.
2
con, rispettivamente, 10, 20, 30 e 40 gradi di
libert`a.
Esercizio 7.7.21
Generare un campione casuale di dimensione n = 20 tratto da una densit`a Normale di
parametri = 100 e
2
= 25 e calcolarne il valor medio x.
Esercizio 7.7.22
Generato un campione casuale di dimensione n = 50 tratto da una densit`a Uniforme in
(20, 35), costruire lintervallo di condenza per il valor medio al 98.6%.
Esercizio 7.7.23
Generare un campione casuale di dimensione n = 60 tratto da una densit`a bimodale.
Esercizio 7.7.24
Con riferimento allEsempio (7.7.23), si costruisca unistogramma con 4 (7) (10) classi di
egual modulo e ad esso si sovraimponga il graco di una Normale di parametri ( ,
2
)
stimati in base ai valori campoionari ottenuti.
212
E. D. Isaia, Linguaggio R e applicazioni statistiche
Esercizio 7.7.25
I valori che seguono rappresentano i tassi medi di interesse sui obbligazioni triennali
applicati da 29 diverse banche in un periodo di sei mesi:
8.40 8.50 8.51 7.82 7.82 7.90 8.00 8.65 8.71 8.00
8.00 8.00 8.00 8.05 8.05 8.06 8.11 8.17 8.30 8.33
8.33 7.56 7.57 7.71 8.55 8.57 8.65 8.00 8.00
Si costruisca e si visualizzi la funzione di ripartizione empirica F
n
(x).
Esercizio 7.7.26
Con riferimento ai dati di cui al punto (7.7.25), si analizzi gracamente la trasformata
integrale Y = F
n
(x).
Esercizio 7.7.27
Da unindagine condotta su 100 famiglie residenti in provicia di XX, i rediti mensili netti
sono (x 1000 lit.):
3092.547 3469.574 3648.595 2966.232 3792.698 3341.397
3190.741 3188.127 3143.831 3315.047 3065.804 3076.497
2973.432 3367.155 2936.208 3492.316 3089.623 3050.536
2866.213 2883.179 3312.634 2931.252 3593.312 2900.712
3467.562 3578.601 3467.826 3214.972 3556.721 3270.383
3261.697 2988.463 3595.635 3514.857 3297.671 3126.800
3358.325 2970.571 3043.293 2615.924 3153.467 3531.567
3306.863 3538.944 2907.338 3425.463 3388.534 3151.945
2871.082 2957.559 3410.187 2860.557 3555.429 3344.409
3452.798 3689.683 3212.386 3403.109 3048.985 3334.146
3434.806 3300.451 2849.832 3277.373 3537.857 3206.523
3285.799 3338.512 3580.035 3363.479 3219.749 3883.942
3504.032 2870.496 3207.700 3306.835 3481.956 3451.231
3627.119 2979.124 3132.004 3002.333 3353.335 3042.290
3265.104 3522.844 3377.674 2979.684 3233.259 2866.378
3616.714 3056.764 3391.259 3760.060 2970.686 3310.131
3937.908 2982.205 3056.114 3670.399
Si costruiscano e si visualizzino la funzione di ripartizione empirica F
n
(x) e la funzione di
ripartizione di una v.c. Normale con parametri = x e = s.
Ad occhio `e plausibile ipotizzare la normalit`a della distribuzione del reddito sulla base
del campione sorteggiato?
Esercizio 7.7.28
Approntare una funzione che, rispetto ad un vettore di dati x, porga il graco della curva
di concentrazione del Lorenz con, a lato, il valore dellindice del Gini.
213
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
Esercizio 7.7.29
Si scriva una funzione che consenta di individuare la matrice delle contingenze delle
seguente tabella a doppia entrata:
B/A a
1
a
2
a
3
a
4
b
1
22 15 10 6
b
2
4 10 17 27
e si verichi che essa `e a somma nulla.
Esercizio 7.7.30
Si immagini che le misurazioni di una certa grandezza di interesse (Y ) siano inuenzate dai
possibili livelli di un fattore (X). Un eseprimento atto a vericare tale ipotesi, ha fornito
i seguenti risultati:
X Y
x
1
110.2 112.0 109.2 110.7 111.2
x
2
111.5 111.9 112.1 111.9 112.0
x
3
109.7 110.1 109.8 110.2 111.1
x
4
112.3 112.2 111.1 110.7 111.6
Approntare una funzione che, per ciascun livello del fattore, porga valor medio, scarto
quadratico medio, numero di misurazioni e lintervallo di condenza al livello 1
1
.
Esercizio 7.7.31
Al ne di analizzare il consumo di carburante (miglia x gallone) di un nuovo tipo di auto-
vettura, `e stato approntato unesperimento che prevedeva limpiego di quattro autovetture
A, B, C e D ed altrettanti piloti a, b, c e d e lassegnazione, in ciascuno dei quattro turni
di prove, dei piloti alle autovetture. I risultati ottenuti sono:
turno A B C D
1 9.44 9.83 9.02 9.68
2 9.61 9.22 9.39 8.76
3 9.06 9.02 9.88 8.88
4 8.71 9.02 9.23 9.73
Si proceda allanalisi della varianza ed alla verica dellipotesi che il consumo di carburante
non sia inuenzato dal particolare pilota;
Esercizio 7.7.32
Si approntino due funzioni che consentano la stima dei parametri dei modelli:
Y =
1
+ I
]10,)
x +

Y = + x
2
+

214
E. D. Isaia, Linguaggio R e applicazioni statistiche
Esercizio 7.7.33
Si costruisca una funzione che simuli il lancio ripetuto poniamo n > 1 volte di una moneta.
Ci`o ipotizzando che la moneta sia regolare e sia che essa risulti irregolare.
Esercizio 7.7.34
Si scriva una funzione che consenta di individuare la distribuzione dellipotenusa di un
triangolo rettangolo le cui misure dei cateti siano determinazioni di altrettante v.c. i.i.d
secondo una Uniforme di parametri a = 11 e b = 14.
Esercizio 7.7.35
Si immagini di lanciare quattro monete e di ripetere lesperimento nche: o si ottiene una
sequenza di quattro Teste o quattro Croci, oppure si ottengono in successione due sequenze
contenenti un egual numero di Croci e Teste.
Si appronti una funzione che consenta il calcolo della durata media del gioco, tenendo
conto della possibilit`a che le monete siano truccate.
(Si modellizzi lesperimento sottoforma di catena di Markov ...)
Esercizio 7.7.36
Si metta a punto una routine che consenta, mediante la tecnica boostrap, di ottenere una
stima per il parametro ignoto e ci`o sulla base della npla campionaria:
{10.1, 11.0, 10.5, 11.7, 12.5, 10.2, 10.7, 12.9, 12.4}

Esercizio 7.7.37
Con riferimento al punto (7.7.36), si costruisca un intervallo di condenza per al livello
1 = .90(.01).95.
215
Bibliograa
BARTLETT, M. S.,Properties of suciency and statistical tests, Proceedings of the
Royal Statistical Society, Series A, 160, 268-282, 1937
BELSLEY, D. A., KUH, E., WELSCH, R. E., Regression Diagnostics,John Wiley,
New York, 1980
BOWMAN A.W., AZZALINI A. (1997), Applied Smoothing Techniques for Data
Analysis. The Kernel Approach with S-Plus, Clarendon Press, Oxford
BRENT R., Algorithms for Minimization without Derivatives,
BROOK D., EVANS D.A., An Approach to the Probability Distribution of CUSUM
Run Length, Biometrika, 59, 539-549, 1982 Prentice Hall, Englewood Clis, New
Jersey, 1973
CHAMBERS J. M., HASTIE T. J., Statistical models in S, Chapman and Hall, New
York, 1992
CLEVELAND, W. S., LOWESS: A Program for Smoothing Scatterplots by Robust
Locally Weighted Regression, The American Statistician, 35, 54, 1981
COOK, R. D., WEISBERG, S., Residuals and Inuence in Regression, Chapman
and Hall, London, 1982
DONGARRA, J. J., BUNCH J. R., MOLER C. B., STEWART G. W., LINPACK
Users Guide, SIAM Publications, Philadelphia, 1978
EFRON B., TIBSHIRANI R., An Introduction to the Bootstrap, Chapman and Hall,
New York, 1993
GARTSIDE P.S., A Study of Methods for Comparing Several Variances, Journal of
The Ametican Statistical Association, 67, 1972
GENTLEMAN E., IHAKA R., Notes on R: A Programming Environment for Data
Analysis and Graphics, Dep. of Statistics, Univeristy of Auckland, 1997
E. D. Isaia, Linguaggio R e applicazioni statistiche
GIBBONS J.D., PRATT, J.W., P-Values: Interpretation and Methodology, The
American Statistician, 29, 1975,
IHAKA R., GENTLEMAN E., R: A Language for Data Analysis and Graphics,
Journal of Computational and Graphical Statistics, 5, 299-314, 1996
MARSAGLIA, G., A Random Number Generator for C, Discussion paper, Usenet
newsgroup sci.stat.math on September 29, 1997.
McCULLAGH, P., NELDER, J. A., Generalized Linear Models, Chapman & Hall,
II Edition, New York, 2000.
R Core Team, R Reference Index,The R Core Team, 2000
SAPORTA G., Probabilites, Analyse des Donnees et Statistique,

Edition Technip,
Paris, 1990
SCHERVISH J. M., Theory of Statistics, Springer-Verlag, New York, 1997
SHAO J., Mathematical Statistics, Springer-Verlag, New York, 1999
VENABLES W.N., RIPLEY B.D., Modern Applied Statistics with S-Plus, Springer,
New York, 2nd edition, 1997
VENABLES B., SMITH D., Notes on R: A Programming Environment for Data
Analysis and Graphics, Dep. of Statistics, Univeristy of Adelaide, 1992
WAND M.P., JONES M.C. (1995), Kernel Smoothing, Chapman & Hall, London
WICHMANN, B. A., HILL I. D., Algorithm AS 183: An Ecient and Portable
Pseudo-random Number Generator, Applied Statistics, 31, 188-190, 1982
217
Indice
1 Introduzione ad R 1
1.1 Lambiente di lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Primi passi in R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1 Creazione di oggetti elementari . . . . . . . . . . . . . . . . . . 4
1.2.2 Creazione di oggetti contenenti sequenze regolari . . . . . . . . 6
1.2.3 Manipolazione di oggetti elementari . . . . . . . . . . . . . . . 8
1.2.4 Operatori aritmetici e funzioni matematiche . . . . . . . . . . . 11
1.2.5 Su alcune funzioni statistiche . . . . . . . . . . . . . . . . . . . 13
1.2.6 Alcune funzioni di utilit`a generale . . . . . . . . . . . . . . . . 15
1.3 Vettori e Matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.4 Oggetti complessi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.4.1 Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.4.2 Data frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
1.5 Modalit`a e struttura di unoggetto . . . . . . . . . . . . . . . . . . . . 37
1.6 Funzioni denibili dallutente . . . . . . . . . . . . . . . . . . . . . . . 39
1.7 Su alcune funzioni matematiche . . . . . . . . . . . . . . . . . . . . . . 44
1.8 Lettura e registrazione di archivi . . . . . . . . . . . . . . . . . . . . . 48
1.8.1 I comandi scan() e write() . . . . . . . . . . . . . . . . . . . 48
1.8.2 I comandi read.table() e write.table() . . . . . . . . . . . 49
1.8.3 Il comando data() . . . . . . . . . . . . . . . . . . . . . . . . . 50
1.9 Personalizzazione dellambiente di lavoro . . . . . . . . . . . . . . . . . 51
1.10 Le librerie e loro gestione . . . . . . . . . . . . . . . . . . . . . . . . . 53
2 Cenni sulle procedure grache 55
2.1 Funzioni grache di primo livello . . . . . . . . . . . . . . . . . . . . 55
2.1.1 Funzione plot(x,y) . . . . . . . . . . . . . . . . . . . . . . . . 55
2.1.2 Funzione matplot(x,y) . . . . . . . . . . . . . . . . . . . . . . 57
2.1.3 Funzione hist(x) . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.1.4 Funzione boxplot(x,y,z,...) . . . . . . . . . . . . . . . . . . 58
2.1.5 Funzioni qqplot(x,y) e qqnorm(x) . . . . . . . . . . . . . . . 59
Dipartimento di Statistica e Matematica Diego de Castro, nota tecnica 2, 2OO1
2.1.6 Funzione barplot(x) e piechart(x) . . . . . . . . . . . . . . 59
2.1.7 Funzione polygon(x,y) . . . . . . . . . . . . . . . . . . . . . . 59
2.1.8 Funzione curve(espressione) . . . . . . . . . . . . . . . . . . 60
2.1.9 Funzione grid(nx,ny) . . . . . . . . . . . . . . . . . . . . . . . 60
2.1.10 La funzione rect(xmin,xmax,ymin,ymax) . . . . . . . . . . . . 60
2.1.11 Funzione persp(x,y,z) . . . . . . . . . . . . . . . . . . . . . . 61
2.1.12 Funzione pairs(x) . . . . . . . . . . . . . . . . . . . . . . . . . 62
2.1.13 Altre funzioni grache . . . . . . . . . . . . . . . . . . . . . . . 63
2.2 Funzioni grache di secondo livello . . . . . . . . . . . . . . . . . . . 63
2.3 Parametri graci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3 Argomenti di statistica descrittiva 67
3.1 Mutabili e variabili statistiche univariate . . . . . . . . . . . . . . . . . 68
3.1.1 Costruzione di semplici tabelle di frequenze . . . . . . . . . . . 68
3.1.2 Rappresentazioni grache . . . . . . . . . . . . . . . . . . . . . 72
3.1.3 Su alcune misure di sintesi . . . . . . . . . . . . . . . . . . . . . 80
3.1.4 Sulla concentrazione . . . . . . . . . . . . . . . . . . . . . . . . 89
3.2 Mutabili e variabili statistiche bivariate . . . . . . . . . . . . . . . . . 89
3.2.1 Tabelle di frequenze doppie . . . . . . . . . . . . . . . . . . . . 89
3.2.2 Lindice di dipendenza chi-quadro . . . . . . . . . . . . . . . . 89
3.2.3 Lindice di dipendenza in media . . . . . . . . . . . . . . . . . . 89
3.2.4 Sulla correlazione lineare . . . . . . . . . . . . . . . . . . . . . 89
4 Elementi di calcolo delle probabilit`a 107
4.1 Semplici esercizi sul calcolo delle probabilit`a . . . . . . . . . . . . . . . 110
4.2 Generazione di numeri pseudo-casuali . . . . . . . . . . . . . . . . . . 114
4.3 Il campionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5 Elementi di statistica inferenziale 120
5.1 Intervalli di condenza per un parametro . . . . . . . . . . . . . . . 120
5.2 Verica di ipotesi statistiche . . . . . . . . . . . . . . . . . . . . . . . . 129
5.3 La libreria ctest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
6 Alcune note sui modelli lineari 155
6.1 La regressione lineare semplice: il modello teorico . . . . . . . . . . . . 155
6.2 La regressione lineare . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.2.1 Stima della retta di regressione in base ai valori campionari . . 157
6.2.2 Veriche di ipotesi circa i parametri della retta di regressione . 159
6.2.3 Alcune considerazioni circa la previsione . . . . . . . . . . . . . 162
6.2.4 Alcune considerazioni sullanalisi dei residui . . . . . . . . . . . 163
6.3 La regressione lineare semplice in R . . . . . . . . . . . . . . . . . . . 164
2
E. D. Isaia, Linguaggio R e applicazioni statistiche
6.3.1 La funzione lm(): denizione del modello di regressione . . . . 164
6.3.2 La funzione lm(): oggetti creati in modo automatico . . . . . . 167
6.3.3 La funzione lm(): veriche di ipotesi sulle stime . . . . . . . . 168
6.3.4 La funzione predict.lm(): intervalli di condenza e di previsione171
6.3.5 Per unanalisi dei residui . . . . . . . . . . . . . . . . . . . . . . 173
6.4 Sulla regressione multipla: il modello
_
y, X,
2
I
n
_
. . . . . . . . . . 175
6.4.1 Stima e verica di ipotesi sui parametri del modello . . . . . . 176
6.4.2 Sul coeciente di correlazione multipla . . . . . . . . . . . . . 179
6.4.3 Sulla previsione e lanalisi dei residui . . . . . . . . . . . . . . . 181
6.4.4 Sulla multicollinearit`a . . . . . . . . . . . . . . . . . . . . . . . 182
6.5 La regressione multipla in R . . . . . . . . . . . . . . . . . . . . . . . . 183
6.5.1 Denizione del modello e listruzione model.matrix(lm(...)) 183
6.5.2 Ridenizione del modello: listruzione update(lm(...)) . . . . 186
6.5.3 Sulla multicollinearit`a e la stepwise regression . . . . . . . . . . 187
6.6 Lanalisi della varianza . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
7 Elementi di simulazione *** da rifare 200
7.1 Sul lancio simultaneo di n monete . . . . . . . . . . . . . . . . . . . . 200
7.2 Sulle catene di Markov . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
7.3 Sul teorema limite centrale . . . . . . . . . . . . . . . . . . . . . . . . 203
7.4 Sulla funzione di ripartizione empirica . . . . . . . . . . . . . . . . . . 205
7.5 Sul bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
7.6 La libreria rnotes e gli archivi di dati . . . . . . . . . . . . . . . . . . 210
7.7 Esercizi vari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
3