Documente Academic
Documente Profesional
Documente Cultură
Initiere in r-1
Initiere in r-1
Maria Miroiu
Viorel Petrehu
Gheorghi Zbganu
Introducere
Mediul de programare R face parte dintr-un proiect mai mare de a
produce software gratuit. Se poate spune c el este un dialect al altui limbaj, numit
S, creat n 1976 la laboratoarele Bell pentru a se uura calculele statistice. La
nceput s-a folosit o sintax similar Fortran-ului, dar n 1988 a fost rescris n C. Spre
deosebire de R, S nu este un software gratuit. Prima variant de R a fost creat
n Noua Zeeland, 1991, de Ross Ihaka i Robert Gentleman 1. n 1993 s-a fcut
lansarea oficial a proiectului, conceput la nceput ca un software statistic non
gratuit, aa cum mai erau i altele - SAS, SPSS, STATISTICA. n 1995 autorii s-au
hotrt s l fac un software gratuit. Pentru a controla nucleul de baz al limbajului,
s-a creat n 1997 aa numitul R Core Group, care controleaz codul surs. n 2000
s-a lansat versiunea R.1.0.0 iar n 2008 s-a ajuns la versiunea R.2.7.2. Noi am folosit
versiunea R.2.12.2, aprut pe 25 februarie 2011. Exist zeci de site-uri de unde se
poate descrca sistemul R i pachete adiionale..
Printele limbajului , Ross Ihaka scria n 1998 2:
n august 1993 Robert Gentleman i cu mine am plasat copii ale R-ului la
Statlib i am fcut un mic grup pe s-news. Unii ne-au descrcat copiile i s-au oferit
s colaboreze. Cel mai de ndejde a fost Martin Maehler de la ETH Zurich care ne-a
convins s lansm codul surs ca un software gratuit. La nceput am avut ezitri, dar
n iunie 1995 am convenit s punem la dispoziia tuturor codul surs n condiiile
fundaiei FRF 3 .
S-a creat astfel o impresionant comunitate a utilizatorilor i dezvoltatorilor
limbajului. Toi voluntari.
Decizia de a face R un software gratuit, continu Ihaka ne-a fcut s ne
propunem eluri mai mari dect un simplu soft statistic cu care s ne putem preda
cursurile mai bine. Ne-a dat acces la o mas de indivizi foarte talentai doritori s se
implice n proiect. Poate unul din cele mai bune lucruri care ni s-a ntmplat a fost
ansa de lucra cu asemenea oameni strlucitori . i i exprima optimismul : Se
pare c R a ajuns la punctul n care este destul de stabil pentru a fi folosit de
utilizatori cel puin sub Unix. Sperm ca n 1999 s putem lansa varianta complet
R.1.0 n cadrul fundaiei Free Software
De ce software gratuit? Ce avantaje avem?
n primul rnd, firete, nu dm bani pe el. Dar mai sunt i alte avantaje, cum
arat un entuziast al R-ului, Roger. D. Peng 4 Un software gratuit v garanteaz
libertatea de a folosi programele lui n orice scop (libertatea 0); libertatea de a studia
cum funcioneaz programele i de a le adapta la nevoile voastre. Accesul la codul
1
http://www.biostat.jhsph.edu/~rpeng/biostat776/lecture1.pdf
http://cran.r-project.org/doc/html/interface98-paper/paper.html
3
http://www.fsf.org/
2
http://www.biostat.jhsph.edu/~rpeng/
Chiar i persoane fr o pregtire matematic special pot folosi sitemul R dac au un minimum de
pregtire statistic, de exemplu studeni la biologie, sociologie, agronomie, etc.
6
Manualul complet R Reference Manual care este coninut n kitul de instalare R are 1884 de pagini
din care 60 pagini reprezint indexul cu peste 4000 de funcii puse la dispoziia utilizatorilor care tiu
s le foloseasc.
7
Murrell, P. (2005) R Graphics. Chapman & Hall/CRC Press.
CUPRINS
Introducere
Cap.1 Preliminarii
10
30
52
Cap.5 Programare n R
64
77
122
151
179
Bibliografie
/R
Capitolul 1
Preliminarii
R este un mediu integrat de faciliti software destinat n special analizei
statistice i reprezentrii grafice a datelor. Acesta include un limbaj simplu de
programare, limbajul S, care permite utilizarea pachetelor existente i construirea de
pachete noi de programe destinate analizei statistice i reprezentrii grafice a datelor.
R este un mediu de dezvolare gratuit distribuit sub licen public general
GNU. A fost iniial scris de Ross Ihaka i Robert Gentleman de la departmentul de
statistic de la Universittea din Auckland, New Zealand. Din 1997 s-a format un grup
principal (R Core Team) care poate modifica variante ale R-ului. R-ul s-a dezvoltat
rapid i s-a extins la o mare colecie de pachete de programe.
Site-ul oficial de unde se pot obine gratuit versiuni compilate de R pentru OS
X, Linux i Windows este http://www.r-project.org. Tot aici se pot gsi i resurse
pentru instalarea i utilizarea R-ului. Cea mai recent versiune este 2.13.2 disponibil
din 30.09.2011. Odat cu R se descarc i o serie de pachete de programe (numite i
pachete standard), dar sunt disponibile i alte pachete de programe R prin intermediul
CRAN (Comprehensive R Archive Network http://CRAN.R-project.org) care
conine diferite variante ale sistemului R i ale pachetelor de programe R.
Kitul de instalare R vine cu manuale n care este descris n detaliu modul de
funcionare al programului. De asemenea se gsesc cri specializate pe diverse
domenii unde se utilizeaz statistica i unde se arat cum se poate utiliza R pentru
calculele necesare.
La lansarea n execuie a R-ului apare o
fereastr ca cea alturat i se poate
lucra direct cu R n fereastra consol
interioar.
n meniul Packages
se gsesc
opiuni de instalare separat a unor
pachete suplimentare de programe
specializate pe diverse domenii prin
care posibilitile lui R se pot extinde
foarte mult.
Lucrul cu R se poate face
- fie n regim interactiv: n fereastra Rconsole, dup prompter-ul >, se scrie o
comand acceptat de R, apoi se apas tasta Enter i rezultatul apare imediat mai
jos n aceeai ferestr,
- fie prin script-uri, n regim de programare: comenzile de calcul sunt grupate
ntr-un fiier cu extensia .r care poate fi apelat n mai multe moduri. Un fiier
script poate fi scris n orice editor de text, dar R are un editor ce se apeleaz din
meniul File prin Open script... sau New script. Fiierul script poate fi
executat dup ce se ncarc n mediul R prin File Open script... sau se poate
folosi direct funcia source(), de exemplu, presupunnd c fiierul script se
numete test.r i se afl n directorul de lucru curent, comanda scris la prompt:
>source("test.r") va avea ca efect ncrcarea n spaiul de lucru a fiierului
i executarea comenzilor coninute n fiierul test.r.
6
De exemplu:
> help.search("poisson")
sau echivalent
> ??poisson
or
title
matching
sau echivalent
> quit()
x=2
#se creeaza si initializeaza varibila x
save(x,file="C:/Lucru/date.RData")
# se salveaza variabila x in fisierul date.Rdata
q()
#prsirea sesiunii R
Comenzile se pot separa n R fie prin simbolul punct i virgul fie se pot scrie
pe linii diferite. De exemplu:
> x1=1; x2=3.7;
> x3=5.1;
> x1+x2
[1] 4.7
> x1-x3
[1] -4.1
10
Capitolul 2
Tipuri de date
> s="unu"
> typeof(x)
[1] "character"
> x=1+2i
> typeof(x)
[1] "complex"
> e=1<3
> typeof(e)
[1] "logical"
> s="sir"
> b=charToRaw(s);b
[1] 73 69 72
> typeof(b)
[1] "raw"
variabila = valoare
variabila <- valoare
variabila <<- valoare
valoare -> variabila
valoare ->> variabila
assign("variabila,valoare)
11
> x
[1] 1.3
> y=1/3; y
[1] 0.33333
2.1. Numere
R lucrez cu numere ntregi, reale sau complexe. Numerele reale se scriu cu
punct zecimal sau cu exponent: 0.001 = 1.e-3.
Pentru a calcula o expresie numeric, se poate edita n RConsole de la
prompter expresia corespunztoare, apoi se tasteaz <Enter>. De exemplu,
>> 2*6
[1] 12
#rezultat
Cea de-a doua linie reprezint rspunsul sistemului R, iar [1] indic numrul de ordine
al primei valori afiate pe acest rnd. Alt exemplu:
>> sqrt(2)
[1] 1.414214
Simbolul R
Expresia R
*
/
^
%/%
%%
x+y
x-y
x*y
x/y
x^y
x%/%y
x%%y
Paranteza
Exponeniala
nmulirea, mprirea, ctul, restul
Adunarea i scderea
12
n R exist constante speciale precum: Inf (ce ine locul lui infinit ), NaN (not-anumber, ce indic un rezultat numeric nedefinit ca 0/0, () /( ) , sau
0 () ), NULL (indic un obiect gol) i NA (not available). De exemplu:
> 1/0
[1] Inf
> 5^987
[1] Inf
> 0/0
[1] NaN
> Inf/Inf
[1] NaN
>u=c(1,2,NA,4);u #valoare lipsa reprezentata prin NA
[1] 1 2 NA 4
> A = matrix(data=NA,nrow=2,ncol=3); A
[,1] [,2] [,3]
[1,] NA
NA
NA
[2,] NA
NA
NA
2.2. Vectori
Vectorii sunt structuri de date cu una sau mai multe valori de acelai tip:
ntreg, real, complex, logic, caracter sau raw (iruri de bii). Vectorii cu o singur
component se numesc scalari.
n R, nu sunt permii indici negativi, iar indicele 0 este ignorat. Aadar, indicii
acceptai sunt 1, 2, ...
Vectorii pot fi creai interactiv sau se pot importa din fiiere. Crearea
interactiv a vectorilor se poate face utiliznd funcia de concatenare c. De
exemplu:
> u = c(1,2,3)
> p = c(1.25, 0.75)
> v = c(1+1i,1-2i)
13
> x*y
[1] 2 8 18
> x/y
[1] 2 2 2
> x^y
[1] 2 16 216
> x+2
[1] 4 6 8
> options(digits=2)
> 1/x
[1] 0.50 0.25 0.17
#sau v1=seq(from=3,to=5)
#x se repeta de 2 ori
14
>rep(0,10)
[1] 0 0 0 0 0 0 0 0 0 0
Pentru a determina lungimea unui vector se poate folosi funcia length, ca mai jos:
> x=seq(-15,15,by=5); x
[1] -15 -10 -5
0
5 10 15
> length(x)
#lungimea vectorului x
[1] 7
Primul i ultimul element al lui v sunt mai mari dect zero i condiia este ndeplinit
(TRUE), iar al doilea este negativ i condiia nu este ndeplinit (FALSE).
Operatorii relaionali sunt: < (mai mic), <= (mai mic sau egal), > (mai
mare), >= (mai mare sau egal), = = (egalitate) i != (diferit).
Operatorii logici: & (i), | (sau), ! (negarea).
Vectorii logici pot fi utilizai i n operaii aritmetice. n acest caz, ei se
transform n vectori numerici, FALSE devenind 0, iar TRUE devenind 1:
> p=c(TRUE,FALSE,TRUE)
> q=c(TRUE,FALSE,FALSE)
> p
[1] TRUE FALSE TRUE
> q
[1] TRUE FALSE FALSE
> p+q
[1] 2 0 1
15
> nume="Popescu"
> prenume="Ion"
> numeintreg=paste(nume,prenume)
> numeintreg
[1] "Popescu Ion"
> n=c(nume,prenume)
> n
[1] "Popescu" "Ion"
> n[1]
[1] "Popescu"
> n[2]
[1] "Ion"
Funcia sort se poate folosi pentru a rearanja / sorta elementele unui vector
caracter n ordine alfabetic. De exemplu:
> s=c("Iulia","Magda","Ana","Paula")
> s
[1] "Iulia" "Magda" "Ana"
"Paula"
> sort(s)
[1] "Ana"
"Iulia" "Magda" "Paula"
Matricele pot fi create n diverse moduri. Modalitatea cea mai simpl este de a
utiliza vectori de aceeai lungime care se pun ca i coloane ale matricei prin
instruciunea cbind() sau ca i linii ale matricei prin instruciunea rbind(), ca mai
jos. Dimensiunile unei matrice se pot determina prin folosirea funciei dim.
>
>
>
>
>
y1=c(1,2,3)
y2=c(4,5,6)
A=cbind(y1,y2) # concatenare pe orizontala
B=rbind(y1,y2) # concatenare pe verticala
A
y1 y2
[1,] 1 4
[2,] 2 5
[3,] 3 6
> B
[,1] [,2] [,3]
y1
1
2
3
y2
4
5
6
> dim(B)
[1] 2 3
Pentru ca doi vectori s se poat concatena pe orizontal acetia trebuie s aib acelai
numr de linii, iar pentru se putea concatena pe vertical acetia trebuie s aib
acelai numr de coloane.
16
a<-c(-1,0,1)
b<-c(-2,-1,1)
c<-cbind(a,b); #concatenare vectori pe orizontala
c
a b
[1,] -1 -2
[2,] 0 -1
[3,] 1 1
> d<-cbind(c,c);d #concatenare matrice pe orizontala
a b a b
[1,] -1 -2 -1 -2
[2,] 0 -1 0 -1
[3,] 1 1 1 1
> d=rbind(d,d); d #concatenare matrice pe verticala
a b a b
[1,] -1 -2 -1 -2
[2,] 0 -1 0 -1
[3,] 1 1 1 1
[4,] -1 -2 -1 -2
[5,] 0 -1 0 -1
[6,] 1 1 1 1
> e=cbind(5,c) #se adauga o coloana de 5 la matricea c
> e
a b
[1,] 5 -1 -2
[2,] 5 0 -1
[3,] 5 1 1
> f=rbind(7,c);f #se adauga o linie de 7 la matricea c
a b
[1,] 7 7
[2,] -1 -2
[3,] 0 -1
[4,] 1 1
Dac tipurile vectorilor care intr n matrice sunt diferite atunci se aplic regula
de conversie logice=>numere=>caractere. Este posibil ca lungimile vectorilor s fie
diferite, dar cea mai mare lungime s fie multiplu ntreg al lungimilor mai mici, caz n
care vectorii de lungime mai mic se repet.
O a doua modalitate de a crea matrice, ct i tablouri multidimensionale (arrays)
se poate face i prin comenzile matrix i array plecnd de la un vector prin
aranjarea elementelor lui ntr-un tablou de dimensiuni date.
> y=1:12
> m=matrix(y, nrow=4, ncol=3) #completare pe coloane
> m
[,1] [,2] [,3]
[1,]
1
5
9
[2,]
2
6
10
[3,]
3
7
11
[4,]
4
8
12
17
sau
> m=matrix(1:14, nrow=4, ncol=3)
Warning message:
In matrix(1:14, nrow = 4, ncol = 3) :
data length [14] is not a sub-multiple or multiple
of the number of rows [4]
Dac dorim ca din elementele lui s formm liniile, mai adugm indicaia
byrow=TRUE (valoarea implicit fiind byrow=FALSE). Astfel se obine
> m4=matrix(1:12, nrow=4, ncol=3, byrow=TRUE)
> #completare pe linii
> m4
[,1] [,2] [,3]
[1,]
1
2
3
[2,]
4
5
6
[3,]
7
8
9
[4,]
10
11
12
O alt modalitate de a crea matrice este cea care convertete efectiv un vector
n matrice, folosind funcia dim ca n exemplul de mai jos:
> x=seq(1:12); x
[1] 1 2 3 4
#x este vector
6 7 8 9 10 11 12
> dim(x)=c(4,3); x
[,1] [,2] [,3]
[1,]
1
5
9
[2,]
2
6
10
[3,]
3
7
11
[4,]
4
8
12
#x este matrice
Accesul la elementele din vector, matrice sau array se face punnd indicii de
poziie ai elementului ntre paranteze drepte, i eventual separndu-i prin virgul:
> m=matrix(1:6, nrow=2, ncol=3)
> m
# sau m[,]
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
> m[1,3]
[1] 5
> m[2,] #sau m[2,1:3] (linia a doua)
[1] 2 4 6
> m[2,1:2] #linia a doua, primele doua elemente
[1] 2 4
18
A= 1 10 i B= 8 5 :
1 2
6 0
> A=matrix(c(2,4,1,10,6,0),ncol=2,byrow=TRUE)
> A
[,1] [,2]
[1,]
2
4
[2,]
1
10
[3,]
6
0
> B=matrix(c(4,6,8,5,1,2),ncol=2,byrow=TRUE)
> B
[,1] [,2]
[1,]
4
6
[2,]
8
5
[3,]
1
2
Apoi
> A+B
[1,]
[2,]
[3,]
> A-B
[,1] [,2]
6
10
9
15
7
2
[,1] [,2]
[1,]
-2
-2
[2,]
-7
5
[3,]
5
-2
> A*B
> # (aij*bij)i,j = inmultirea element cu element
[,1] [,2]
[1,]
8
24
[2,]
8
50
[3,]
6
0
> A/B
# (aij/bij)i,j
> # (aij/bij)i,j = impartirea element cu element
[,1]
[,2]
[1,] 0.500 0.6666667
[2,] 0.125 2.0000000
[3,] 6.000 0.0000000
> A^B
# (aij^bij)i,j
> #(aij^bij)i,j=ridicarea la putere element cu elem.
[,1]
[,2]
[1,]
16
4096
[2,]
1 100000
[3,]
6
0
19
Dac unul dintre operanzi este vector i al doilea matrice, atunci la nmulirea
vectorului cu matricea, vectorul este organizat n vector linie sau coloan astfel nct
s se poat realiza nmulirea dintre vector i matrice. De exemplu:
> x=1:2; x
[1] 1 2
> A=matrix(1:4,c(2,2)); A
[,1] [,2]
[1,]
1
3
[2,]
2
4
> x%*%A
[,1] [,2]
[1,]
5
11
> A%*%x
[,1]
[1,]
7
[2,]
10
#vector
#matrice
1 3
(5 11)
(1 2)
2 4
1 3 1 7
2 4 2 10
20
> solve(M)
# M^(-1)
[,1] [,2]
[1,] -2.0 1.0
[2,] 1.5 -0.5
> A=matrix(c(1,2,1,2),c(2,2)); A
#det(A)=0
[,1] [,2]
[1,]
1
1
[2,]
2
2
> solve(A)
Error in solve.default(A) :
Lapack routine dgesv: system is exactly singular
, , 2
[1,]
[2,]
x=1:8
dim(x)=c(2,2,2)
x
, 1
[,1] [,2]
[1,]
1
3
[2,]
2
4
, , 2
[1,]
[2,]
[,1] [,2]
5
7
6
8
21
>
>
>
>
>
,
x=1:4
y=5:8
t1=array(x,c(2,2,2))
t2=array(y,c(2,2,2))
t1
, 1
[,1] [,2]
[1,]
1
3
[2,]
2
4
, , 2
[1,]
[2,]
[,1] [,2]
1
3
2
4
> t2
, , 1
[1,]
[2,]
[,1] [,2]
5
7
6
8
, , 2
[1,]
[2,]
[,1] [,2]
5
7
6
8
> t1*t2
, , 1
[,1] [,2]
[1,]
5
21
[2,]
12
32
, , 2
[1,]
[2,]
[,1] [,2]
5
21
12
32
> t1%*%t2
[,1]
[1,]
140
Dac A i B sunt dou tablouri numerice atunci produsul lor exterior (engl.,
outer product) va fi un tablou numeric ale crui elemente se obin prin formarea
tuturor combinaiilor posibile ale elementelor lui A i B. Simbolul pentru acest tip de
produs este %0%:
> AB = A%o%B
sau echivalent
> AB = outer(A,B,*)
22
celui de-al doilea argument. Astfel, funcia aperm poate fi o transpus generalizat ca
n exemplul urmtor:
A=array(1:12, dim=c(2,3,2))
> A
, , 1
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
, , 2
[1,]
[2,]
> B = aperm(A,c(2,1,3))
> B
, , 1
[,1] [,2]
[1,]
1
2
[2,]
3
4
[3,]
5
6
, , 2
[1,]
[2,]
[3,]
[,1] [,2]
7
8
9
10
11
12
23
Aici, tapply folosete funcia mean pentru a grupa elementele primului argument,
medii, definit de nivelurile celei de-a doua componente, orasef, ca i cum ar fi
structuri vectoriale separate. Rezultatul este un vector de lungime egal cu numrul
nivelurilor. Pentru a calcula i eroarea standard, determinm variaia cu funcia var i
calculm eroarea standard:
> eroare_std=function(x){sqrt(var(x))/length(x)}
> media_medie=tapply(medii,orasef,eroare_std)
> media_medie
AG
DB
OT SB
VL
0.2589151 0.6010408 NA NA 0.2694301 #eroarea std
n care pe fiecare coloan sunt date de acelai tip. Un exemplu este tabelul urmtor:
Nume
Popescu Nicolae
Stan Ion
Vasile Anca
Analiz
8
7
9
Algebr
6
7
8
O variabil data frame se creeaz prin alipirea unor vectori de aceeai dimensiune,
ca n exemplele de mai jos:
>
>
>
>
c1=c("a","b","c")
c2=c(1,2,3)
df1=data.frame(c1,c2)
df1
24
1
2
3
c1 c2
a 1
b 2
c 3
sau
> clasa=c("9A","9B","9C","9D","9E","9F","9G","9H")
> media=(8.82,9.01,8.45,8/23,8.14,8.01,7.76,9.08)
> catalog=data.frame(clasa,media); catalog
clasa
media
1
9A 8.8200000
2
9B 9.0100000
3
9C 8.4500000
4
9D 0.3478261
5
9E 8.1400000
6
9F 8.0100000
7
9G 7.7600000
8
9H 9.0800000
Numele
coloanelor
valorile
liniilor,
ca
i
din
data.frame
(sau
din alt obiect precum
matricea sau vectorul)
pot fi editate cu
ajutorul unui editor
propriu R care se
apeleaz
prin
comenzile fix sau
edit, ca mai jos:
> fix(df1)
> df1
unu doi
lin.1
a
1
lin.2
b
2
lin.3
c
3
Numele coloanelor unei date de tip data frame se obine prin comanda
names(data.frame), iar coloana cu un nume dat se poate accesa prin data$nume
ca n exemplele urmtoarea:
> df1
unu doi
lin.1
a
1
lin.2
b
2
lin.3
c
3
> names(df1)
#numele coloanelor
[1] "unu" "doi"
> df1$unu
#coloana cu numele "unu"
[1] a b c
Levels: a b c
> df1$unu[3]
#elem. al 3-lea de pe coloana "unu"
[1] c
Levels: a b c
sau
> names(catalog)
#numele coloanelor
[1] "clasa" "media"
> catalog[1]
#prima coloana
clasa
1
9A
2
9B
3
9C
4
9D
5
9E
6
9F
7
9G
8
9H
> catalog[1,1] #elem.din prim coloana, prima linie
[1] 9A
Levels: 9A 9B 9C 9D 9E 9F 9G 9H
26
De exemplu, s presupunem c
s-au creat nite date n Excel ca
n figura alturat, se selecteaz
i se copiaz n clipboard.
Datele se citesc n R astfel:
> t=read.table("clipboard")
> t
Analiza Algebra Fizica
Ion
8
7
7
Nicu
6
5
8
Vasile
8
9
7
Dac am fi selectat doar matricea de date numerice s-ar fi citit n R tot ca data
frame. O metod alternativ este s salvm documentul Excel ca fiier text sau fiier
csv i s-l citim cu read.table sau read.csv.
> t2=read.table(file.choose())
> t2
Analiza Algebra Fizica
Ion
8
7
7
Nicu
6
5
8
Vasile
8
9
7
> t3=read.csv(file.choose())
> t3
X Analiza Algebra Fizica
1
Ion
8
7
7
2
Nicu
6
5
8
3 Vasile
8
9
7
27
se salveaz obiectul data frame t n fiierul t.txt din directorul curent de unde
poate fi citit eventual alt dat cu read.table.
Pentru scrierea vectorilor sau matricelor n fiiere text se poate utiliza
instruciunea write. Citirea matricelor din aceste fiiere se face cu instruciunea
scan. Sintaxa instruciunii write este:
write(matricea, file = "fiierul", ncolumns
=nr.coloane, append = FALSE, sep = ",")
din care doar matricea (vectorul) i fiierul sunt obligatorii. Dac file="" atunci se
scrie la consol. Dac apend=TRUE atunci se adaug datele la sfritul fiierului altfel
se terge fiierul i se recreaz cu datele noi. Separatorul poate fi i alt caracter, de
exemplu spaiu sau tab. Scrierea se face pe linii. Pentru a scrie coloanele la nceput,
trebuie transpus matricea. Citirea unei matrice dintr-un fiier text cu instruciunea
scan are forma
scan(file = "", what = numeric), nmax = -1, n = -1,
sep = "",dec = ".",skip = 0, nlines = 0)
File este numele fiierului, what reprezint tipul de date care se citesc (logical,
integer, numeric, complex, character, raw, list), nmax reprezint numrul maxim de
28
2.7. Liste
Alt exemplu:
> clasa=c("9A","9B","9C","9D","9E","9F","9G","9H")
> media=c(8.82,9.01,8.45,8/23,8.14,8.01,7.76,9.08)
> catalog=data.frame(clasa,media)
> lista=list(clasa,media,catalog)
> lista[1]
[[1]]
[1] "9A" "9B" "9C" "9D" "9E" "9F" "9G" "9H"
> lista[2]
[[1]]
[1] 8.8200000 9.0100000 8.4500000 9.3478261
[5] 8.1400000 8.0100000 7.7600000 9.0800000
> lista[3]
[[1]]
29
clasa
media
1
9A 8.8200000
2
9B 9.0100000
3
9C 8.4500000
4
9D 9.3478261
5
9E 8.1400000
6
9F 8.0100000
7
9G 7.7600000
8
9H 9.0800000
> lista[[1]][2]
[1] "9B"
2.8. Raw-uri
irurile de bii se obin prin declararea unei variabile ca vector de tip raw i
atribuirea fiecrui element din vector a unei valori ntregi ntre 0 i 255 convertit la
tipul raw prin instruciunea as.raw. Dac nu reuete conversia atunci valoarea este
luat implicit 0. Exemplu:
> x=raw(2) #creeaza un vector raw gol de dim. 2
> x[1]=as.raw(100)
#codul ASCII 100 (caract. d)
> x[2]=charToRaw("Z") #codul ASCII al caract. Z
> x #afisare a cate o pereche de cifre hexazecimale
[1] 64 5a
> rawToChar(x) #conversie raw in sir de caractere
[1] "dZ"
> rawToBits(x) #conversie la biti
[1] 00 00 01 00 00 01 01 00 00 01 00 01 01 00 01 00
30
Capitolul 3
Funcii predefinite n R
Practic totul n R se obine prin funcii. S urmrim comenzile de mai jos:
> "+"(2,3)
[1] 5
> 2+3
[1] 5
Se vede c operaia de adunare este implementat ca o funcie. La fel alte operaii x-y,
x/y, x*y, x^y sunt funcii pentru care utilizm forma operatorial de notaie, mai
comod.
R vine cu un mare numr de funcii predefinite pentru prelucrarea datelor, iar
diversele pachete adiionale vin cu funcii suplimentare. n cele ce urmeaz descriem
un numr de funcii curent utilizate. n manualele ce nsoesc distribuiile de R, n
carile din bibliografie sau n diverse locaii de pe internet (de exemplu la adresa
http://www.statmethods.net/ sau pur i simplu cutnd cu Google documentaie pentru
R) se pot gsi informaii pentru multe alte funcii disponibile. Pe lng funciile
predefinite putem defini funcii noi care se pot utiliza exact ca cele predefinite.
Un lucru este important de menionat. Argumentele funciilor au n general
nume i dac se specific numele lor atunci nu este important ordinea n care se pun,
ca n exemplul urmtor n care se creaz un ir de numere cu funcia seq.
> seq(from=1, by=2, to=5)
[1] 1 3 5
> seq(by=2, to=5, from=1)
[1] 1 3 5
31
pune n eviden c n funcia seq primul argument este from, al doilea este to i al
treilea este by. Pentru foarte multe funcii din R apelul se face cu primele 1, 2, 3
argumente nedenumite, dar n ordinea i cu semnificaia specificat n documentaie,
pe cnd restul argumentelor sunt parametri opionali din care unii se introduc prin
numele lor iar ceilali se utilizeaz prin valorile lor implicite.
3.1. Funcii numerice
Aceste funcii aplicate unui numr dau ca rezultat un alt numr, iar aplicate
unui vector sau unei matrice se aplic fiecrui element al vectorului sau matricei
respective (sunt vectorizate).
Funcia
Explicaii
abs(x)
|x|
sqrt(x)
x
Dac x (n-1,n] valoarea returnat este n
Partea ntreag a lui x
Rotunjire la n zecimale
Rotunjire la cele mai semnificative n cifre
Funcii trigonometrice directe i inverse
precum i funcii hiperbolice directe i inverse
ceiling(x)
floor(x), trunc(x)
round(x, digits=n)
signif(x, digits=n)
cos(x), sin(x), tan(x),
acos(x), asin(x), tan(x),
cosh(x), acosh(x), etc.
log(x)
log10(x)
exp(x)
besselI(x, nu)
besselK(x, nu)
besselJ(x, nu)
besselY(x, nu)
gamma(x), lgamma(x)
beta(a,b), lbeta(a,b)
digamma(x)
psigamma(x, deriv)
Logaritmul natural, ln x
Logaritmul n baza 10, lg x
ex
Funcii Bessel. Parametru nu este ordinul
funciei. Parametru x este un vector numeric
cu valori pozitive.
Funcia gamma i logaritm natural din gamma
Funcia beta i logaritm natural din beta
Calculeaz derivata lui log(gamma(x))
Calculeaz derivata de ordin deriv a lui
digamma(x)
choose(n,k), lchoose(n,k)
factorial(x)
32
F<-splinefun(x, y, method)
spline(x, y , n, method,
xmin, xmax, xout)
Graficul este :
BesselJ(x,2)
-0.2
0.0
0.2
0.4
O functie Bessel
10
15
20
33
Graficul este:
0.0
-1.0
-0.5
y, Spline(x)
0.5
1.0
O functie spline
10
crossprod(A,B)
crossprod(A)
cbind(A,B,...)
rbind(A,B,...)
rowMeans(A)
rowSums(A)
colMeans(A)
colSums(A)
min(A), max(A),
range(A)
solve(A)
ginv(A)
x<-eigen(A)
Explicaii
nmulirea element cu element
nmulirea matriceal
Dac a i b sunt vectori genereaz o matrice x cu
xi,j = f(ai, bj). Dac a i b sunt matrice genereaz un array
x cu xi,j,k,l = f(ai,j, bk,l) .
Forma a %o% b este asemntoare fa de funcia produs.
AtB, respectiv AtA
Combin orizontal (rezultatul va avea liniile din A, B,...)
Combin vertical (rezultatul este o matrice cu coloanele din
A, B,...)
Se obine un vector cu mediile liniilor
Se obine un vector cu sumele elementelor liniilor
Se obine un vector cu mediile coloanelor
Se obine un vector cu sumele elementelor coloanelor
Minimul, maximu, respectiv un vector cu minimul si
maximul
Inversa matricei A
Inversa generalizat Moore-Penrouse (se gsete n pachetul
MASS)
x$values conine valorile proprii ale lui A
x$vectors conine vectorii proprii ai lui A
34
t(A), det(A)
x<-svd(A)
Se obine rspunsul:
> a
[1,]
[2,]
[3,]
[4,]
[5,]
[,1]
0.2368829
0.1015411
0.4941975
0.8037851
0.2050783
[,2]
0.79721628
0.70852984
0.28829965
0.04331768
0.22855288
[,3]
0.1265954
0.7379991
0.2681115
0.5082257
0.3172556
35
[,4]
0.04369927
0.03374915
0.92383512
0.62702404
0.75981321
[,5]
0.2061009
0.4783938
0.3105410
0.3799365
0.1595518
> b
[1] 0.4920966 0.5553061 0.3207777 0.2010808 0.5628473
> x
[1] 0.1839354 0.9262001 1.2986354 0.3486333 -2.2779749
system elapsed
0.08
1.36
[,1]
[,2]
[,3]
[,4]
[,5]
0.3264044 0.73432693 -0.67659694 0.3795791 0.3029054
0.4377868 0.04995971 0.68624453 -0.3881873 -0.1576330
0.5506698 -0.64362770 0.21134194 0.6398041 0.3044435
0.4216151 0.14932348 -0.14367175 -0.5354580 -0.8120513
0.4699004 -0.14735628 -0.07731778 -0.0957380 0.3623354
Se vede c trei valori proprii sunt aproape zero. n fapt ele sunt zero, matricea avnd
rangul 1 i doar erorile de rotunjire fac rezultatele de ordinul 10-16. Descompunerea
singular este:
> ds
$d
[1] 6.870905e+00 1.077193e-01 1.869400e-16 2.686574e-17 3.540473e-18
$u
[1,]
[2,]
[3,]
[4,]
[5,]
[,1]
[,2]
[,3]
[,4]
[,5]
-0.3262407 0.77055695 -0.5096937 -0.1995559 0.014098365
-0.4377668 0.09392287 0.3454248 0.1386439 -0.813017974
-0.5507955 -0.59182723 -0.3600220 -0.4655446 -0.004147016
-0.4215743 0.19216386 0.6827627 -0.2779026 0.491887645
-0.4699219 -0.10116352 -0.1584718 0.8043592 0.311178980
36
$v
[1,]
[2,]
[3,]
[4,]
[5,]
[,1]
[,2]
[,3]
[,4]
[,5]
-0.3932570 -0.5884878 0.674404332 -0.20995153 -0.01141111
-0.3959388 -0.5602933 -0.706356531 0.03387009 0.17093016
-0.4729784 0.2496549 -0.138133931 -0.21376690 -0.80572118
-0.4682765 0.2002217 0.164709931 0.84032560 0.08574326
-0.4955703 0.4871727 0.005376199 -0.45047726 0.56045887
Putem verifica faptul c A=UDVt, unde U i V sunt matrici ortogonale (date de ds$u,
ds$v), iar D este matricea diagonal cu ds$d pe diagonal. Verificarea este fcut prin
comanda urmtoare:
> a-ds$u%*%diag(ds$d)%*%t(ds$v)
[1,]
[2,]
[3,]
[4,]
[5,]
[,1]
-1.110223e-16
0.000000e+00
-2.220446e-16
-2.220446e-16
-2.220446e-16
[,2]
-8.881784e-16
-4.440892e-16
-4.440892e-16
-4.440892e-16
-6.661338e-16
[,3]
-8.881784e-16
-2.220446e-16
-2.220446e-16
-2.220446e-16
-4.440892e-16
[,4]
-6.661338e-16
-2.220446e-16
-2.220446e-16
-2.220446e-16
-4.440892e-16
[,5]
-8.881784e-16
-2.220446e-16
-4.440892e-16
-2.220446e-16
-4.440892e-16
Din nou erorile de rotunjire duc la un rezultat doar foarte apropiat de zero, nu exact
zero.
3.3. Funcii pentru iruri de caractere
Explicaii
character(length)
Creaz un ir de blank-uri de lungime length
nchar(x,...)
Numrul de caractere din ir
substr(x,start=n1,stop=n2)
Extrage un subir dintr-un ir dat sau nlocuiete
o parte dintr-un subir cu un ir dat
grep(model,x,fixed=TRUE)
Caut irul model in x (x este convertit la un
vector de iruri). Rezultatul este o mulime de
indici care specific indicii irurilor unde s-a
gsit model. Printre parametrii opionali se
numr: fixed=TRUE,FALSE care dac este
FALSE cutarea se face dup model=expresie
regular, ignore.case=TRUE,FALSE, care
specific dac se ignor sau nu faptul c sunt
litere mari sau mici.
sub(sir1,sir2,x,fixed=TRUE) nlocuiete ir1 cu ir2 n x. Dac
gsub(sir1,sir2,x,fixed=TRUE) fixed=FALSE atunci ir1 este o expresie
regulat. Parametrul ignore.case=TRUE, FALSE
controleaz dac se ine seama de caractere
majuscule i minuscule. Funcia sub nlocuiete
doar prima apariie a lui ir1 iar funcia gsub
nlocuiete toate apariiile irului ir1.
37
strsplit(x, split)
toupper(x)
tolower(x)
LETTERS, letters
Convertete la majuscule
Convertete la minuscule
Sunt vectori cu caracterele majuscule
(minuscule) ale alfabetului latin.
Exemplul 3.6 Urmrind comenzile de mai jos se pot vedea unele variante de
aplicare a operaiilor cu iruri.
> x="avxfdrwyudbcbdgfjavsjhdhgderwrwy"
> nchar(x)
[1] 32
> x1=strsplit(x,split=NULL)
> x1
[[1]]
[1] "a" "v" "x" "f" "d" "r" "w" "y" "u" "d" "b" "c" "b"
[14] "d" "g" "f" "j" "a" "v" "s" "j" "h" "d" "h" "g" "d"
[27] "e" "r" "w" "r" "w" "y"
> x2=unlist(x1)
> x2
[1] "a" "v" "x" "f" "d" "r" "w" "y" "u" "d" "b" "c" "b"
[14] "d" "g" "f" "j" "a" "v" "s" "j" "h" "d" "h" "g" "d"
[27] "e" "r" "w" "r" "w" "y"
> x3=rev(x2)
> x3
[1] "y" "w" "r" "w" "r" "e" "d" "g" "h" "d" "h" "j" "s"
[14] "v" "a" "j" "f" "g" "d" "b" "c" "b" "d" "u" "y" "w"
[27] "r" "d" "f" "x" "v" "a"
> x4=paste(x3,collapse="")
38
> x4
[1] "ywrwredghdhjsvajfgdbcbduywrdfxva"
> x5=substr(x4,3,7)
> x5
[1] "rwred"
> x6=sub("d","D",x)
> x7=gsub("d","D",x)
> x
[1] "avxfdrwyudbcbdgfjavsjhdhgderwrwy"
> x6
[1] "avxfDrwyudbcbdgfjavsjhdhgderwrwy"
> x7
[1] "avxfDrwyuDbcbDgfjavsjhDhgDerwrwy"
> x8=unlist(strsplit(x,split="w"))
> x8
[1] "avxfdr"
"yudbcbdgfjavsjhdhgder"
[4] "y"
> i=grep("r",x8)
> i
[1] 1 2 3
> x8[i]
[1] "avxfdr"
"yudbcbdgfjavsjhdhgder"
"r"
"r"
1
2
x m 2
2 2
Modul de apelare
dnorm(x,mean=0,sd=1,log=FALSE)
pnorm(x,mean=0,sd=1,lower.tail=TRUE,
log.p=FALSE)
qnorm(q,mean=0,sd=1,lower.tail=TRUE,
log.p=FALSE)
rnorm(n,mean,sd), n este numrul de valori
aleatoare
39
Log-normal
1
2 x
log x 2
2 2
Binomial
P(X=x) = C nx p x 1 p n x
x = 0, 1, 2, ..., n
mean = m, sd=
dlnorm(x,meanlog=0,sdlog=1,log=FALSE)
plnorm(q, meanlog=0, sdlog=1,
lower.tail=TRUE, log.p=FALSE)
qlnorm(p, meanlog=0, sdlog=1,
lower.tail=TRUE, log.p=FALSE)
rlnorm(n, meanlog = 0, sdlog = 1)
meanlog = , sdlog =
dbinom(x, size, prob, log=FALSE)
pbinom(q,size,prob, lower.tail=TRUE,
log.p = FALSE)
qbinom(p,size,prob,lower.tail=TRUE,
log.p = FALSE)
rbinom(nr, size, prob), nr este numrul de
valori aleatoare
Binomial negativ
x n n
P(X=x) =
p 1 p x
n x!
xN , n>0
Student
1
1
2 2
x
2
x
1
2
Hi ptrat
1
/2
/ 2
x / 2 1e x / 2 ,
x>0
size=n, prob=p
dnbinom(x, size, prob, log = FALSE)
pnbinom(q,size,prob,lower.tail=TRUE,
log.p = FALSE)
qnbinom(p,size,prob,lower.tail=TRUE,
log.p = FALSE)
rnbinom(n, size, prob)
size=n, prob=p
dt(x, df,ncp=0, log=FALSE)
pt(q, df,ncp=0, lower.tail = TRUE,
log.p = FALSE)
qt(p, df, ncp=0, lower.tail = TRUE,
log.p = FALSE)
rt(n, df, ncp=0), n este numrul de valori
aleatoare
1
x x 2
0
1
Exponenial
x e x , x>0, >0
40
Gamma
x k 1
k a k
x
a
Beta
a b a 1
1 x b 1
x
a b
>0, >0, x (0, 1)
F
1
a
x
a bb
,
2 2
a / 2 a 1
x 2 1
a
x
b
a b
2
Hipergeometric
P(X=x) =
C mx C nk x
k
Cm
n
Poisson
P(X=x) =
x e
k!
, >0, x N
Uniform
1
x
, x [a, b]
ba
41
dweibull(x,shape,scale=1,log=FALSE)
pweibull(q, shape, scale = 1,
x
a 1
lower.tail = TRUE, log.p = FALSE)
a x
x e b , x>0, a>0, qweibull(p, shape, scale = 1,
bb
lower.tail = TRUE, log.p = FALSE)
rweibull(n, shape, scale = 1)
b>0
shape=a, scale=b
dlogis(x, location = 0, scale = 1,
Logistic
log = FALSE)
x m
plogis(q, location = 0, scale = 1,
1
e s
lower.tail = TRUE, log.p = FALSE)
x
s
qlogis(p, location = 0, scale = 1,
x m 2
location=m, scale=s
Weibull
0.6
0.4
0.0
0.2
0.8
1.0
-10
-5
10
Explicaii
Media obiectului x. trim indic ce fracie din valorile
dinspre capete se neglijeaz. Parametrul na.rm indic
dac se elimin NA i NaN din calcul.
Deviaia standard
42
var(x, y = NULL,
na.rm = FALSE, use)
median(x,na.rm=FALSE)
cov(x, y = NULL,
use = "everything",
method = "kendall")
cor(x, y = NULL, use
= "everything",method
= "kendall")
quantile(x,prob,
na.rm=FALSE,type=7)
range(x)
sum(x,y),
prod(x,y,...)
diff(x, lag=1)
min(x)
max(x)
summary(obiect,...)
scale(x, center=TRUE,
scale=TRUE)
43
Max.
10.000
Explicaii
apply(x, MARGIN,
FUN, ...)
44
> x1=apply(x,MARGIN=1,FUN=sum)
> x1
[1] 22 26 30
> x2=apply(x,MARGIN=2,FUN=sum)
> x2
[1] 6 15 24 33
> x3=lapply(x,FUN=sqrt)
> x3
[[1]]
[1] 1
[[2]]
[1] 1.414214
[[3]]
[1] 1.732051
[[4]]
[1] 2
[[5]]
[1] 2.236068
[[6]]
[1] 2.44949
[[7]]
[1] 2.645751
[[8]]
[1] 2.828427
[[9]]
[1] 3
[[10]]
[1] 3.162278
[[11]]
[1] 3.316625
[[12]]
[1] 3.464102
> x4=sapply(x,FUN=sqrt)
> x4
[1] 1.000000 1.414214 1.732051 2.000000 2.236068
[6] 2.449490 2.645751 2.828427 3.000000 3.162278
[12] 3.316625 3.464102
> y=matrix(seq(from=0,by=10,length=12),ncol=4);
> y
[,1] [,2] [,3] [,4]
[1,]
0
30
60
90
[2,]
10
40
70 100
[3,]
20
50
80 110
> z=mapply(sum,x,y)
> z
45
[1]
12
23
34
45
56
67
78
> z1=matrix(z,ncol=ncol(x))
> z1
[,1] [,2] [,3] [,4]
[1,]
1
34
67 100
[2,]
12
45
78 111
[3,]
23
56
89 122
i j k
8 10
> fir=factor(ir)
> p=tapply(r,fir,sum)
> ip=as.numeric(unlist(dimnames(p)))
> p
-2 -1 0 1 2 3 4
1 4 9 14 19 18 10
> ip
[1] -2 -1 0 1 2 3 4
> dimnames(p)<-NULL
> p
[1] 1 4 9 14 19 18 10
46
Explicaii
print(x, ...)
read.csv,
read.table,
read.csv2
read.delim
read.delim2
cat(...,file="",sep="",fill=FALSE,append=FALSE)
Vectorii i numele din ... sunt scrise n fiierul file (dac nu
readLines
write,
write.table,
write.csv,
write.csv2
scan(file="",what,nmax=-1,n=-1,sep="",skip=0,
nlines=0), unde file este fiierul, what este tipul de date din
47
format
save
save.image
load
ls()
rm(list)
n capitolul despre tipuri de date s-au dat mai multe exemple de citire sau scriere a
datelor. n exemplul urmtor ilustrm utilizarea funciilor paste, cat, print.
Exemplul 3.11 Un vector este scris la consol cu componentele numite detaliat.
> x=1:10
> y=sqrt(x)
> et=paste("y",x,sep="")
> et
[1] "y1" "y2" "y3" "y4" "y5" "y6" "y7" "y8" "y9" "y10"
> cat(paste(et,"=",format(y,digits=3),";",sep=""),"\n")
y1=1.00; y2=1.41; y3=1.73; y4=2.00; y5=2.24; y6=2.45;
y7=2.65; y8=2.83; y9=3.00; y10=3.16;
> print(y, digits=3)
[1] 1.00 1.41 1.73 2.00 2.24 2.45 2.65 2.83 3.00 3.16
Exemple
X=seq(0,1,length=100)
Y=seq(from=1, to=4, by=0.1)
Z=seq(from=10,by=0.3,along=X)
rep(x, ...). La opiuni avem times, rep(x,10); rep(x,times=10);
length.out, each (la each se repet rep(1:3,length=5);
rep(1:5,each=2)
48
x<-c(2,3,4)
x=1:3; y=4:6; z<-cbind(x,y);
combina pe coloanele (liniile) unor vector, u=rbind(x,y)
cbind, rbind
x=matrix(1:10, ncol=2)
permit crearea de matrice sau blocuri y=array(1:24, dim<-c(2,3,4))
multidimensionale
Exemplul 3.12. Ilustrm cum apar rezultatele la unele modele de funcii din
tabelul de mai sus.
> rep(1:3,length=5)
[1] 1 2 3 1 2
> rep(1:5,each=2)
[1] 1 1 2 2 3 3 4 4 5 5
> x=1:3; y=4:6; z<-cbind(x,y);
> z
x y
[1,] 1 4
[2,] 2 5
[3,] 3 6
> t=array(1:24, dim<-c(2,3,4))
> t
, , 1
[1,]
[2,]
, , 2
[1,]
[2,]
, , 3
[1,]
[2,]
, , 4
[1,]
[2,]
49
x=1:5
y=letters[1:5]
a=data.frame(x,y)
a
x y
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
> class(a)
[1] "data.frame"
> b=as.character(a)
> b
[1] "1:5" "1:5"
> c=as.matrix(a)
> c
x
y
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
[4,] "4" "d"
[5,] "5" "e"
> as.numeric(c)
[1] 1 2 3 4 5 NA NA NA NA NA
Warning message:
NAs introduced by coercion
50
Exemplul 3.14. Din 1000 aruncri cu o moned, faa a aprut de 490 ori. S se
testeze dac probabilitatea p=1/2 de apariie a feei este admisibil cu un prag de risc
de 0.05. Urmtoarea comand n R face acest test.
> rez=binom.test(490, 1000, p=0.5, conf.level=0.95)
> rez
Exact binomial test
data: 490 and 1000
number of successes = 490, number of trials = 1000,
p-value = 0.548
alternative hypothesis: true probability of success is not
equal to 0.5
95 percent confidence interval:
0.4585849 0.5214742
sample estimates:
probability of success
0.49
51
Exemple
De exemplu
> system.time(for(i in 1:10000) x <mean(rnorm(1000, mean=4, sd=5)))
user system elapsed
1.72
0.00
1.72
proc.time()
system elapsed
0.08
1.36
Numrul funciilor predefinite n R este mult mai mare dact am descris noi
aici i pot apare funcii noi n versiunile ulterioare. Funciile descrise n tabelele de
mai sus fac parte din pachetul base i din pachetul stats, i foarte probabil vor rmne
i n versiunile ulterioare de R. Pachetele adiionale conin multe funcii suplimentare
care sunt orientate spre rezolvarea unor probleme specifice. Vom mai decrie ulterior
unele funcii din pachetul tseries, funcii orientate spre lucrul cu serii temporale.
52
Capitolul 4
Funcii grafice n R
n R se pot executa grafice de calitate pentru datele admise. Aceste grafice
sunt trimise pe ecran sau n fiiere de diverse tipuri. Pentru a realiza acest lucru
trebuie deshis un device. Comanda windows() deschide ecranul ca dispozitiv grafic,
comanda jpeg() deschide ca dispozitiv grafic un fiier n care se va scrie informaia
grafic n format jpeg, postscript() deschide un fiier de tip postscript, pdf(), png(),
tiff(), bitmap(), win.metafile(), etc. Aceste comenzi au ca parametru file numele
fiierului unde se salveaz graficul, width=limea n pixeli, height=nlimea n
pixeli. Numai un dispozitiv este activ la un moment, trecerea de la unul la altul se face
dev.next(), dev.prev(), dev.set(which=k). Listarea dispozitivelor grafice se face cu
comanda dev.list(), nchiderea unui dispozitiv cu dev.off(k), iar nchiderea tuturor cu
graphics.off(). Cnd s-a nchis un dispozitiv diferit de ecran, imaginea din el este
salvat n fiierul specificat n parametrul file. Dup comanda graphics.off() trebuie
deschis un nou dispozitiv pentru a putea tipri grafic, de regul windows() pentru
ecran. Un clic dreapta pe fereastra cu reprezentarea grafic de pe ecran deschide un
meniu cu opiuni de salvare sau copiere a coninutului n clipboard.
Rutinele grafice sunt cuprinse n modulul de baz: base precum i n dou
pachete suplimentare grid i lattice. Rutinele de baz se mpart n trei categorii:
rutine de nivel nalt high level n urma crora se creaz o fereastr grafic nou n
care se pun graficele specificate prin argumentele rutinelor; rutine de nivel jos low
level prin care la graficul existent se adaug informaii suplimentare ca text, puncte,
linii; grafice interactive prin care utilizatorul poate interaciona cu graficul prin
intermediul mausului pentru a obine informaii despre valorile din diverse poziii de
pe grafic sau pentru a aduga informaii n diverse poziii de pe grafic.
Rutinele de nivel nalt din modulul de baz sunt:
Instruciunea
plot
pairs
coplot
hist
Explicaii
plot(x,y,...), plot(xy,...), tiprete punctele de coordonate (x[i],y[i])
utliznd opiunile grafice ... (vezi mai jos). plot(f,x) unde f este un
factor pentru x tiprete un boxplot pentru x grupat dup factorul f.
plot(x~y) face graficele coloanelor y i n funcie de x. plot(x)
pentru o variabil care are metoda plot produce un grafic specific
acelui tip de variabil.
pairs (x) unde x este o matrice face toate graficele x i , x j
unde x i i x j sunt coloane ale lui x
coplot(x~y,f) execut graficele lui y depinznd de x, pentru fiecare
nivel al factorului f
hist(x,...) tiprete histograma frecvenelor valorilor din vectorul x.
Opiunea frecvent utilizat este nclass=n pentru a specifica n cte
clase se mpart datele din x. Cu opiunea probability=TRUE
histograma va reprezenta probabilitile nu frecvenele.
53
boxplot
qqnorm, qqplot,
qqline
barplot
dotchart
image
contour,
filled.contour
persp
Prin tiprirea cu rutine de nivel jos se adaug elemente noi la graficul existent.
Mai jos sunt descrise unele rutine grafice i unii parametri ai acestora. Restul se pot
afla prin comanda help.
Rutina grafic
points
lines
Explicaii
points(x,y,...) tiprete puncte n coordonatele specificate de x i y
lines(x,y) adaug linii ntre punctele de coordonate specificate n
vectorii x, y.
text
54
mtext
abline
axis
segments
arrows
rect
polygon
box
grid
legend
title
title(main=text1,sub=text2,xlab=text3,ylab=text4,...) determin
scrierea unui titlu(main), subtitlu(sub), etichete pentru axe(xlab,
ylab) care sunt luate din text1, text2, etc.
Pentru diveri parametri grafici R menine o list numit par cu valorile acestora. Cu
comanda par() putem afla valorile acestor parametri. Cei mai utilizai parametri
grafici sunt n tabelul urmtor:
Parametrul grafic
xlog
Valoare
implicit
FALSE
ylog
pch
FALSE
1
col
black
col.axis
col.lab
col.main
col.sub
cex, cex.axis,
cex.lab, cex.main,
cex.sub
adj
"black"
"black"
"black"
"black"
1
font, font.axis,
font.lab, font.main
font.sub
fg, bg
lty
black,
white
solid
lwd
mai
1.02 0.82
0.82 0.42
5.1 4.1
4.1 2.1
1
mar
mex
-1
Explicaii
Dac este TRUE pe axa x se utilizeaz scara
logaritmica
Analog cu xlog dar pentru axa y
pch este un vector valori ntregi care specific tipul
de punct de pe grafic. Valorile ntregi sunt de regul
ntre 0 i 255. Dup epuizarea tipurilor din pch ele
se se repet.
col este un vector de ntregi care d indexul culorii
curente din paleta curent de culori. Culoarea se
poate exprima i prin cuvinte (exist 667 de culori
care au nume care se pot afla cu comanda colors()).
Culorile se repet ciclic atunci cnd se reprezint
diverse obiecte grafice.
Culoarea axelor
Culoarea pentru etichete pe axe
Culoarea pentru titlu
Culoarea pentru subtitlu
Un factor de amplificare pentru mrimea textului
fa de mrimea implicit. Doar cex.main are
valoarea implicit 1.2
Se controleaz cum apare textul justificat fa de
punctul de referin: 0 aliniat la stnga, 1 aliniat la
dreapta , 0.5 centrat orizontal
Un ntreg ce reprezint fontul pentru text, axe,
etichete, titlu, subtitlu.
Culorile pentru foreground respectiv background
Tipul de linie: 0=blank, 1=solid (default),
2=dashed, 3=dotted, 4=dotdash, 5=longdash,
6=twodash
Grosimea liniei. Depinde de tipul de dispozitiv
grafic pe care se tiprete
Un vector ce conine dimensiunile n inci ale
marginilor n ordinea: jos, stnga, sus, dreapta
La fel ca la mai dar dimensiunea este n linii
Factor de amplificare pentru mrimea fontului cu
56
mfcol
mfrow
mfg
1 1 1 1
fig
xaxs, yaxs
xaxp, yaxp
015
lab
5 5 7
las
xaxt, yaxt
usr
s
0101
tcl
-0.5
srt
Unii parametri sunt admii ca date opionale de unele rutine grafice. La apelul
rutinei respective, parametrul considerat se introduce sub forma rutina(...,
parametru=valoare,...). Dup execuia comenzii grafice valoarea parametrului revine
la cea dinainte de instruciunea grafic. Dac vrem ca modificarea s fie permanent
(pn la o nou modificare) atunci vom utiliza comada par(parametru=valoare,...).
Unii parametrii pot fi modificai doar prin instruciunea par. Acetia sunt: "ask",
"fig", "fin", "lheight", "mai", "mar", "mex", "mfcol", "mfrow", "mfg", "new",
"oma", "omd", "omi", "pin", "plt", "ps", "pty", "usr", "xlog", "ylog", "ylbias.
nainte de a da exemple de instruciuni grafice, cteva cuvinte despre culori.
Culorile implicite pe care le utilizeaz R la un moment dat pentru reprezentri grafice
sunt stocate ntr-o palet, un vector de tip caracter cu numele culorilor. Le putem
vedea cu comanda palette().
> palette()
[1] "black" "red"
[7] "yellow" "gray"
"green3"
57
"blue"
"cyan"
"magenta"
Pentru culorile care nu au nume se utilizeaz descrierea lor hexazecimal. Putem crea
palette
palete de culori prin palette(rainbow(n)), palette(heat.colors(n)),
(terrain.colors(n)), palette(topo.colors(n)),
palette(cm.colors(n)), unde n este
numrul culorilor pe care le vrem n palet. O alt modalitate de a obine palete este
prin interpolarea culorilor cu funcia colorRampPalette ca mai jos:
> culorile.mele=colorRampPalette(c("blue","yellow","red"))
> culorile.mele
function (n)
{
x <- ramp(seq.int(0, 1, length.out = n))
rgb(x[, 1], x[, 2], x[, 3], maxColorValue = 255)
}
<bytecode: 0x01aa3ae0>
<environment: 0x02c36ab8>
> paleta=palette(culorile.mele(20))
> paleta
[1] "blue"
"#1A1AE4" "#3535C9" "#5050AE" "#6B6B93"
[6] "#868678" "#A1A15D" "#BBBB43" "#D6D628" "#F1F10D"
[11]"#FFF100" "#FFD600" "#FFBB00" "#FFA100" "#FF8600"
[16]"#FF6B00" "#FF5000" "#FF3500" "#FF1A00" "red"
10
5
1:20
15
20
Puncte si culori
10
15
20
Index
Fig 4.1
58
Parametrul
Explicaii
add
Dac este TRUE atunci noul grafic se suprapune peste cel
existent. Funcioneaz uneori.
axes
Dac este FALSE nu se traseaz axele
log=x, log=y, Se specific ce axe sunt gradate logaritmic. Acest lucru se
log=xy
poate face i prin parametrii grafici, xlog, ylog.
type
Poate lua lua valorile "p" pentru a tipri puncte, l pentru a
tipri linii, b pentru a tipri puncte i linii ntre ele, "o"
pentru a tipri puncte i linii peste ele, "s" sau "S" pentru a
tipri grafice sub form pas (step) n sus sau jos, "n" pentru a
se seta sistemul de coordonate, fr a trasa graficul
xlab, ylab
Sunt iruri de caractere pentru etichetarea axelor
main, sub
Sunt iruri de caractere pentru titlu i subtitlu
xlim, ylim, zlim
Sunt vectori numerici cu cte dou valori pentru a seta limitele
pe cele trei axe
n cele ce urmeaz exemplificm utilizarea n parte a rutinelor grafice, cu comentarii.
Exemplul 4.1. Facem graficele a trei funcii, conform scriptului urmtor:
x=seq(-pi,pi,length=20)
y1=sin(x); y2=cos(x); y3=2*x/(1+x^2)
plot(x,y1,type="b", pch="+", xlab="", ylab="", lwd=3)
lines(x,y2, type="o", pch=10, col="red", lty="dotted",
lwd=3)
lines(x,y3,type="l", lty="dashed", col="blue", lwd=3)
title(main="Un exemplu de grafic", sub="Graficele a trei
functii",xlab="axa X",ylab="axa Y", cex.main=2,
cex.lab=1.5, cex.sub=2)
grid(5,5,col="cyan")
legend("topleft", legend=c("sin","cos","alta")
,col=c("black","red","blue"),
lty=c("solid","dotted","dashed")
,bg="yellow1")
ale colului stnga sus, coordonate ce pot fi alese interactiv prin locator().
Instruciunea legend din exemplul precedent ar fi putut fi
legend(locator(),legend=c("sin","cos","alta"),
col=c("black","red","blue"),
lty=c("solid","dotted","dashed"),
bg="yellow1")
1.0
Un exemplu de grafic
sin
cos
alta
+
+
+
+
+
0.5
+
+
+
0.0
axa Y
+
+
+
+
-0.5
+
+
+
+
-1.0
+
+
-3
-2
+
+
-1
axa X
Fig 4.2
Exemplul 4.2. Graficul unei suprafee vzut din diverse direcii. Graficele sunt
grupate ntr-o singur figur divizat n 2x2 zone prin comanda par(mfrow(2,2)).
f<-function(x,y){z=x-sin(2*x)^2+2*y^2}
x=seq(-1,1,length=20); y=x;
z=outer(x,y,f);
f<-function(x,y){z=x-sin(2*x)^2+2*y^2}
x=seq(-1,1,length=20); y=x;
z=outer(x,y,f);
par(mfrow=c(2,2))
persp(x,y,z,col="lightblue", shade=0.5, theta=45, phi=30,
r=50,
xlim=1.1*range(x),ylim=1.1*range(y),zlim=1.1*range(z),
main="Primul
grafic",
sub="Graficul
functiei
z=xsin(2*x)^2+2*y^2",
xlab="axa X",ylab="axa Y", zlab="Z",
ticktype="detailed", cex.main=2, cex.sub=2)
paleta=palette(rainbow(32))
clase=cut(z,32)
par(mfg=c(1,2))
persp(x,y,z,col=paleta[clase],
shade=0.5,
theta=30,
phi=15, r=50,
xlim=1.1*range(x),ylim=1.1*range(y),zlim=1.1*range(z),
60
functiei
z=x-
paleta1=palette(cm.colors(32))
clase=cut(z,32)
persp(x,y,z,col=paleta1[clase],
shade=0.5,
theta=20,
phi=45, r=50,
xlim=1.1*range(x),ylim=1.1*range(y),zlim=1.1*range(z),
main="Al treilea grafic", sub="Graficul functiei z=xsin(2*x)^2+2*y^2",
xlab="axa X",ylab="axa Y", zlab="Z",
ticktype="detailed",cex.main=2, cex.sub=2)
paleta2=palette(colorRampPalette(c("maroon", "gold"))(32))
clase=cut(z,32)
persp(x,y,z,col=paleta2[clase], shade=1, theta=30, phi=45,
r=50,
xlim=1.1*range(x),ylim=1.1*range(y),zlim=1.1*range(z),
main="Al patrulea grafic", sub="Graficul functiei z=xsin(2*x)^2+2*y^2",
xlab="axa X",ylab="axa Y", zlab="Z",
ticktype="detailed",cex.main=2, cex.sub=2)
par(mfrow=c(1,1))
Primul grafic
Al doilea grafic
2
2
1
0
Z
-1
-1
-2
-1.0
1.0
-0.5
ax a0.0
X 0.5
-0.5
0.5
0.0 Y
ax a
1.0
-2
-1.0
-0.5
1.0 -1.0
0.0
ax a X
0.5
1.0
-1.0
0.5
0.0
-0.5 ax a Y
Al treilea grafic
Al patrulea grafic
2
2
1
1
Z
-0.5
-0.5
-0.5
0.0
axa X
0.5
1.0
ax0.0
aX
-1.0
0.0
ax a
-1.0
1.0
0.5
-2
-1.0
0.0
-2
0
-1
0.5
-1
Fig 4.3
61
-0.5
0.5
ax
a
1.0
1.0 -1.0
Expresia n R
Utilizarea comenzii text(locator(), ex) pentru a pune expresia pe grafic se justific prin
aceea c locator() ateapt un clic stnga pe o poziie din grafic pentru a se stabili
unde va fi pus textul. Dup aceea se face un clic dreapta i din meniul derulant se
alege opiunea stop. Mai jos avem dou grafice cu adnotri.
f<-function(x) ((x^2-1)/(x^2+1)+sin(x))^2
g<-function(x) (ln(2+sin(x))+1)/(2+cos(2*x))
x=seq(-1,1,length=21); y1=f(x); y2=sin(x);
plot(x,y1,ylim=range(y1,y2),type="l", lty=3, col="blue",
lwd=4, xlab="x",
ylab="f(x),g(x)", cex.lab=1.5)
lines(x,y2,type="l", lty=4, col="red",lwd=4)
grid(4,4,col="black")
title(main="Adnotari matematice pe grafice",
sub="Graficul a doua functii", cex.sub=1.5)
62
ex1=expression(paste(f(x)%==% bgroup("(",frac(x^21,x^2+1)+sin(x),")")^2))
text(locator(),ex1,cex=1.5)
ex2=expression(paste(g(x)%==%
bgroup("(",frac(log(2+sin(x))+1,2+cos(2*x)),")")))
text(locator(),ex2, cex=1.5)
1.0
0.0
f(x),g(x)
0.5
x2 1
fx 2
sinx
x
-0.5
log2 sinx 1
gx
2 cos2x
-1.0
-0.5
0.0
0.5
1.0
x
Graficul a doua functii
Fig 4.4
Exemplul 4.4. Histograma valorilor generate aleator dup o distribuie normal
este comparat cu graficul distribuiei.
media=2; devs=4;
y=rnorm(nr, mean=2, sd=4)
hist(y, probability=TRUE, col="lightgray",
main="Histograma valorilor y=rnorm(200, mean=2, sd=4)",
xlab="Valorile lui y",
ylab="Densitatea valorilor lui y", cex.axis=1.5,
cex.lab=1.5 )
x1=seq(-6,10,length=100)
y1=dnorm(x1,mean=2, sd=4)
lines(x1,y1, lwd=3)
ex=expression(paste(rho, "(", x, ")=",frac(1,
4*sqrt(2*pi)), " ",
plain(e)^{frac(-(x-2)^2, 2%*%4^2)}))
text(locator(),ex, cex=1.5)
63
0.02
0.04
0.06
0.08
x2
1
(x)=
e 242
4 2
0.00
0.10
-5
10
Valorile lui y
Fig 4.5
Exemplul 4.5. Utilizm qqnorm pentru a detecta dac o selecie este normal
(graficul ar trebui s fie o dreapt) i qqplot pentru a detecta dac dou selecii
empirice au aceei distribuie (graficul ar terbui s fie prima bisectoare).
+
-3
-2
-1
+
+
+
4
3
2
1
0
-1
4
-1
+
+++++
+++++++
+++++
+++
+++++
+
+
++
++++
+++++
++++
+++
++
+
+
++++++
++++
++++
+++++
++++
+
+
+
+
++
+++++
++++
++++
+++++
+++
+
+
+
+
+++
++++
+++++
+++++
+
+++
++
-2
+
++
-2
Cuantilele teoretice
+
++
+
+++
+++
++
+
+
+
+++
+++
++++++
+++++++++
++++++
+
+
+
+
+
+
+
++++
+++++++++++++
++++++++
+++++++++++++
+++++++++++++
++++++++++
+
+
+
+
+
+
+
+++++++
++++++++
+++++
+++++
++++++
+
+
+
+
++
+
++
+
+
+
+
+
+
+
+
+
0.0
0.2
0.4
0.6
0.8
x1=runif(100)
Fig 4.6
64
1.0
Capitolul 5
Programarea n R
n principiu, un limbaj de programare ne pune la dispoziie un anumit numr
de tipuri de date i un anumit numr de operaii predefinite asupra lor, modaliti de
introducere a datelor ntr-un program precum i de extragere a rezultatelor
(instruciuni read/write), instruciuni de control al fluxului de operaii executate (n
principal instruciuni de decizie i repetiie), instruciuni de creare de subprograme
(funcii). n funcie de limbaj exist i alte aspecte importante care pot interesa:
posibilitatea de a utiliza rutine scrise n alte limbaje, posibilitatea de utilizare recursiv
a funciilor, programarea pe obiecte, etc. n cele ce urmeaz descriem succint
elementele de baz ale programrii n limbajul R.
Codul scris n limbajul R este cod interpretat, deci instruciunile sunt
compilate la un stadiu intermediar (bytecode) de unde sunt transformate n cod
depenedent de main n momentul execuiei. Acest proces de interpretare face ca
timpul de execuie s fie mai lung dect pentru programele compilate de la nceput n
cod-main executabil.
Scrierea unui program R se poate face n orice editor text. Se poate utiliza
editorul propriu (apelabil cu opiunea New script din meniul File) care are avantajul
c din el se poate rula o poriune din program selectat n prealabil prinr-un clic
dreapta i alegerea opiunii Run line or selection din meniul de context. Dac
programul a fost salvat pe disc n fiierul prog.r atunci rularea lui se face cu comanda
source(prog.r) dac este n directorul curent, altfel trebuie indicat i calea.
Toate instruciunile care se scriu la consol ntr-o sesiune de lucru pot fi
salvate la final n fiierul text .Rhistory (Save history din meniul File) de unde se
pot rula din nou cu comanda Load history (din meniul File). n acest fel se poate
repeta prelucrarea unor date ntr-o sesiune nou sau se poate scrie un program dup ce
se execut pas cu pas instruciunile lui ca i comenzi la consol.
65
Dup efectuare unui calcul dac vrem s pstrm rezultatele ele trebuie
atribuite unei variabile. Atribuirea se face prin (variabila care primete valoarea
atribuit este A):
A<-expresie
A<<-expresie
A=expresie
expresie->A
expresie->>A
Atribuirile <- sau -> sunt locale iar <<- i ->> sunt globale (vezi observaia f) de la
seciunea definirea funciilor proprii). Atribuirea prin = este echivalent cu
atribuirea -> (exist unele situaii cnd nu sunt echivalente dar nu le utilizm)
i.
ii.
iii.
Exemplul 5.1.
a=5; b=3
if((a==5)&(b!=a))
{s<-a+b^2
s<-s^2} else
{s=a-b^2; s<-s^2}
s
[1] 196
Dac este adevrat afirmaia condiie atunci rezultatul lui ifelse este da altfel
rezultatul este nu. n conditie putem avea un vector care se evalueaz pe fiecare
component la TRUE sau FALSE. Rezultatul funciei este un vector de aceeai
lungime ca vectorul condiie, cu valori din vectorii da sau nu. Dac vectorii da sau nu
nu au aceeai lungime ca i vectorul condiie atunci sunt trunchiai sau extini prin
repetare.
Exemplul 5.2.
> a=c(1,-2,3,0,-4,-5,0,2)
> da=c(1,2,3)
> nu=c(-1,-2,-3,-4,-5,-6,-7,-8,-9,-10)
> ifelse(a>0,da,nu)
[1] 1 -2 3 -4 -5 -6 -7 2
66
3. Instruciuni de repetiie
Instruciunile de repetiie (ciclare) sunt n R: for, while, repeat. Aceste
instruciuni au formele:
repeat instr
este o variant de repetiie n care instr este un bloc de instruciuni. Pentru a se asigura
c se termin la un moment aceste repetiii trebuie ntreinut n blocul instr o condiie
care se evalueaz la TRUE sau FALSE. Ieirea din bloc se face la execuia unei
instruciuni de forma: if(conditie) break, dac conditie=TRUE.
In blocurile de repetiie se poate folosi comanda break ce determin ieirea
imediat din ciclu sau comanda next care determin trecerea la urmtoarea repetiie
din ciclu. n cazul ciclurilor incluse unul n altul break i next se utilizeaza doar pentru
ciclul cel mai interior.
Exemplul 5.3. Se d o matrice a de dimensiune 3x4 i se cere s se calculeze
vectorul s de dimensiune egal 3 pentru care s[i] este suma elementelor din linia i.
Rezolvare prin repetiie cu for:
a=matrix(c(1:12),nrow=3)
s=rep(0,3)
for (i in 1:3){
for (j in 1:4) s[i]<-s[i]+a[i,j]
}
> s
[1] 22 26 30
67
a=matrix(c(1:12),nrow=3)
s=rep(0,3)
i=1
repeat{
j=1
repeat {s[i]=s[i]+a[i,j];j=j+1; if(j==5) break}
i=i+1
if(i==4) break
}
> s
[1] 22 26 30
n toate aceste programe ciclul interior se poate nlocui cu funcia sum. Prin aceasta se
execut mai repede programul pentru c repetiia din funcia sum este compilat direct
n cod main. Programul ar arta astfel (n varianta cu for).
a=matrix(c(1:12),nrow=3)
for (i in 1:3)s[i]=sum(a[i,])
> s
[1] 22 26 30
Multe repetiii pot fi realizate cu funciile de mapare apply, lapply, sapply, tapply,
mapply, descrise n capitolul 3. Programul precedent poate fi scris de exemplu cu
funcia apply astfel:
a=matrix(c(1:12),nrow=3)
s=apply(a,MARGIN=1,sum)
> s
[1] 22 26 30
68
69
e) n anumite cazuri avem nevoie de o funcie doar ntr-un loc. n acest caz
funcia se poate defini anonim (fr nume) i n consecin poate fi utilizat doar n
acel loc. De exemplu s calculm pentru trei matrice a, b, c de aceleai dimensiuni
expresia a^2+a*b*c (nu uitm c operaiile sunt vectorizate, se aplic elementelor n
poziii similare n matricele a, b, c). Scriptul urmtor realizeaz acest lucru n dou
feluri, n unul din feluri se utilizez o funcie anonim.
a=matrix(1:12, nrow=3)
b=matrix(seq(from=1,by=2, length=12), nrow=3)
70
c=matrix(rep(2,12), nrow=3)
rez1=a^2+a*b*c
rez2=matrix(mapply(function(x,y,z)x^2+x*y*z,a,b,c),nrow=3)
rez1
rez2
list(
deposit = function(amount) {
open.account <function(total=0,data,dob=0.10){
data=Sys.time()
71
if(amount <= 0)
stop("Deposits must be
positive!\n")
dataa=Sys.time()
durata=as.numeric(dataa) as.numeric(data)
durata=durata/86400
durata=durata/365
total <<- total*(1+dob)^durata +
amount
cat(amount, "deposited. Your
balance is", total, "\n\n")
data<<-dataa
},
72
2011-12-19 01:23:47
C type
int *
int *
double *
Rcomplex *
char **
unsigned char *
FORTRAN type
INTEGER
INTEGER
DOUBLE PRECISION
DOUBLE COMPLEX
CHARACTER*255
none
73
unde NAME este numele funciei, dac NAOK este TRUE atunci valorile NA, NaN,
Inf sunt transmise funciei C, altfel se genereaz o eroare dac apar, DUP=TRUE
determin o duplicare a datelor nainte de a fi transmise subrutinei, PACKAGE
specific n ce pachete s se caute subrutina NAME. Este obligatorie doar prezena
parametrului NAME n apelul .C(NAME,.)
g) Pentru comoditate se poate introduce comanda .C(NAME) ntr-o funcie
R care face apelul mult mai comod i se pot prelua din parametrii ntori doar pe cei
care intereseaz (vezi exemplul).
n cele ce urmeaz ne mrginim la utilizarea unor rutine C care au ca
parametri doar numere, reale sau ntregi. Pentru aplicaii matematice pare cea mai
frecvent situaie (ar mai fi eventual i utilizarea de numere complexe ca perechi de
numere reale).
Exemplul 5.6. Sa se scrie o funcie C numit rot care plecnd de la o matrice
ptratic a s produc un vector care conine elementele matricei n ordinea din
figura urmtoare, apoi s se apeleze aceast funcie din R.
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
74
#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
/*
To use this exported function of dll, include this
header
* in your project. */
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void DLL_EXPORT SomeFunction(const LPCSTR sometext);
void DLL_EXPORT rot(int *nlin, double *a,double *b);
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__
Fiierul main.cpp
#include "main.h"
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0,
sometext,
"DLL
Message",
MB_OK
MB_ICONINFORMATION);
}
75
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
Rezultatele le vedem mai jos. Parametrii ntori sunt preluai de R sub forma unei liste
n ordinea n care au fost declarai. Avem trei parametri n rutina rot deci i rezultatul
ntors rez va fi o list cu trei intrri. Ultima intrare (a treia rez[[3]]]) este vectorul b pe
care l cutm.
> a
[,1] [,2] [,3] [,4] [,5]
[1,]
1
6
11
16
21
[2,]
2
7
12
17
22
[3,]
3
8
13
18
23
[4,]
4
9
14
19
24
[5,]
5
10
15
20
25
> rez[[3]]
[1] 1 2 3 4 5 10 15 20 25 24 23 22 21 16 11
9 14 19 18 17 12 13
76
Pentru apelul funciei rot care se gsete n lbrria pr1.dll putem scrie o funcie R care
s fac acest apel mai uor. In fiierul urmtor se face acest lucru. Din cei trei
parametri l lum ca parametru de ieire din funcia rot doar pe al treilea, b.
dyn.load("pr1.dll")
x=1:25
a=matrix(x,ncol=5)
rot<-function(a){
if(!is.matrix(a))stop("intrarea in rot trebuie sa
fie matrice")
if(!is.numeric(a)) stop("matricea trebuie sa fie
numerica")
if(!(ncol(a)==nrow(a))) stop("matricea trebuie sa
fie patratica")
b=rep(0,length(a));
rez<C("rot",as.integer(ncol(a)),as.double(a),as.double(b)
)
return(rez[[3]])
}
aa<-rot(a)
dyn.unload("pr1.dll")
Apelul rutinelor scrise n Fortran este asemanator. Ele sunt puse n librii dinamice de
unde se ncarc cu comanda dyn.load(nume_librarie). Apelul unei funcii din librrie
se face prin instruciunea:
.Fortran(NAME, ..., NAOK = FALSE, DUP = TRUE, PACKAGE,
ENCODING)
77
Capitolul 6
Aplicaii diverse programate n R
Poate cel mai uor mod de a nva un limbaj este de a urmri cteva programe
simple scrise n el.
(6.1.1)
Putem scrie relaia (6.1.1) i sub forma Sk +rk = qkSk-1 . S notm k = 1/qk .
Atunci relaia (6.1.1) devine
Sk-1 = kSk + krk
(6.1.2)
Se propun mai multe scenarii.
S0
1 1 2 ... 1 2 ... n
(6.1.3)
78
Exemplu de aplicare
Se face un credit de 1200 de lei, pltibil n 12 rate lunare egale, n regim de dobnd
simpl cu termen de graie de 1 an i dobnd 12%. Care este rata i cum evolueaz
amortismentele?
Soluie. Avem s0 = 1200, i = 0.12 i t = (k/12)13k 24. Deci succesiunea de
instruciuni este
>t=13:24/12
> a=ratadosi(1200,.12,t)
> rata=a[[1]];rata
[1] 119.2861
> amortismente=a[[2]];amortismente
[1] -36.7139 106.9190 107.9881 109.0680 110.1587 111.2603
112.3729 113.4966
[9] 114.6316 115.7779 116.9357 118.1050
79
## qk 1 i tk tk 1 ,
alfa=1/q;for (k in 1:n) {bet[k]=prod(alfa[1:k])}
r=s0/sum(bet)
s[1]=s0*q[1]-r;for (k in 2:n){s[k]=s[k-1]*q[k]-r}
amo[1]=s0-s[1];for (k in 2:n){amo[k]=s[k-1]-s[k]}
rata=list(r,amo)
rata}
Exemplu de aplicare
Se face un credit de 1200 de lei, pltibil n 12 rate lunare egale,n regim de dobnd
compus cu termen de graie de 1 an i dobnd 12%. Care este rata i cum evolueaz
amortismentele?
Soluie.
> a=ratadoco(1200,.12,t);a
[[1]]
[1] 119.0274
[[2]]
[1] -37.72552 107.28290 108.30088 109.32853 110.36592
111.41316 112.47034
[8] 113.53755 114.61488 115.70244 116.80031 117.90861
Rata este putin mai mic, deoarece dac s-ar calcula corect rata lunar a
1
12
Exemplu de aplicare
Se face un credit de 1200 de lei, pltibil n 12 rate lunare, n regim de dobnd
simpl cu termen de graie de 1 an i dobnd 12%. Care sunt ratele dac se
planific 12 amortismente egale a cte 1200 lei?
8
Ca o curiozitate, rata zilnic a dobnzii se calculeaz de unele bnci dup formula i/360. Ca i cum
anul ar avea 360 de zile.
80
Soluie.
t=13:24/12
> a=amordosi(1200,.12,t);a
[1] 256 111 110 109 108 107 106 105 104 103 102 101
Exemplu de aplicare
Se face un credit de 1200 de lei, pltibil n 12 rate lunare, n regim de dobnd
compus cu termen de graie de 1 an i dobnd 12%. Care sunt ratele dac se
planific 12 amortismente egale a cte 1200 lei?
Soluie.
> a=amordoco(1200,.12,t);a
[1] 256.7529 110.4377 109.4888 108.5399 107.5910 106.6422
105.6933 104.7444
[9] 103.7955 102.8466 101.8978 100.9489
81
rez=data.frame(scenarii,sume)
rez}
Exemplu de aplicare
n cazul nostru suma cea mai mic este, dup cum rezult din tabelul de mai jos,
de 1419.38 lei, n regim de dobnd compus, dac s-ar accepta calculul normal al
dobnzii.
t=13:24/12; comprate(1200,0.12,t)
scenarii
sume
1 rate egale dob simpla 1431.433
2 rate egale dob compusa 1428.329
3 amo egale dob simpla
1422.000
4 amo egale dob compusa 1419.379
S 0 q1
1 2 ...
r S 0 q1 1
(6.1.4)
82
rez=c(k-2,s[k-2])
rez=list(rez,s[1:k-1])
rez}
Exemplu de aplicare
n cazul nostru avem r = 100, S0 = 1200, t0 = 1, h = 1/12, i = 0.12
a=nrrate(100,1200,1,1/12,0.12);a
[[1]]
[1] 14.00000 29.85075
[[2]]
[1] 1244.00000 1155.80406 1066.77124
794.57178
[7] 702.11130 608.77349 514.55002
226.48118
[13] 128.63021
29.85075 -69.86600
976.89362
886.16316
419.43248
323.41238
i obinem reacia
[1] "rata prea mica, n=infinit"
[1] 12.63307
Ultimul numr ne spune c rata minim este de 12.64 lei. Dac am ncerca cu
rate de 13 lei am obine
a=nrrate(13,1200,1,1/12,0.12);a[[1]]
[1] 377.000000 9.707553
E nevoie de 33 de ani!
83
Exemplu de aplicare
Ca s fim consecveni, lum r = 100, S0 = 1200, i0 = 0.05, i1 = 0.15.
a=nralrate(100,1200,.05,.15);a
[[1]]
[1] 19.000000 7.846417
[[2]]
[1] 1164.531376 1139.006774 1072.575349 1001.426395
963.953179
[7] 917.006879 848.128914 749.050657 714.409097
585.682507
[13] 504.665078 424.788245 355.531910 284.929749
106.591050
[19]
7.846417 -91.942226
993.777986
673.291059
199.222488
nralratesim<-function(n,r,s0,i0,i1)
{nr=c(rep(0,n))
for (k in 1:n) {nr[k]=nralrate(r,s0,i0,i1)[[1]][1]}
nr}
Exemplu:
nr=nralratesim(10,100,1200,0.05,.15);nr
[1] 16 18 24 20 16 15 20 19 18 16
84
> p
[1]
4
89 479 1165 1809 2106 1721 1128 731
97
48
18
10
[16]
6
1
1
> pp=p;for (k in 1:m) {pp[k]=sum(p[1:k])/sum(p)}
> b=rbind(x,pp);b
387
200
...
... y
m
2
n
, G 1
FG
F 1 2
p
p
...
p
q
q
...
q
1
2
m
1
2
n
85
x1 y1
p1q1
x1 y2
p1q2
... xm yn
... pm qn
intre
(x,p)
si
Cea mai frecvent valoare a fost 0: apare n 7 locuri. Deci probabilitatea sa este 7/16
=0.4375.
Apelarea funciei se face prin comanda
a =convm<-function(x,p,y,q)
i rezultatul este o list, a. Primul element este format din vectorul cu elementele xiyj,
sortat n ordine cresctoare iar al doilea cu probabilitile pq
Exemplu
> a=convm(x,p,y,q);a
86
[[1]]
[1] -4 -2 -1
[[2]]
[1] 0.0625 0.1250 0.1250 0.4375 0.1250 0.1250
5 10 15 20
. Ratele se vd n
S presupunem acum c rata dobnzii este i
.2 .3 .3 .2
primul rnd, exprimate n procente iar probabilitile lor n al doilea rnd. Atunci qn
1
1
1
1
.2
.3
.3
.2
x=c(1/1.05,1/1.1,1/1.15,1/1.2);y=x+1;p=c(2,3,3,2)/10;q=p
convm(x,p,x+1,p)
$x1
[1] 1.527778 1.557971 1.590909 1.594203 1.625709 1.626984
1.660079 1.666667 1.697723 1.699605 1.735537
[12] 1.746032 1.774892 1.780538 1.818182 1.859410
$p1
[1] 0.04 0.06 0.06 0.06 0.09 0.04 0.09 0.06 0.06 0.09 0.09
0.04 0.06 0.06 0.06 0.04
De exemplu, dac dorim s tim care este probabilitatea ca o sum S0 = 1200 lei s
poat fi achitat n dou rate r = 700 lei, calculm
a=convm(x,p,y,q);prob=tailfrep(1200/700,a[[1]],a[[2]]);prob
Era i de ateptat.
Cum calculm celelalte probabiliti?
De exemplu X3 = 1 + 12 + 123 = 1(1 + 2(1 + 3))) Observm c, deoarece
variabilele i au fost presupuse independente i identic repartizate, 2(1 + 3) are
87
Xn n(1 + Xn-1)
Sau, n termeni de repartiii,
Fn = Fh(Fn-1)
unde h(Fn-1) este repartiia variabilei aleatoare Xn-1 + 1.
Scriptul convmrep calculeaz repartiia lui Xn
(6.1.6)
(6.1.7)
[1] 0.9836
Deja putem paria c este suficient.
Problema este c nu putem aplica acest algoritm de prea multe ori. Deja la 4
convoluii, irul de valori pe care l poate lua X4 este de 256; n principiu este de 4n
valori. De exemplu, la n = 10
a=convrep(10,x,p);x1=a[[1]];p1=a[[2]]
88
0.0
0.2
0.4
frp
0.6
0.8
1.0
4.5
5.0
5.5
6.0
6.5
7.0
7.5
Fig 6.1
1.5
1.0
0.5
0.0
de
2.0
2.5
3.0
Pe axa Ox sunt valorile lui x, ntre minim i maxim. n graficul urmtor prezentm
diferenele [F(t+h) F(t)]/h pentru h = (max x1 min x1)/998 care, n ipoteza c
repartiia lui Fn ar avea o limit absolut continu, ar mima densitatea sa. Dar nu tim
dac exist o asemenea limit: este o problem nerezolvat de matematicieni
4.5
5.0
5.5
6.0
t
Fig 6.2
89
6.5
7.0
7.5
Pentru valori mai mari ale lui n nu este realist s aplicm acest algoritm: dac la n
= 10 Xn are 1048576 de componente, la n = 20 o s aib 1012 . Am putea mri
numrul de iteraii dac am modifica problema: dac rata dobnzii nu are dect dou
0.10 0.15
. Ratele se vd n primul rnd, exprimate n procente iar
.5
valori i
.5
1.10 1.15
iar coeficienii de
.5
.5
.5
0.0
0.2
0.4
frp
0.6
0.8
1.0
actualizare n 1.10 1.15 . Atunci am putea calcula repartiia chiar i pentru X20
Fig 6.3
1.5
0.0
0.5
1.0
de
2.0
2.5
3.0
i densitatea
Fig 6.4
90
a 1 an
1 a
(6.1.9)
i 1
i, j
ci,j = bmin(i,j)ai j
n concluzie, dup efectuarea calculelor ajungem la
2a b 1 b n 1 ab a n 1 b n 1
v=
1 a 1 b
a b
(6.1.10)
b1 b a1 a
n
1 b
(6.1.11)
1 a
1
U
1 ln ln
i
1
ln ln
1
avem, n cazul nostru, a =
,b=
alfa=1.05;beta=1.15;a=(log(beta)-log(alfa))/(beta-alfa);b=1/alfa/beta
De exemplu, dac n = 60, atunci X60 are media 10.04189 i variana 0.402313
ans=medvar(60,a,b);ans
$rate
[1] 60
91
$media
[1] 10.04189
$varianta
[1] 0.402312
Atunci abaterea medie ptratic este 0. 6342815 . Deci P( 10.02 k0.63 <
X20 < 10.02 + k0.63) > 1 1/k2. O aproximaie bun este c P( 10.02 k0.63 < X20)
>1-
1
2k 2
condiia ca 1200/r < 7.5 r > 160. O rat de 160 lei ar fi suficient, cu probabilitate
mai mare dect 97% ca s achite creditul de 1200 lei n 20 de rate.
x2
...
p2 ...
xm
, FY =
pm
y1
p1
y2
...
p2 ...
ym
i rezult
pm
c
x y
FXFY = 1 1
p1q1
x1 y2 ... xm y m
. Fiind discrete, cele dou repartiii pot fi
p1q2 ...
pm qn
codificate prin (x,p) i (y,q). n cazul acesta putem scrie (x,p) (y,q) = (x1,p1)
Scriptul conva(x,p,y,q) calculeaz exact acest lucru: produce vectorii x1
i p1. Este o operaie mai obinuit dect convoluia multiplicativ prezentat n
capitolul anterior. Diferena este c vaorile xi i yj se adun, nu se nmulesc.
##convolutia aditiva obisnuita cu functia tapply
conva<-function(x,p,y,q)
{xay=outer(x,y,"+");pmq=outer(p,q,"*")
a=tapply(pmq,xay,sum)
x1=as.numeric(names(a))
p1=x1;m=length(x1)
for (i in 1:m) {p1[i]=a[[i]]}
a=list(x1=x1,p1=p1)
a}
3 10
.
S presupunem, ca s revenim la scenariul nostru, c Xn
.3 .4 .2 .1
Probabilitatea s avem o zi fr cheltuieli este 30%, s cheltuim 1 UM este 40%, s
cheltuim 3 UM este 20% i, n zile rele, putem cheltui chiar 10 UM, cu probabilitatea
92
1 2 3 4
. Am ales
.4 .3 .2 .1
Probabilitatea s nu avem pierderi este este P(n 0), pentru care avem scriptul
frep<-function(t,x,p)
{frep=sum(p[x<=t])frep}
19
20
21
22
23
24
$yn
93
(6.2.2)
iar cel care calculeaz convoluia pozitiv iterat, adic exact repartiia Fn din
(2.2) este convaprep
##convolutia pozitiva iterata pentru Fn+1=(F*Fn)+
# (x,p) este pierderea, (y,p) e cistigul
# se convoluteaza la inceput (x,p) cu (-y,q) si rezulta F
convaprep<-function(n,x,p,y,q)
{y=-y;z=conva(x,p,y,q)
x=z[[1]];p=z[[2]] #aici s-a facut F
y=0;q=1
for (i in 1:n) {z1=convap(x,p,y,q);y=z1[,1];q=z1[,2]}
z1}
94
Rezultatul este prezentat sub forma unei matrici N 2, unde N este numrul de valori
pe care le poate lua Sn. n cazul nostru, N = 91.
S presupunem c managerul companiei are la dispoziie un capital u = 20 UM
pentru a plti cheltuielile. Care este probabilitatea ca acest capital s nu fie suficient?
Este 10(20) = P(L10 > 20) . Pentru ea avem la dispoziie funcia tailfrep
prob=tailfrep(20,x1,p1);prob = 0.04675292
3 10
> x=c(0,1,3,10);p=c(6,2,1,1)/10;a=convaprep(100,x,p,y,q)
> x1=a[,1];p1=a[,2]
> summary(x1)
Min. 1st Qu. Median
Mean 3rd Qu.
0
225
450
450
675
> tailfrep(20,x1,p1); prob = 0.135263
Max.
900
95
Vezi, de exemplu Gheorghia Zbganu, Metode matematice n teoria riscului i actuariat, Editura
Universitii Bucureti, 2004
96
Xn
0
f 0
1 ... k
0
p0 p1 .... pk
1
f 1
f 2
2 ...
0 1
,
q0 q1 q2 ...
atunci
SN
...
i probabilitile f(n) se pot calcula.
...
ntr-adevr,
j
f(j) = P(SN = j) = PS n j q j
n 1
(6.3.6)
97
era vorba la nceput s aib pregtii 521 de lei pentru a avea doar riscul 1% ca suma
s fie insuficient.
Calculul exact reclam calculul cuantilei de 0.99 (sau, cum i se mai spune, valoarea la
risc, adic primul k cu proprietatea c F(k) 0.99
Instruciunea care face acest lucru este which(F<.99)i obinem 207 lei. ntradevr, F(207) = 0.990797, F(206) = 0.989250910. De altfel, marginea dat de
inegalitatea Cebev este absurd, cci SN nu ia dect 451 de valori.
Exist cazuri n care calculul repartiiei lui SN se poate face cu mult mai rapid,
i cu resurse mult mai puine, prin algoritmul lui Panjer.
0
...
11
n 1
,b=
1
1
N Bin(n,) a =
N Poisson() a = 0, b =
N Negbin(n, ) a = 1 - , b = (1 - )(n-1)
0
p1 ...
...
k
atunci numerele fn = P(SN = n)
pk
satisfac recurena
f0 = g(p0), n 1 fn =
n
bj
1
a p j f n j
n
1 ap0 j 1
(6.3.7)
p0 p1 ... pk
1 p0
1 p0 1 p0
12
10
Atragem atenia c F[k] nu calculeaz F(k), ci F(k-1), deoarece n R indicii vectorilor ncep cu 1,
nu cu 0 ca n alte medii de programare (de exemplu Basic).
11
Vezi de exemplu G. Zbganu, Metode Matematice n teoria riscului...., pg. 170
12
ntr-adevr, dac Y = (X X > 0), EetY = E(etX X > 0) = E(etX ; X > 0)/(1- p0) = (mX(t) p0) /(1- p0).
Fie S = X1 + ...+ Xn i T = Y1 + ...+ YN . Atunci, cum N este independent de X, EeT = gN(mY) = (p0 + (1
D
1 p0
98
1 p0 n 1 iar
1 p0
,b=
p0
p0
k
1 k
( n 1) j
1
bj
a p Y j f k j =
1
p j fk j ,
1 ap Y 0 j 1
k
p0 j 1
k
deci
f0 = p0n, k 1 fk =
1 k
(n 1) j k p j f k j
kp0 j 1
(6.3.8)
n
1
bj
a p[ j 1] f [ n j 1]
1 ap[1] j 1
n
99
100
(3.10)
a[[2]] = (S)
a[[3]]=n, unde n este primul n cu proprietatea c P(S n) > 1 -
a[[4]] = f, cu f[n] = P(S = n-1)
a[[5]] = F cu F[n] = P(S n 1)
Deci n 99% din cazuri, suma cerut este mai mic dect 627 lei. Cu
inegalitatea Cebev mbuntit gsisem 871 lei.
Dac dorim s vizualizm densitatea f i funcia de repartiie F putem proceda astfel:
x=1:nn;plot(x,f/max(f),type="l",col="blue",sub="Albastru:
densitatea lui S, rosu: functia de repartitie");
lines(F,col="red").
0.6
0.4
0.2
0.0
f/max(f)
0.8
1.0
Obinem graficul
100
200
300
400
500
x
Albastru: densitatea lui S, rosu: functia de repartitie
Fig 6.5
101
600
Se vede clar cum cele mai probabile valori sunt n jurul lui x=500. Dac am fi vrut s
ne asumm riscul de 0.1% n loc de 1%, atunci valoarea la risc ar fi fost 671. La riscul
de 0.01% valoarea ar fi fost VaR = 708 iar la = 10-6 ar fi fost 771 lei. Valoarea de
871 lei, gsit la riscul 1% cu inegalitatea lui Cebev ar fi suficient la un risc de =
10-10!!
> a=Panjer(x,p,"p",100,1/11,.0000000001);VaR_S=a[[3]];VaR_S
[1] 872
0.6
0.4
0.0
0.2
f/max(f)
0.8
1.0
Dei media este aceai, acum abaterea medie ptratic este de trei ori mai mare ca
nainte: 166.58. Valoarea la risc e normal s fie mai mare: acum este 964 lei. Graficul
arat diferena
200
400
600
800
1000
x
Contor negativ binomial.Albastru: densitatea lui S, rosu: functia de repartitie
Fig 6.6
102
x2
...
p2 ...
xk
cu
pk
pN=1-p[1];N=n
q=p/pN;q=q[2:nx]
y=x1[2:nx]; ## se rein doar acei y>0
xa=Panjer(y,q,"b",N,pN,epsilon)
f=xa[[4]];F=xa[[5]];nn=length(f);x=0:(nn-1);x=x+N*xmic
b=list(x=x,f=f,F=F)
b
}
103
0.008
0.006
0.004
0.000
0.002
f1
500
1000
1500
t1
Fig 6.7
Cu negru sunt figurate densitile fi calculate dup algoritmul rapid. Deja unele
devin negative.
Exist alte tehnici sofisticate de a rezolva problema convoluiei dar nu fac
obiectul lucrrii de fa.
104
1994
barbati
total
decese
femei
total
decese
2008
barbati
total
decese
femei
total
decese
0
127308 3303
120921 2591
110665 1416
105025 1018
1
125979 282
119583 249
109056 93
103456 77
2
131763 197
125846 132
112199 65
105912 49
3
127804 158
122161 110
110315 52
104550 37
4
175284 192
167954 124
107839 34
101622 24
5
176293 255
170667 159
106203 40
100940 37
6
182212 179
173773 140
107077 42
100304 30
7
188160 118
181410 80
109577 46
104001 28
8
169580 95
163040 54
114464 35
108485 20
9
175287 103
167986 43
113859 30
108823 17
10
157988 91
151287 44
114695 31
108680 13
.....................................................................
...
80
29268
3576
48002
4847
40991
4087
65403
4968
81
28345
3743
46395
4975
35451
3848
58600
4947
82
24626
3490
40820
4789
31021
3585
52227
4992
83
20438
3179
33543
4396
26196
3498
45978
4981
84
17178
2930
28381
4250
21888
3082
39356
4833
85>
57985
13476
98009
21478
66841
13225
133181 25154
dar acest lucru este imposibil, deoarece nu tim numrul supravieuitorilor: ar trebui
s tim vrsta decesului fiecrui individ....
Dac acceptm identificarea probabilitii cu frecvena, interpretm raportul p0
= d0/n0 cu probabilitatea P(T 1): probabilitatea ca un nou nscut s moar nainte de
a mplini un an. Atunci numrul q0 = 1 p0 este P(T > 1) , adic probabilitatea ca el s
supravieuiasc un an. Apoi, p1 = d1 / n1 este probabilitatea ca un supravieuitor de 1
an s moar n intervalul de timp (1,2] , adic nseamn P(T 2 T > 1). Deci q1 = 1
p1 nseamn probabilitatea ca un individ s supravieuiasc 2 ani tiind c el deja a
supravieuit 1 an, adic q1 = P(T > 2 T > 1) , adic avem q1 = P(T > 2)/P(T > 1)
P(T > 2) = q0q1. Din aproape n aproape gsim formula
P(T > x+1) = q1....qx
(6.4.1)
valabil pentru x numr natural. nmulim acest numr cu 100000 i obinem lx =
105qx, rotunjit la cel mai apropiat ntreg. Rezultatul este valabil, n cazul exemplului
nostru numai pn la x = 84, deoarece nu avem date mai multe.
105
Din lista tabgen extragem cei 8 vectori (numar,death) cu care crem apoi 4
tabele de mortalitate, notate cu a,b,c,d pe care le plotm. Primul se refer la brbai
1994 (linia neagr) al doilea la brbai 2008 (cea roie), al treilea la femei 1994
(albastr) i ultimul la femei 2008 (verde)
> virsta=tabgen[[1]];nrbb94=tabgen[[2]]
nrbm94=tabgen[[3]];nrfm94=tabgen[[4]];nrmm94=tabgen[[5]]
> nrbb08=tabgen[[6]];nrbm08=tabgen[[7]]
nrfm08=tabgen[[8]];nrmm08=tabgen[[9]]
a=tabmort(nrbb94,nrbm94);plot(a,type="l",sub="tabel
mortalitate pe sexe 1994-2008" )
b=tabmort(nrbb08,nrbm08);lines(b,col="red")
c=tabmort(nrfm94,nrmm94);lines(c,col="blue")
d=tabmort(nrfm08,nrmm08);lines(d,col="green")
106
1e+05
8e+04
6e+04
2e+04
4e+04
20
40
60
80
Index
tabel mortalitate pe sexe 1994-2008
Fig 6.8
FT(x) = e 0 r y dy r x
x
FT ' x
FT x
(6.4.2)
rx = ln
lx
l
e rx x
l x 1
l x 1
(6.4.3)
0.10
0.05
0.00
ra1
0.15
n figura de mai jos prezentm riscurile de moarte la cele patru populaii: brbai
1994/2008 (curba neagr i cea roie) i femei 1994/2008 (curba albastr i verde)
20
40
60
Index
riscuri de moarte pe sexe, 1994 si 2008
107
80
Fig. 6.9
Figura sugereaz c ar fi acceptabil un model n care s se presupun c de la
85 de ani ncolo, riscul de moarte r crete liniar. Pe aceast ipotez este construit
scriptul tp0(t, tab) care calculeaz funcia de supravieuire tp0 pentru orice t
plecnd de la un table de mortalitate, tab. Din tabelul de mortalitate l reinem doar
deducem c
acele poziii x n care lx >10. Atunci , din formula (4.3)
t t 1
{t }
q
l[t ]1
dac t i tp0 = lqt- p
l[t ]
l
l
Am notat p 1 i q .
l 2
l1
tp0 = l[t]
dac t >
(6.4.4)
Cu ajutorul funciei care calculeaz tp0 pentru orice numr pozitiv, nu neaprat
ntreg, este uor de calculat funcia de supravieuire la vrsta x, care se noteaz cu tpx
i se definete ca
tpx
= PT x t | T x
PT x t
P X x
xt p0
x p0
(6.4.5)
Scriptul este
## functia tpx (t,x,tabel de mortalitate) calculeaza probabilitatea
de ## supravietuire a unui individ de x ani in aceeasi ipoteza ca si
tp0
tpx<-function(x,t,tab)
{tpx=tp0(t+x,tab)/tp0(x,tab);tpx}
108
40
0
20
vid
60
n figura de mai jos este prezentat graficul funciei ex, respectnd culorile din
celelalte dou figure de mai sus: negru nseamn brbai 1994, rou nseamn
brbai 2008, albastru este femei 1994 iar verde este femei 2008
20
40
60
80
100
Index
speranta medie de viata la x ani
Fig 6.10
S
ln 0
S0
S0
rezult c
ln(1+i) > ln
>
ln1 i
(6.4.6)
109
Sau,mai profesionist
s0=10000;i=.05;PI=s0/(1+i)^y;PI
[1] 8927.597
Se poate vedea cum conteaz diferena de vrst i sex. Dac modificm vrsta
la 50 de ani, avem
PI=s0/1.1^cuant(50,tabmort(nrfm08,nrmm08),.01);PI = 7936.383
(la femei)
PI=s0/1.1^cuant(50,tabmort(nrbb08,nrbm08),.01);PI = 9112.59
(la brbai)
Dac vrsta este de 5 ani, iar S0 = 40.000 (asigurare de tip endowing adic
nzestrare) avem
110
PI=s0/1.1^cuant(5,tabmort(nrfm08,nrmm08),.01);PI = 2600.906
(la femei)
PI=s0/1.1^cuant(5,tabmort(nrbb08,nrbm08),.01);PI = 7456.137
(la brbai)
Dac doritorul de asigurare vrea s micoreze costul asigurrii i s pstreze
acelai risc ca suma s fie suficient, atunci ar trebui s se asocieze cu ali asigurai de
acelai tip, sau s apeleze la un asigurator.
Ideea (pe care o vom explica pe primul exemplu, al brbatului de 60 de ani)
este urmtoare : dac actualizm suma pe care o depune el ca la momentul min(n,TX)
s se obin suma S0 = 10.000 RON este o variabil aleatoare, anume X =
S0/ 1 i min(Tx ,n ) . Ar vrea s depun o sum, ct mai mic cu putin ca
P( 1 i min(Tx ,n ) < S0) , adic P (X > ) . Dac este singur, atunci va trebui s
aleag pe ca fiind cuantila de nivel 1 - a variabilei aleatoare X.
Dar dac se asociaz cu alii, n aceeai situaie i depun cu toii aceeai sum,
? S presupunem c s-a format o asociaie din N asemenea indivizi, dornici s
coopereze. S acceptm c timpii lor reziduali, notai cu Tj au toi aceeai repartiie ca
Tx. S mai presupunem c Tj sunt independeni i c toi indivizii notri fac un depozit
comun n care depun aceeai sum, . Fiecare i retrage bani de acolo atunci cnd
este nevoie. Acesta este numit n asigurri principiul solidaritii.
Fie Xj = S0/ 1 i min(T j ,n) . Variabilele aleatoare Xj vor fi de asemenea
independente. Probabilitatea ca depozitul s fie insuficient este P(X1 + + XN > N) .
Dac dorim ca aceast probabilitate s fie mai mic sau egal cu , va trebui s
alegem n aa fel nct n s fie cuantila la nivel 1 a repartiiei sumei SN = X1 +
+ XN , adic a convoluiei F N, unde F este repartiia lui Xj.
Este complicat de lucrat cu convoluiile, dac repartiia este continu. Dar se
poate aplica inegalitatea lui Cebev. S spunem c EXj = , (Xj) = . Aproximm
E(X-)+2 cu 2/2. Atunci putem aplica inegalitatea lui Cebev de la (3.5) sub forma
P( SN > ESN + k(SN)/
N
)<
2
N
N
)< .04 . Lum n aa fel nct N = + 5
, adic = +
2
2
5
2N
. Pentru
(6.4.8)
pentru funcia g(x) = e-min(x,n). Cum g(0) = 1 i g(x) = - e- x1(0,n)(x), formula de mai
sus devine
n
tpx
111
(6.4.9)
min(T j ,n )
112
Marginea = +
2N
6350
Numele ei n R
Parametri
beta
binomial
Cauchy
2
exponential
F
gamma
geometric
hipergeometric
log-normal
logistic
beta
binom
cauchy
chisQ
exp
f
gamma
geom
hyper
lnorm
logis
,
k,p
m,a
n
m,n
,
p
a, n, k14
,
, 15
14
Extragem k bile dintr-o urn cu a bile albe i n bile negre; X este numrul de bile albe.
15
1
1 e
113
negativ binomial
normal
Poisson
Student
uniform
Weibull
Wilcoxon
nbinom
norm
pois
t
unif
weibull
wilcox
k,p
,16
n
a,b
k,
m, n
x2
....
p2
...
xk
, cu k = length(x).
pk
a b c d
.
Exemplu. S se simuleze un ir de 100 variabile aleatoare Xj
.1 .2 .3 .4
Soluie.
x= c("a", "b", "c", "d"); nr=100;xsim=sample(x,nr,rep=TRUE,prob=1:4)
> xsim
16
114
[1]
"d"
[19]
"a"
[37]
"c"
[55]
"a"
[73]
"d"
[91]
"a" "b" "c" "d" "d" "a" "d" "d" "b" "a" "c" "a" "d" "b" "c" "d" "c"
"c" "d" "c" "d" "c" "c" "c" "b" "b" "d" "c" "d" "b" "c" "d" "c" "b"
"c" "d" "c" "a" "b" "b" "c" "a" "c" "b" "b" "a" "a" "b" "a" "c" "c"
"d" "d" "b" "d" "b" "c" "d" "d" "c" "d" "a" "d" "a" "d" "a" "c" "d"
"c" "b" "d" "d" "c" "c" "c" "c" "d" "c" "d" "a" "d" "a" "d" "b" "c"
"c" "d" "c" "a" "c" "d" "c" "b" "d" "b"
Dac simulam mai multe, se vedea mai clar cum probabilitile sunt proportionale cu
1,2,3,4. de exemplu, dac scriem
nr=10000;xsim=sample(x,nr,rep=TRUE,prob=1:4);table(xsim)
xsim
a
b
c
d
1011 1983 3000 4006
face cam acelai lucru, n cazul particular n care x = 1:k. De exemplu, dac n loc de
a, b, c, d am fi pus 1,2,3,4 , am fi putut folosi, cu acelai rezultat
instruciunea
xsim=sample.int(4,nr,rep=TRUE,prob=1:4);table(xsim)
xsim
1
2
3
4
1020 1997 2870 4113
Dar instruciunea sample face mai mult de att: dac rep = FALSE, atunci
genereaz un aranjament aleator al componentelor lui x. Dac prob=NULL, adic nu
punem nici o probabilitate, toate aranjamentele au aceeai ans de apariie. Este ca i
cum am avea o urn cu bilele x = (x1,,xk) din care scoatem, succesiv i fr
nlocuire, un numr de size bile. Dac parametrul size lipsete, se genereaz o
permutare aleatoare a lui x.
Exemple:
> x= c("a", "b", "c", "d");
nr=3;xsim=sample(x,nr,rep=FALSE); xsim
[1] "b" "c" "a"
xsim=sample(x,rep=FALSE); xsim
[1] "c" "b" "d" "a"
> xsim=sample.int(4,rep=FALSE); xsim
[1] 1 3 4 2
115
xsim=sample.int(4,2,rep=FALSE); xsim
[1] 3 1
x2 ....
p2 ...
precis, dac X
xk
i size = d k, se genereaz un vector aleator V =
pk
(V1,,Vd) cu repartiia
Exemplu. X
p 2
p 3
1 p 1 1 p 1 p 2
2
p2
3
p3
......
p d
1 p 1 ... p d 1
p4
pi p j
1 pi
1 pi 1 pi
1
pi2
etc.
1 2 3 4
. Dac d= 2 avem 12 de aranjamente, cu
Un caz particular: X
.1 .2 .3 .4
urmtoarele probabiliti
12
2/90
13
3/90
14
4/90
21
2/80
23
6/80
24
8/80
31
3/70
32
6/70
34
12/70
41
4/60
42
8/60
43
12/60
0.0222
0.0333
0.044
0.025
0.75
0.1
0.042
0.0857
0.1714
0.0667
0.1333
0.2
116
(6.5.1)
(6.5.2)
1
, x 0. Cuantila se poate calcula i analitic, de data aceasta:
1 ax b
de F(x) =
b
1 p c 1
F(x) = p F(x) = 1 p x =
. Dup cum se vede n scriptul de mai
a
jos, dac se ia un pas de .01 pentru x, atunci valoarea exact x2 dat de formula de
mai sus coincide cu valoarea aproximativ, x1, dat de funcia cuantdec:
fz<-function(x,a,b,c) {y=1/(1+a*x^b)^c;y}
a=1;b=2;c=3
x=seq(0,10,by=.01);y=fz(x,a,b,c);p=.9
x1=cuantdec(x,y,p)
x2=(((1-p)^(-1/c)-1)/a)^(1/b)
x1 1.074484
x2 1.074446
117
(6.5.3)
i, j
118
(6.5.4)
t 22
2
avem c Eu(xR) = - e
rx '
r 2 x 'Cx
2
= max
x'
rx '
r
x' Cx
2
r 2 x 'Cx
2
. Aadar
= max (6.5.5)
Continum exemplul n care S= 100. Fie = (0, .1, .2, .2,.3) i C = AA, unde
alegem A o matrice aleatoare 55.
> a=floor(10*(runif(25)-.5));dim(a)=c(5,5);C=a%*%t(a);
C=C/10;C
[,1] [,2] [,3] [,4] [,5]
[1,] 3.9 0.2 -2.4 0.6 -1.8
17
Vezi, de exemplu Gheorghia Zbganu, Metode matematice n teoria riscului i actuariat, Editura
Universitii Bucureti, 2004
119
Funcia portopt calculeaz portofoliul optim prin metoda Monte Carlo. Parametrii sunt
- S = suma investit (S = 100)
- r = coeficientul de aversiune la risc. Dac r = 0, brokerul este neutru la risc i
portofoliul va consta n a pune toi banii pe activul de randament maxim. Dac
r este mare, banii se vor aloca n aa fel nct riscul s fie minim.
- mu este media lui R: un vector cu componente mai mari ca -1
- C este matricea de covarian
- N este numrul de simulri
## Maximul functiei m'x - rx'Cx/2 cu r coeficientul de
aversiune la risc
portopt<-function(S,r,mu,C,N)
{ k=length(mu);xx=matrix(nrow=N,ncol=k);val=c(rep(0,N))
for (j in 1:N)
{x=rexp(k,1);x=S*x/sum(x);xx[j,]=x
val[j]=mu%*%x-r*x%*%C%*%x/2
}
valmax=max(val);j=which(val==valmax)
x = xx[j,];x}
Lum
mu =(0.35
0.35
4.7
2.3
0.8
3.1)
Am ales numerele n aa fel nct activele cele mai rentabile s fie i cele mai
riscante iar cel mai sigur s fie R4 . Activul R5 are i randament acceptabil i risc
acceptabil: ar trebui luat n calcul dac exist aversiune la risc.
r=0;xoptim=portopt(S,r,mu,C,N);xoptim
x = 70.61 26.60 0.66 1.17 0.96
120
Dac fceam calculul exact, ne ateptam ca toi cei 100 de lei s fie investii n A1 i
A2. Algoritmul Monte Carlo nea spus s punem 70.61 + 26.60 = 97.21 lei
n A1 i A2.
S lum acum un coeficient moderat de risc,
r=.1; xoptim =portopt(S,r,mu,C,N); xoptim
xoptim = 31.07 0.38 44.04 24.46 0.06
Deja se vede cum activul A2 este evitat: are acelai randament ca A1 dar este mai
riscant.
Mai experimentm
r=1
r=100
xoptim = 22.08
xoptim = 27.31
x'
r
x' Cx
2
0.82
1.21
punct n care xCx este minim. Minimul lui xCx (1652.5)se atinge n
x = 24.8
41.82 33.39
Este o probabilitate mare, fiindc i variana portofoliului este mare. Dac nlocuiam
C cu C/10 am fi obinut
> r=1;
x=portopt(S,r,mu,C,N);mux=x%*%mu;sig=sqrt(x%*%(C/10)%*%x);
pnorm(0,mux,sig)
p= 0.0390437; mux = 24.62120; sig = 13.72716
121
[,1]
[,2]
[,3]
[,4]
[,5]
[1,] 3.9503142 0.1655118 -2.4350401 0.6147029 -1.8183625
[2,] 0.1655118 4.6166988 1.5967822 -0.3969151 2.2854434
[3,] -2.4350401 1.5967822 2.3158990 -0.6054019 2.3049773
[4,] 0.6147029 -0.3969151 -0.6054019 0.7873231 -0.6095916
[5,] -1.8183625 2.2854434 2.3049773 -0.6095916 3.0935673
Dac dorim s vedem cum se comport componentele lui X, putem folosi funcia
summary:
> xsim=xx[[1]]
> for (j in 1:nd) {print(summary(xsim[,j]))}
Min. 1st Qu. Median
Mean 3rd Qu.
Max.
-7.5530 -0.9729 0.3854 0.3706 1.6930 7.8400
Min. 1st Qu. Median
Mean 3rd Qu.
Max.
-7.8290 -1.0810 0.3550 0.3556 1.7980 9.7950
Min. 1st Qu. Median
Mean 3rd Qu.
Max.
-5.9630 -0.8188 0.1742 0.1922 1.1900 5.4900
Min. 1st Qu. Median
Mean 3rd Qu.
Max.
-2.8190 -0.3803 0.2119 0.2123 0.8116 3.5680
Min. 1st Qu. Median
Mean 3rd Qu.
Max.
-5.9740 -0.8904 0.2826 0.2905 1.4550 6.9090
Simularea poate fi folosit atunci cnd avem de calculat cantiti pentru care nu avem
o formul analitic. De exemplu, dac vrem s calculm portofoliul optim xo nd,S
n aa fel nct E (x o 'R 10nd ) s fie maxim, va trebui s simulm un numr de N
valori ale vectorului rentabilitilor, R i un numr de NX valori de portofolii uniform
repartizate din care s l alegem cel pentru care media empiric este maxim.
122
Capitolul 7
Aplicaii rezolvate prin funcii predefinite n R
7.1 Teste statistice
Reamintim c orice presupunere privind repartiia necunoscut a unei variabile
aleatoare poart numele de ipotez statistic, iar metodele de verificare a ipotezelor
statistice poart numele de teste statistice.
Ipoteza care se verific se numete ipoteza nul (notat de obicei cu H0) i
orice alt ipotez admisibil se numete ipotez alternativ (notat de obicei cu Ha).
Verificarea ipotezei nule se face pe baza unei selecii (eantion) de volum n,
x1,..., xn, dintr-o populaie statistic.
Testele statistice, dup scopul lor, se pot clasifica n:
- teste de comparare a unor parametri ai populaiei, ce verific ipoteze precum
compararea mediilor a dou populaii, compararea mediilor mai multor populaii,
compararea dispersiilor, etc;
- teste de omogenitate sau de independen care verific ipoteze de tipul
dependenei sau independenei unor factori de clasificare;
- testele de concordan, care verific dac distribuia seleciei este conforma cu o
anumit distribuie teoretic aa cum ar fi distribuia normal.
Testele de comparare se mpart la rndul lor n dou categorii fundamentale:
- teste parametrice, pentru care se presupune c populaiile din care provin
eantioanele au distribuii cunoscute cu cel puin un parametru necunoscut;
- teste neparametrice, pentru care nu se face nicio presupunere despre distribuiile
populaiilor din care provin eantioanele.
Testele parametrice (fie un parametru al distribuiei populaiei) pot fi [7]:
- teste unilaterale (direcionale) n care H0: = 0 i H1: < 0 sau > 0.
- teste bilaterale (nedirecionale) n care H0: = 0 i H1: 0;
La testele parametrice, dac valoarea parametrului care apare n ipoteza
alternativ este unic, atunci ea se numete ipotez simpl, altfel se numete ipotez
compus.
Zona de acceptare a unei ipoteze, numit i interval de ncredere, este un
interval n care se accept, printr-un test statistic, ipoteza nul, creia i se asociaz
probabilitatea 1-. Zona de respingere este intervalul dintr-o distribuie de selecie a
unei statistici considerate, n care se respinge ipoteza nul, creia i se asociaz o
probabilitate . Probabilitatea este numit prag de semnificaie a testului.
Se pot produce erori de acceptare sau de respingere pe nedrept a unei ipoteze,
numite erori de prim spet sau erori de tipul I i de-a doua spe sau erori de tipul II.
Eroarea de tipul I este eroarea n care se respinge pe ipoteza nul cnd n realitate ea
este adevrat, probabilitatea asociat fiind . Valoarea se alege de obicei ca avnd
valoarea 0,05. Eroarea de tipul II este cea n care se accept ipoteza nul atunci cnd
ea este de fapt fals, probabilitatea asociat fiind . Regiunea critic (de respingere) a
testului reprezint valorile numerice ale testului statistic pentru care ipoteza nul va fi
respins. Nivelul de ncredere al unui test este 1, iar puterea testului este 1.
123
1 n
Xi
n i 1
124
H0
m = m0
Ha
m m0
Regiunea de respingere
|z| z
m = m0
m > m0
z z1
m = m0
m < m0
z z1
unde
- x = vectorul valorilor din eantionul considerat
- mu = media teoretic populaiei
- stdev = dispersia cunoscut a polulaiei
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral)
- sd = alternativa la stdev
- conf.level = intervalul de ncredere
n cazul nostru, o secven de cod R necesar pentru rezolvarea problemei este
urmtoarea:
> x = c(65, 78, 88, 55, 48, 95, 66, 57, 79, 81)
> z.test (x,75,18)
#media=75, dispersia=18
One Sample z-test
data: x
z = -0.6676, n = 10.000, Std. Dev. = 18.000, Std.
Dev. of the sample
mean = 5.692, p-value = 0.5044
alternative hypothesis: true mean is not equal to 75
95 percent confidence interval:
60.04369 82.35631
sample estimates:
mean of x
71.2
Astfel sunt calculate: valoarea statisticii care este 0,6676, intervalul de ncredere
pentru media vectorului x, etc. Acum putem compara valoarea statisticii testului cu
valoarea distribuiei student cu 10-1=9 grade de libertate determinat din tabele sau se
poate folosi funcia R pentru determinarea acestei valori:
qnorm(p, ...)
125
#Z_(1-alpha/2)
Valoarea calculat a statisticii Z este egal cu 0.6676 i n valoare absolut este mai
mic dect valoarea teoretic 1.959964 pentru = 0.05. Aadar, se accept ipoteza
nul a testului i astfel se decide c media eantionului este similar cu media ntregii
populaii.
Alternativ, se poate folosi p-valoarea calculat. p-valoarea unui test statistic
este cea mai mic valoare a nivelului de semnificaie pentru care informaia extras
din eantion este semnificativ (H0 adevrat se respinge). Cu un prag de semnificaie
al testului de 5%, se poate aplica regula: dac valorea p este mai mare dect 0.05
atunci se accept ipoteza nul H0, iar dac este mai mic dect 0.05 atunci se respinge
ipoteza nul H0 n favoarea ipotezei alternative H1. n cazul nostru, p-valoarea este
0.5044 > 0.05 i deci se accept ipoteza nul H0.
7.1.1.2 Testul t pentru un singur eantion
n 1
n
x
i 1 i
n
(x
i 1 i
x) ,
126
unde
- x = vectorul valorilor din primul eantion
- y = al doilea vector (opional) de valori folosit pentru teste cu dou eantioane
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral)
- mu = media teoretic populaiei
- paired = indicator logic pentru un t-test pereche
- var.equal = variabil logic ce indic dac cele dou variane sunt egale sau nu
- conf.level = intervalul de ncredere
Considernd din nou aplicaia de la testul anterior, de data aceasta cu dispersie
necunoscut, nti s calculm statisticele clasice:
> mean(x) #media datelor din vectorul x
[1] 71.2
> sd(x)
#deviatia stantard a datelor din vect. x
[1] 15.34637
Astfel sunt calculate: valoarea statisticii care este 0.783, numrul gradelor de
libertate care este 10-1=9, intervalul de ncredere pentru media vectorului x, etc.
Acum putem compara valoarea statisticii testului cu valoarea distribuiei student cu 9
grade de libertate determinat fie din tabele (Tabelul 2 de la Anexa 1), fie se poate
folosi funcia R pentru determinarea acestei valori:
qt(p, df, ...)
Aadar, valoarea statisticii t este egal cu -0.783 i n valoare absolut este mai mic
dect valoarea critic 2.262157 cu = 0.05 i deci se accept ipoteza testului i se
decide c media eantionului este semnificativ similar cu media ntregii populaii.
Alternativ, se poate folosi p-valoarea calculat. Cu un prag de semnificaie al
testului de 5%, se poate aplica regula: dac valorea p este mai mare dect 0.05 atunci
putem accepta ipoteza nul H0, iar dac este mai mic dect 0.05 atunci respingem
ipoteza nul H0 n favoarea ipotezei alternative H1. n cazul nostru, p-valoarea este
0.4537 > 0.05 i deci se accept ipoteza H0.
127
unde
- x = numrul de succese sau un vector cu 2 componente: (numr de succese, numr
de eecuri)
- n = numrul de ncercri
- p = probabilitatea de succes
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral)
- conf.level = nivelul de ncredere al testului.
Aplicaie: S se testeze ipoteza [8] c senatul de la o universitate american
spune adevrul sau nu i anume c nu se face discriminare sexual la admitere. Se
aleg 500 de studeni i se gsesc 267 biei. Se consider cu nivelul de semnificaie
5%.
Soluie: O secvena de cod R ce poate soluiona aplicaia este urmtoarea:
> binom.test(267,500)
Exact binomial test
data: 267 and 500
number of successes = 267, number of trials = 500,
p-value = 0.1399
alternative hypothesis: true probability of success
is not equal to 0.5
95 percent confidence interval:
0.4891844 0.5784114
sample estimates:
probability of success
0.534
S-a obinut o p-valoare apropiat de 0.1399, fiind astfel mai mare dect pragul de
semnificaie 0.05 i astfel se accept ipoteza nul. Prin urmare, este foarte probabil ca
senatul s spun adevrul.
128
7.1.1.4 Testul 2
Unul dintre cele mai importante teste statistice pentru cea mai bun potrivire a
modelului n cazul unei variabile nominale cu dou sau mai multe valori. Ipoteza nul
n acest test este aceea c numrul observaiilor n fiecare categorie este egal cu cel
prezis de teorie, iar ipoteza alternativ este aceea c numrul observat este diferit de
cel ateptat. Statistica testului se calculeaz n felul urmtor: se ia numrul observat
(ni) , se scade numrul ateptat ( n'i ) i se ridic diferena la ptrat. Cu ct deviatia fa
de ipoteza nul este mai mare, cu att mai mare ne ateptm ca diferena dintre
numrul observat i cel ateptat. Prin ridicarea la ptrat, toate aceste diferene devin
pozitive. Apoi, fiecare dintre aceste diferene se mparte la numrul ateptat i aceste
diferente standardizate:
( ni n ' i ) 2
n 'i
i 1
k
(2s 1) k ;
corespunztoare
2 (2s 1) k ;
unde
129
Aceste rezultate (p-valoarea este 0.1697 > 0.05 sau valoarea calculat a statisticii
testului este 5.0286 < valorea cuantilei cu 3 grade de libertate = 7.814728) arat c
proporiile studenilor din eantionul considerat nu difer semnificativ de valorile
furnizate n ipoteza statistic.
130
131
unde
- x = vectorul valorilor din primul eantion
- y = al doilea vector (opional) de valori din al doilea eantion
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral)
mu = media teoretic populaiei
paired = indicator logic pentru un t-test pereche
var.equal = variabil logic ce indic dac cele dou variane sunt egale sau nu
> t.test(x, y)
Welch Two Sample t-test
data: x and y
t = 3.2499, df = 12.027, p-value = 0.006939
alternative hypothesis: true difference in means is
not equal to 0
95 percent confidence interval:
0.01385526 0.07018320
sample estimates:
mean of x mean of y
80.02077 79.97875
Se observ c p-valoarea este 0.006939 i nu este mai mare dect 0.05, deci exist o
diferen statistic ntre mediile celor dou grupuri.
Dac vrem s considerm cele dou dispersii egale, procedm astfel:
>
+
>
+
132
80.02077
79.97875
133
sau
wilcox.test(formula, data, subset, na.action)
unde
- x = vectorul valorilor din primul eantion
- y = al doilea vector (opional) de valori folosit pentru teste cu dou eantioane
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral)
- mu = media teoretic populaiei cu valoarea implicit 0
- paired = indicator logic pentru un test pereche, implicit cu valoarea FALSE
- exact = indicator logic ce specific dac ar trebui calculat o p-valoare exact
- correct = indicator logic ce specific dac ar trebui aplicat corecie de
continuitate la aproximarea normal a valorii lui p
- conf.int = indicator logic ce specific dac ar trebui clculat un interval de
ncredere
- conf.level = intervalul de ncredere
- formula = este o formul de forma membrul_stng ~ membrul_drept, unde
membrul_stng este o variabil numeric ce d valorile, iar membrul_drept este
un factor cu dou nivele dndu-se corespunztoare celor dou grupuri
- data = o matrice opional sau data frame ce conine variabilele din formula
formula, implicit acestea fiind luate din environment;
- na.action = o funcie care indic ce ar trebui s se ntmple n cazul n care
datele conin valori NA.
Aplicaie: S considerm o companie care produce baterii, printre care i
baterii scumpe. ns se dorete modificarea necostisitoare a celor scumpe astfel nct
s se ajung la creterea duratei de via. Ipotezele statistice ar fi urmtoarele:
H0: durata de via a bateriilor modificate este aceeai cu cea a celor scumpe
Ha: durata de via a bateriilor modificate este mai mare cu cea a celor scumpe
Presupunem c avem la dispoziie un eantion de 6 baterii scumpe i un eantion de 5
baterii modificate. Cele 11 sunt construite n condiii identice i independent. Datele
disponibile se refer la durata de via a bateriilor considerate i sunt urmtoarele:
X = (48, 53, 74, 111, 113, 335) i Y = (62, 101, 167, 174, 190).
Urmtoarea secven de cod R aplic testul Wilcoxon pentru exemplul
considerat:
> x=c(48,53,74,111,113,335)
> y=c(62,101,167,174,190)
> wilcox.test(x,y)
Wilcoxon rank sum test
data: x and y
W = 10, p-value = 0.4286
alternative hypothesis: true location shift is not
equal to 0
Cum p-valoarea este 0.4286 > 0.05 rezult c diferena este nesemnificativ
statistic ntre cele dou eantioane.
134
xy
,
d
n
( x yi ) 2 1
i 1 i
n
2
n
(
x
y
)
i
i 1 i
n 1
Dup calcularea lui t dependent va trebui sa comparm valoarea obinut cu valoarea t
teoretic.
Aplicaie: Un cercettor dorete s studieze influena metodelor de relaxare
asupra reducerii conduitelor agresive la adolesceni. O grupa de 12 subieci cu
tulburri comportamentale este testat iniial n ce privete nivelul agresivitii. Dup
acest moment, cei 12 adolescenti sunt nvati s practice relaxarea i urmeaz sedine
de relaxare de cte 1 or de 5 ori pe sptmn. Dupa o perioada de 2 luni, subiecii
sunt retestai utiliznd aceeai prob pentru a observa dac nivelul lor de agresivitate a
sczut n urma practicrii metodelor de relaxare. Datele obinute de cei 12 adolesceni
la chestionarul de agresivitate pe parcursul celor dou testri sunt urmtoarele:
nainte = (21, 18, 15, 11, 24, 23, 17, 19, 19, 17, 20, 15)
dup = (15, 13, 16, 13, 13, 12, 11, 10, 15, 17, 14, 16)
Secvena de instruciuni R ce rezolv exemplul considerat este urmtoarea
> inainte = c(21,18,15,11,24,23,17,19,19,17,20,15)
> dupa = c(15,13,16,13,13,12,11,10,15,17,14,16)
> t.test(inainte, dupa, paired=TRUE)
Paired t-test
data: pre_test and post_test
t = 3.3726, df = 11, p-value = 0.006223
alternative hypothesis: true difference in means is
not equal to 0
95 percent confidence interval:
1.56327 7.43673
sample estimates:
mean of the differences
4.5
p-valoarea este 0.006223 i nefiind chiar nul rezult c se accept ipoteza nul.
Acelai lucru se poate determina i comparnd valoarea testului cu valoarea quantilei
distribuiei t care se poate afla n R astfel
135
> qt(0.975,11)
[1] 2.200985
Se observ c valoarea obinut 3.3726 este mai mare dect valoarea teoretic
2.200985 i deci mediile celor dou eantioane pereche sunt semnificativ diferite
statistic.
7.1.2.4 Testul F pentru dou eantioane independente
H0: 12 / 22 = 1
Ha: 12 / 22 < 1 sau 12 / 22 > 1
Cnd ipoteza nul este adevrat, statistica
S2
F* = 1 ,
S 22
este repartizat Snedecor F , n1 1, n 2 1 pentru un prag de semnificaie , unde
n
S12
1
1
n1 1 i 1
S 22
1
1
n2 1 i 1
1 1
xi media de selecie a primului eantion
n1 i 1
n
1 1
yi media de selecie a celui de-al doilea eantion
n2 i 1
Repartiia F (Snedecor) cu 1, respectiv 2 grade de libertate are funcia de
densitate de forma:
y
136
2
1
1 1
1 2
1
2
x
2
x 2 1
, x0
f(x) =
2
1 2
2
2 2
Decizia, la pragul de semnificaie , pentru testul bilateral este urmtoarea: se
respinge ipoteza nul H0 n favoarea ipotezei alternative Ha dac:
1 / 2
sau
var.test(formula, data, subset, na.action, ...)
unde
- x = vectorul valorilor din primul eantion
- y = al doilea vector (opional) de valori folosit pentru teste cu dou eantioane
- ratio = raportul presupus pentru dispersiile populaiilor din care provin cele
dou eantioane
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral)
- conf.level = intervalul de ncredere
- formula = este o formul de forma membrul_stng ~ membrul_drept, unde
membrul_stng este o variabil numeric ce d valorile, iar membrul_drept este
un factor cu dou nivele dndu-se corespunztoare celor dou grupuri
- data = o matrice opional sau data frame ce conine variabilele din formula
formula, implicit acestea fiind luate din environment;
- subset = vector (opional) ce specific submulimea de observaii ce se va folosi
- na.action = o funcie care indic ce ar trebui s se ntmple n cazul n care
datele conin valori NA.
Exemplu: Generm 50 de variabile distribuite N(0,2) i 30 de variabile
distribuite N(1,1). Pentru a vedea dac cele dou eantioane au dispersiile egale sau
diferite se poate folosi urmtorul cod de instruciuni R:
> x <- rnorm(50, mean = 0, sd = 2)
# x i y au aceeai dispersie?
137
Cum valoarea calculat (5.4473) este mai mare dect valoarea teoretic (1.990354),
atunci se respinge ipoteza nul.
7.1.2.5 Testul Kolmogorov-Smirnov
Se folosete pentru cazul cnd dorim s determinm dac dou eantioane sunt
semnificativ diferite. Spre deosebire de alte teste, testul Kolmogorov-Smirnov nu
presupune nimic despre distribuia datelor i se poate spune c acest test este
neparametric i liber de distribuii.
n general, testul Kolmogorov-Smirnov se poate aplica pentru un eantion sau
pentru dou eantioane. Cnd se aplic testul pentru un eantion, se compar distribuia
testat cu alte distribuii cunoscute, cum ar fi distribuia uniform, normal sau lognormal. Testul Kolmogorov-Smirnov pentru dou eantioane compar dac cele
dou eantioane de date provin din aceeai distribuie, dei nu se specific exact tipul
distribuiei.
Din studierea convergenei funciei empirice de repartiie Fn ctre funcia
teoretic de repartiie F, Kolmogorov a demonstrat urmtoarea teorem:
K ( ) (1) k e 2k 2 ,
lim P d n
n
n
k
unde .> 0 i d n max Fn ( x ) F ( x ) .
Funcia K este calculat n tabele pentru diverse valori ale lui (tabelul
distribuiei Kolmogorov).
Cu ajutorul acestei teoreme se poate da un criteriu de verificare a ipotezei H0 c
repartiia empiric urmeaz o anumit lege de repartiie.
Dac ipoteza H0 este adevrat, atunci diferenele Fn ( x) F ( x) nu vor depi o
anumit valoare d ;n pe care o fixm astfel nct: P (d n d ;n / H 0 ) , unde
este riscul de gradul nti. Dar P (d n d ;n ) 1 P (d n d ;n ) .
mare avem: P d n 1 P d n 1 K ( ) .
n
n
138
Regiunea critic pentru ipoteza H0 este dat de relaia d n . Deci:
n
unde
- x = este un vector de valori din primul eantion
- y = este (opional) un vector de valori din al doilea eantion sau un ir de caractere
ce reprezint funcia de distribuie ca de exemplu pnorm.
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral).
- exact = NULL sau un indicator logic ce stabilete dac p-valoarea trebuie
calculat; nu se folosete pentru unul sau dou eantioane.
Exemplu: S considerm dou eantioane: primul cu 50 de componente
repartizate N(0,1), iar al doilea cu 30 de componente repartizate U(0,1).
> x <- rnorm(50)
> y <- runif(30)
> ks.test(x, y) # test Kolmogorov-Smirnov (au
+aceeai distribuie?)
Two-sample Kolmogorov-Smirnov test
data: x and y
D = 0.54, p-value = 1.598e-05
alternative hypothesis: two-sided
Cum p-valoarea este 1.59810-5 < 0.5, rezult c cele dou grupuri sunt semnificativ
diferite statistic.
H0: p=0.5
139
Acest ipotez implic faptul c dndu-se o pereche aleatoare de msurtori (xi, yi)i
atunci xi i yi au aceeai ans de a fi mai mari unul dect cellalt.
Variabilele celor dou eantioane trebuie s fie de tip numeric, iar valorile s
fie exprimate n aceeai unitate de msur, pentru a se putea face diferena lor.
n pachetul de programe BSDA exist funcia R predefinit
SIGN.test(x, y = NULL, md = 0, alternative = "two.sided",
conf.level = 0.95)
unde
- x = este un vector de valori din primul eantion (valori NA sau Inf se accept, ns
sunt ignorate)
- y = este (opional) un vector de valori din al doilea eantion (valori NA sau Inf se
accept, ns sunt ignorate)
- md = valoarea medianei populaiei specificat n ipoteza nul
alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral).
- conf.level = intervalul de ncredere
Exemplu: S considerm doi vector ce conin valori nainte de un eveniment i
dup acesta. Vom testa ipoteza nul c Nu exist diferene ntre cei doi vectori de
msurtori, cu ipoteza alternativ Exist diferene ntre cei doi vectori de
msurtori
> x=c(15,14,14,13,15,13,12,13)
> y=c(16,14,15,15,17,15,14,15)
> SIGN.test(x,y)
Dependent-samples Sign-Test
data: x and y
S = 0, p-value = 0.01563
alternative hypothesis: true median difference is
not equal to 0
95 percent confidence interval:
-2.000 -0.675
sample estimates:
median of x-y
-2
Lower Achieved CI
Interpolated CI
Upper Achieved CI
Cum p-valoarea este 0.01563 este foarte mic, atunci se respinge ipoteza nul in
favoarea ipotezei alternative.
140
k (n
ij
X =
i 1 j 1
ni p j ) 2
ni p j
cu
ni
nij , i = 1, 2,, s,
j 1
X2=
i 1 j 1
(nij npi p j ) 2
ni pi p j
j 1
i 1
ni
X2=
(nij ni n j / n) 2
n n /n
i j
i 1 j 1
Atunci varibila
s
141
Cum p-valoarea gsit are valoarea 0,4828 care este mai mare dect pragul de
semnificaie de 0,05, atunci acceptm ipoteza nul conform creia obiceiul fumatului
este independent de nivelul de micare fizic a studentului. Mesajul de eroare se
datoreaz numrului de celule din tabelul de contingen. Pentru a evita acest
avertisment, putem combina coloanele a doua cu a treia i noul tabel sa-l numim t2 i
apoi reaplicm testul pentru acest nou tabel.
> t2=cbind(t[,"Freq"],t[,"None"]+t[,"Some"])
> t2
[,1] [,2]
Heavy
7
4
Never
87 102
Occas
12
7
Regul
9
8
142
> chisq.test(t2)
Pearsons Chi-squared test
data: t2
X-squared = 3.2328, df = 3, p-value = 0.3571
Din nou se observ din nou independena celor dou variabile considerate.
7.1.2.8 Testul de independen al lui Fisher
y1
n
n1n2
n
n1
y2
x2
n 2 n1
n
n 2 n 2
n
n 2
Total
n1
n1
Pentru a vedea dac ntre cele dou variabiel aleatoare exist sau nu o conexiune,
trebuie s calculm nu numai probabilitatea P(n11, n12, n21, n11 / n1 n 2 ), dar i
probabilitile de a se obine repartiii care fa de cea observat se ndeprteaz mai
mult de repartiia din cazul independenei.
Dac n11 < n1n1 / n , tabelele ce se ndeprteaz mai mult sunt acelea care au
prima celul egal respectiv cu (n11-1), (n11-2),, 1, 0 uniti.
Dac n11 > n1n1 / n , tabelele extreme sunt acelea care au n prima celul
P(n11) =
n11
i 0
min{n1 , n1 }
i n11
143
unde
- x = este un tabel de contingen 22 sau un prim obiect factor;
- y = este (opional) un al doilea obiect factor sau ignorat dac x este matrice;
- workspace = un ntreg ce specific dimensiunea spaiului de lucru folosit n
algoritm, cu unitatea de msur de cte 4 bytes;
- hybrid = o valoare logic implicit FALSE, folosit pentru tabele mai mari de
22, caz n care indic probabilitile exacte (implicite) sau o aproximare hibrid ce ar
trebui calculat;
- control = o list coninnd componente predefinite pentru un control jos al
algoritmului; n prezent, singurul folosit este mult, un ntreg pozitiv 2 cu valoarea
implicit 30, folosit doar pentru tabele mai mari dect 22; acesta specific de cte ori
ar trebui alocat spaiu pentru ci, ct i pentru valori;
- or = raportul de diferene din ipotez (folosit doar pentru tabele 22);
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral), dar mai poate fi i greater sau less se poate specific doar prima liter
din ir; valabil doar pentru tabele 22;
- conf.int = parametru logic ce indic dac se dorete determinarea unui interval
de ncredere intervalul de ncredere
- conf.level = nivelul de ncredere pentru intervalul de ncredere returnat folosit
doar petru tabele 22 dac conf.int=TRUE;
- simulate.p.value = o variabil logic ce specific dac p-valoarea se va
calcula prin simulare Monte Carlo folosit pentru tabele mai mari dect 22;
- B un ntreg ce specific numrul de duplicate folosit n testul Monte Carlo.
Pentru a ti dac ntre cele dou variabile aleatoare componente ale vectorului
aleator (X, Y) exist o legtur semnificativ, se poae emite ipoteza H0 c cele dou
variabile aleatoare sunt independente i deci c repartiiile unitilor n cele patru
rubrici ale tabelei vor fi urmtoarele:
y1
x1
n1n1 / n
x2
n 2 n1 / n
y2
n1n2 / n
n 2 n2 / n
n1
n 2
total
n1
n2
Pentru a vedea dac ntre cele dou variabile aleatoare exist sau nu o
conexiune, trebuie s calculm nu numai probabilitatea P(n11, n12, n21, n11 / n1 n 2 ),
dar i probabilitile de a se obine repartiii care fa de cea observat se ndeprteaz
mai mult de repartiia din cazul independenei.
Dac n11 < n1n1 / n , tabelele ce se ndeprteaz mai mult sunt acelea care au
prima celul egal respectiv cu (n11-1), (n11-2),, 1, 0 uniti.
Dac n11 > n1n1 / n , tabelele extreme sunt acelea care au n prima celul
n11
i 0
144
P(n11) =
min{n1 , n1 }
i n11
Aplicarea testului lui Fisher conduce la o p-valoare de 0.1587 > 0.05, deci nu este
nicio dovad c cele dou specii de psri folosesc locuri de aterizare n proporii
diferite.
145
vedere, toate cele trei grupuri conin tineri: exist vreo diferen semnificativ ntre
cele trei medii? Cum testm, mai exact, acest lucru?
Nr.crt Localitate 1
22
1
27
2
32
3
30
4
29
5
27
6
33
7
24
8
24
9
30
10
x
27,8
s
3,65
Localitate 2
28
22
24
18
21
26
25
20
24
28
23,6
3,34
Localitate 3
20
28
31
26
26
30
21
25
29
27
26,3
3,59
s x2
1 k
(x j x )
k 1 j 1
Aceasta indic o estimare a erorii standard din populaie, de unde putem extrage
foarte simplu varian din populaie ES = / n .
Ne confruntm, deci, cu dou tipuri de variaii: o variaie ntre grupuri
(variaia mediilor de grup n jurul mediei generale) i una n interiorul grupurilor
(variaiile observaiilor n jurul fiecrei medii de grup). Ambele tipuri de variaii sunt
folosite ca estimri ale variaiei generale n populaie.
Analiza de varian se bazeaz pe compraia dintre dou estimri ale varianei
2 pentru ntreaga populaie. Logica analizei este urmtoarea: dac cele dou estimri
ale varianei din populaie 2 sunt aproximativ egale, atunci ipoteza nul este
adevrat (n populaie, toate mediile sunt egale). Dac ipoteza de nul nu este
adevrat, atunci cele dou estimri ale varianei vor fi semnificativ diferite.
> localit1 = c(22,27,32,30,29,27,33,24,24,30)
> localit2 = c(28,22,24,18,21,26,25,20,24,28)
> localit3 = c(20,28,31,26,26,30,21,25,29,27)
> localit = c(localit1,localit2,localit3)
> n=rep(10,3)
> v=rep(1:3,n)
> table(localit)
localit
147
18 20 21 22 24 25 26 27 28 29 30 31 32 33
1 2 2 2 4 2 3 3 3 2 3 1 1 1
>f=function(x) c(mean=mean(x),var=var(x),n=length(x))
> tapply(localitati,v,f)
$`1`
mean
var
n
27.80000 13.28889 10.00000
$`2`
mean
var
n
23.60000 11.15556 10.00000
$`3`
mean var
n
26.3 12.9 10.0
> date = data.frame(localit=localit,v=factor(v))
> model = lm(localit~v,date)
> anova(model)
Analysis of Variance Table
Response: localit
Df Sum Sq Mean Sq F value Pr(>F)
v
2
90.6 45.300 3.6391 0.03987 *
Residuals 27 336.1 12.448
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 .
0.1 1
Valoarea de 3,639 (mult mai mare dect 1) ne sugereaz c ipoteza nul este
pe cale de a fi respins, pentru c variaia explicat de diferenele dintre grupuri este
mult mai mare dect variaa datorat erorilor aleatoare; existnd diferene majore ntre
grupuri, vor exista cu siguran diferene ntre mediile acestora. Modalitatea
alternativ este de a compara p-valoarea cu pragul de semnificaie ales; cum pvaloarea este 0.03987 i este mai mic dect = 5% se respinge ipoteza nul: cel
puin una dintre strategii a dat rezultate.
Anova nu ne spune ns dect dac acceptm sau respingem ipoteza nul,
adic dac exist sau nu o medie diferit statistic de celelalte. n cazul acceptrii
ipotezei nule cu Anova, pentru a vedea unde este diferena, putem folosi un test al
diferenelor dintre medii i anume testul Tukey.
n pachetul standard de funcii R stats exist funcia predefinit Tukey.HSD,
cu prototipul:
TukeyHSD (x, which, ordered = FALSE, conf.level = 0.95, ...)
148
unde
- x = un obiect de potrivire a modelului, de obicei aov;
- which = vector de caractere ce specific lista de termeni din modelul de potrivire
pentru care ar trebui calculate intervalele;
- ordered = valoare logic ce specific dac nivelele factorului ar trebui ordonate
cresctor dup medie nainte de a calcula diferenele;
- conf.level = nivelul de ncredere
Aceasta determin o mulime de intervale de ncredere pentru diferenele dintre
mediile nivelelor unui factor. John Tukey a calculat intervale bazate pe valorile
mediilor grupurilor i nu pe baza diferenelor individuale.
n cazul nostru, o secven de cod R necesar pentru rezolvarea problemei este
urmtoarea:
>
>
>
>
>
>
l1 = c(22,27,32,30,29,27,33,24,24,30)
l2 = c(28,22,24,18,21,26,25,20,24,28)
l3 = c(20,28,31,26,26,30,21,25,29,27)
localitati = c(l1,l2,l3)
n = rep(10,3)
v = rep(1:3,n)
Se observ c cele mai apropiate medii sunt cele ale grupurilor 1 i 3, apoi ale
grupurile 3 i 2. Se observ c p-valoarea pentru grupurile 2 i 1 este 0.0335040,
valoare mai mic dect 0.05, aadar media grupului 2 este diferit statistic de media
grupului 1 la un nivel de semnificaie de 5%.
149
k R2
12
i 3(n 1) , unde Ri reprezint suma
n(n 1) i 1 ni
se compar HKW cu valoarea teoretic (21 )(k 1) i dac HKW (21 )(k 1)
atunci ipoteza nul se respinge, respectiv dac HKW < (21 )( k 1) atunci ipoteza
nul se accept.
n pachetul standard de funcii R stats exist funcia predefinit
sau
kruskal.test(x,g,...)
sau
kruskal.test(formula,data,subset,na.action,)
unde
- x = un vector numeric (eantionul) sau o list de vectori numerici (eantioanele
independente);
- g = vector de factori ce ne dau grupurile elementelor corespunztoare din x; acest
argument este ignorat dac x este list;
- formula = formul de forma valori_date ~ grupurile corespunztoare;
- data = matrice opional sau data frame ce conine variabile de forma formula.
- subset = vector opional ce specific o submulime de observaiile ce pot fi
folosite;
- na.function = funcie ce specific ce-ar trebui s se ntmple cu datele ce
conin NA.
Aceasta aplic testul de nsumare a rangurilor Kruskal-Wallis pentru ipoteza nul c
parametrii distribuiei lui x sunt aceeai n fiecare eantion, au ipoteza alternativ c ei
difer n cel puin un parametru.
Aplicm acum testul Kruskal-Wallis n R pentru aplicaia de la Anova
unidirecional:
> by(localitati,grup,summary)
grup: 1
150
Se observ c p-valoarea este 0.05354, puin mai mare dect pragul de semnificaie
0.05, aadar se accept ipoteza nul conform creia mediile grupurilor sunt egale
statistic.
151
V1
10
12
14
Time
Fig 7.1
Funciile din R pentru analiza seriilor de timp prevd c datele msurate s fie
convertite n obiecte de tip ts. Conversia se face prin comenzile ts(...) sau as.ts(...),
mai exact
ts(data = NA, start = 1, end = numeric(0), frequency = 1,
deltat = 1, ts.eps = getOption("ts.eps"), class = ,
name= )
as.ts(x, ...)
Dintre parametrii din funciile de mai sus data reprezint vectorul sau matricea cu
datele msurate, start este momentul de ncepere al observaiilor, frequency este
152
18
153
i a stabili evoliile lor cele mai probabile. Pentru aceasta este ns nevoie de
considera un model stochastic potrivit.
a1. Identificarea tendinei i a componentei periodice
Valorile msurate ale seriei temporale pot fi privite ca valori ale unui ir de
variabile aleatoare X t tZ sau X t tN . Descompunerea n tendin plus componenta
periodic plus partea rezidual se poate scrie
(7.2.1)
X t m t s t Yt
In formula de mai sus m t este tendin iar s t este componenta periodic. Pentru
tendin se utilizeaz n general metoda celor mai mici ptrate. Se specific modelul
de exemplu m t a bt i se estimeaz a i b prin metoda celor mai mici ptrate.
Pentru specificarea modelului n R avem informaii n manualul de introducere n R
care vine cu kitul de instalare. Reproducem de acolo cteva specificaii (seria de date
y este modelata ca expresie de alte serii de date x, x1, x2, etc., linear, prin formule):
Notaia n R
y ~ x sau y~1+x
y ~ 0 + x sau y ~ -1 + x sau y ~ x - 1
log(y) ~ x1 + x2
y ~ 1+x+I(x^2)
y~1+x+I(sin(2*x))
Explicaii
y~a+bx
y~bx
log(y) ~a+b*x1+c*x2
y ~ a+b*x+c*x^2
y ~ a+b*x+c*sin(2*x)
In cadrul seriilor temporale n loc de y ~ x avem tendina ca funcie de timp, x~t, unde
t este timpul.
Determinarea parametrilor a, b, c, etc., se face prin comanda lm (linear model) ca mai
jos:
lm(formula, data, subset, weights, na.action,
method = "qr", model = TRUE, x = FALSE, y = FALSE, qr =
TRUE,singular.ok = TRUE, contrasts = NULL, offset, ...)
Dintre parametrii funciei lm doar formula (sub forma unui tabel ca mai sus)
este obligatoriu deoarece datele data sunt menionate n formul, iar ceilali
parametri au valori implicite).
Rezultatul funciei lm este o list cu elemente numite din care coefficients
conine coeficienii obinui n urma regeresiei liniare, residuals conine diferenele
ntre valorile actuale i cele obinute prin foemula de regresie. Celelalte componente
se pot afla prin help(lm) n consola R.
Secvena de mai jos produce un ir de valori care se modeleaz n dou feluri
i apoi se reprezint grafic datele iniiale i modelele:
x=1:20/5
y=rnorm(20)/5+2*x+0.2*sin(2*x)
m1=lm(y~1+x)
m2=lm(y~1+x+I(sin(2*x)))
y1=m1$coeff[1]+m1$coeff[2]*x
plot(x,y, main="Modelele y~1+x si y~1+x+I(sin(2*x))")
lines(x,y1, lwd=2, lty=3)
y2=m2$coeff[1]+m2$coeff[2]*x+m2$coeff[3]*sin(2*x)
154
lines(x,y2,lwd=3,lty=4)
grid(5,5)
Fig 7.2
Coeficienii celor dau modele sunt:
> m1
Call:
lm(formula = y ~ 1 + x)
Coefficients:
(Intercept)
0.02623
> m2
x
2.01722
Call:
lm(formula = y ~ 1 + x + I(sin(2 * x)))
Coefficients:
(Intercept)
-0.06758
x
2.04058
I(sin(2 * x))
0.26963
Pentru modele neliniare putem utiliza funcia R numit nlm. Forma funciei
este:
nlm(f, p, ..., hessian = FALSE, typsize = rep(1,
length(p)),
fscale = 1, print.level = 0, ndigit = 12, gradtol =
1e-6,
stepmax = max(1000 * sqrt(sum((p/typsize)^2)), 1000),
steptol = 1e-6, iterlim = 100, check.analyticals =
TRUE)
155
funcia f (p) y i p1 p 2 x p 3 e p 4 x
, adic
f(p)= sum((y-p[1]-p[2]*x-p[3]*exp(p[4]*x))^2)
4
0
Estimare neliniara
Fig. 7.3
Rezultatul m3 al funciei nlm este o list unde m3$estimate este un vector cu
valorile parametrilor determinai de rutina nlm. Dac parametrul $code este 1 sau 2
nseamn c probabil parametrii p sunt corect estimai (s-a ajuns la concluzia aceasta
din motive diferite pentru $code=1 sau $code=2). Vedem mai jos acest rezultat:
> m3
$minimum
[1] 2.24936e-14
156
$estimate
[1] 4.7903681 6.2172098 0.7584119
$gradient
[1] -2.586661e-06 -2.085010e-06 -4.790367e-05
$code
[1] 2
$iterations
[1] 7
Dac n modelul liniar sau n cel neliniar sunt cuprinse funcii periodice atunci
se determin simultan i tendin i partea periodic.
O alt modalitate de identificare a tendinei este sub forma unei medieri
exponeniale:
Valorile tendinei seriei x t sunt calculate succesiv prin
m t x t 1 m t 1
(7.2.2)
cu (0,1) . Alegerea lui este subiectiv. Dac datele ncep cu x 1 atunci avem :
m t 1 x 1 1
t 1
t 2
x 2 ... 1 x t 1 x t .
In acest fel tendina este pstrat sub forma unui vector de valori m t 1 t T .
Estimarea dup timpul maxim de msurare, T, se face prin m T k m T ceea ce nu este
foarte convenabil. O estimare a tendinei n aa fel ca ea s poat fi extins ntr-un
mod mai rezonabil dup t=T se poate face prin procedura Holt care const n mediarea
exponenial a tendinei m t ct i a pantei Pt sub forma:
m1 x 1
P1
x n x 1 pentru un n, de exemplu n 2
n 1
m t x t 1 m t 1 Pt 1
(7.2.3)
Pt m t m t 1 1 Pt 1
m t x t s t L 1 m t 1 Pt 1
Pt m t m t 1 1 Pt 1
s t x t m t 1 s t L
157
(7.2.5)
(7.2.6)
158
V1
10
12
14
Time
Fig. 7.4
Funcia predict are forma:
predict(object, n.ahead=1, prediction.interval = FALSE,
level = 0.95, ...)
BX t
la lag=2 este Y 1 B 2 X .
c(x[1],x[1]+cumsum(y)).
Transformarea seriei ntr-o serie staionar (vezi mai jos) se poate ncerca i
printr-o transformare de tip Box-Cox:
x t 1
pour 0
yt
(7.2.7)
lnx pour 0
t
159
(7.2.8)
depinde doar de diferena h=r-s. In cele ce urmeaz notm E(X) media v.a. X. Pentro
o serie temporal staionar notm X h EX t h X X t X , independent de
t. Avem:
X 0 var(X t ) 0
X h X h
| X h | X (0)
k
k 1, a 1 , a 2 ,..a k a i i ja j 0
i , j1
(7.2.12)
h h
0
Box i Jenkins recomand n 50 et h n / 4 pentru estimrile de mai sus.
h
160
Estimatorii pentru medie i corelaie pot fi studiai doar n unele ipoteze asupra
seriei temporale X. Astfel introducem unele tipuri de serii temporale staionare :
Zgomotul alb este un tip de serie temporal Z t tZ n care fiecare v.a. este de
(7.2.13)
Seria temporal i.i.t. este la fel ca zgomotul alb dar toate variabilele Z t sunt
independente identic distribuite.
Modelul general linear este o serie temporal X t tZ n care X t
t j
X h 2 j h j .
j
i 1
2 q |h|
i i |h| , | h | q
(7.2.14)
X h Cov(X t h , X t )
i 0
0,
| h | q
cauzal) atunci X t Z t j Z t j cu
j1
|
j1
2 11 2 3 1 ... p p 2
.....
p 1 p 1 2 p 2 3 p 3 ... p
161
(7.2.15)
Serii staionare autoregresive medie mobil ARMA(p,q) sunt serii care verific
o relaie de forma:
X t 1 X t 1 2 X t 2 ... p X t p 1 Z t 1 2 Z t 2 ... q Z t q Z t
unde Z t este un zgomot alb independent de X t k pentru k>0. Dac seria este cauzal
X t Zt jZt j
cu
j1
j1
| .
Dac
polinomul
Se vede din apelul funciei c prin opiunea pacf putem obine funcia de
autocorelaie parial.
i.
Dac
(AN=asimptotic
Xt
t j
cu
In
particular
normal).
v
X n este AN(0, )
n
lucru se ntmpl dac
atunci
acest
162
ii. Dac X t
t j
cu
| j | i
|
h
|
| j | , atunci X
h
j
j
2
j
2
.
est AN .
, 1 W
n
.
k i k j k i k j 2i j 2 k
k 2i k k j 2 jk k i
(7.2.16)
k i k i 2i k k j k j 2 jk
k 1
Rezultatul aplicrii funciei acf este o list ce conine lag=intervale unde este
MA. Dac funcia de autocorelaie dat de acf este nul pentru intervale
temporale de lungime k>q(sau cade n intervalul de ncredere cu ncrederea 95% n
jurul lui zero, tiprit pe grafic de funcia acf), atunci alegem modelul MA(q).
163
AR. Dac funcia de autocorelaie parial dat de acf este nul pentru
intervale temporale k>p(sau cade n intervalul de ncredere cu ncrederea 95% n
jurul lui zero, tiprit pe grafic de funcia acf), atunci alegem modelul AR(p).
Putem simula n R serii temporale de tip ARIMA(p,d,q) prin funcia arima.sim
care are forma:
arima.sim(model, n, rand.gen = rnorm, innov = rand.gen(n, ...),
n.start = NA, start.innov = rand.gen(n.start, ...),...)
Doar parametrii model i n sunt obligatorii, ceilali avnd valori implicite. Mai
jos simulm o serie AR(2) i i tiprimACF i PACF. Scriptul este:
s1<-arima.sim(model=list(ar=c(-.3,-.4)), n=10000)
par(mfrow=c(1,2))
acf(s1)
acf(s1, type="partial")
Partial ACF
0.6
0.2
-0.2
ACF
10
20
30
Series s1
1.0
Series s1
40
10
Lag
20
30
40
Lag
Fig. 7.5
Forma PACF sugereaz un model AR(2). Acum simulm un model MA(2) i
tiprim ACF+PACF:
s1<-arima.sim(model=list(ma=c(-.3,-.4)), n=10000)
par(mfrow=c(1,2))
acf(s1)
acf(s1, type="partial")
Rezultatul este:
Series s1
10
20
30
40
-0.1
-0.3 -0.2
Partial ACF
0.2
-0.2
ACF
0.6
0.0
1.0
Series s1
Lag
10
20
Lag
Fig. 7.6
Graficele sugereaz un model MA(2).
164
30
40
-0.1
0.1
0.3
Series s1
Partial ACF
ACF
Series s1
10
30
Lag
10
30
Lag
Fig. 7.7
> eacf(s1)
AR/MA
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0xxxxxoooooo o o o
1xxxxooooooo o o o
2xxoxxoooooo o o o
3xxxoooooooo o o o
4xxxxooxoooo o o o
5xxxoxoxoooo o o o
6xxxoxxoxooo o o o
7xxoxxxxxoxo o o o
Pe graficele ACF i PACF seria nu pare AR sau MA. EACF sugereaz un
model ARMA(2,2), ARMA(1.4) sau MA(6). Dac se ruleaz exemplul din nou se
obine alt figur dat de eacf din cauz c simularea produce alte valori pentru serie.
O alt metod de determinare a parametrilor p i q este de a propune toate
valorile posibile pentru p i q n intervalele [0, pmax] respectiv [0, qmax] ca n cazul
21
165
t p 1
(7.2.18)
L , , 2
2 n/2
r0 r1 ...rT 1 e
1
2
X j X j 2
j 1
r j1
(7.2.20)
166
Metoda "yule-walker" este metoda momentelor, "ols" este metoda celor mai
mici ptrate, iar "mle" este metoda verosimilitii maxime. Sunt calculate modelele
AR pn la ordinul order.max i se alege modelul cu aic minim. Seria de timp x poate
fi i multidimensional.
Rezultatul funciei ar este o list ce conine: order, ar, var.pred, x.mean,
sigma^2 estimated as
1.029
Call:
ar(x = s2, order.max = 5, method = "ols", AIC = T)
Coefficients:
1
2
0.3905 -0.2092
Intercept: -0.0003215 (0.03208)
Order selected 2
> m3
sigma^2 estimated as
1.027
Call:
ar(x = s2, order.max = 5, method = "mle", AIC = T)
Coefficients:
1
167
0.3901
-0.2089
Order selected 2
sigma^2 estimated as
1.026
Rezultatul este:
> model1
Call:
168
ma1
-0.3021
0.0279
ma2
0.4996
0.0243
intercept
-0.0040
0.0147
2. Testul rangului. Dac y1 , y 2 ,...y n sunt realizri ale unei serii i.i.d. atunci fie
P numrul de perechi (i,j) astfel ca i>j i y i y j . Pentru n mare P are o
repartiie aproximativ N m, 2 cu m
n n 1 2
, n n 12n 5 / 72
4
t
. Pentru n
t 1 n t
mare i y i v.a. iid, Q(h) are o repartiie aproximativ 2 cu h grade de
libertate.
h
169
90
3
In R exist funcia tsdiag care tiprete rezidualii standardizai (la varian 1),
calculeaz funcia de autocorelaie a rezidualilor i calculez testul Box (sau Ljung
Box) pn la un h dat. Forma funciei este:
tsdiag(object, gof.lag, ...)
unde object este o serie temporal modelat n R (deci are rezidualii calculai), gof.lag
este numrul maxim de pai h (vezi testul 3 (LjungBox) pn la care se calculeaz
Q(h).
In scriptul urmtor se simuleaz o serie ARMA(2,2) creia i se determin
parametrii cu funcia arima i apoi cu funcia tsdiag se studiaz dac modelul este
valid.
s1<-arima.sim(model=list(ma=c(-.3,.5),
ar=c(0.4,-0.2)),
n=10000)
model1<-arima(s1,order=c(2,0,2),method="ML")
tsdiag(model1)
4
2
0
-4 -2
StandardizedResiduals
4000
6000
8000
10000
-0.02
0.00
0.02
2000
10
20
30
40
10
20
30
40
0.4
0.8
0.0
P-values
ACFof Residuals
Fig. 7.8
Se vede c acf este suficient de mic pentru putea fi considerat zero, iar testul
LjungBox indic faptul c n general pentru aproape toi h p-valoarea testului este
170
suficient de mare pentru a admite c rezidualii sunt iid. Acum dac cercetm modelul
determinat gsim:
> model1
Call:
arima(x = s1, order = c(2, 0, 2), method = "ML")
Coefficients:
ar1
ar2
0.3831 -0.1976
s.e. 0.0289
0.0288
ma1
-0.2773
0.0258
ma2
0.5047
0.0239
intercept
0.0016
0.0152
aic =
Vedem c au fost estimai destul de bine coeficienii cu care s-a simulat seria
ARMA.
d. Predicii
unde cunoatem X t t 0,1,...T pentru valori t>T definim predicia X T h ca proiecia lui
X T h pe spaiul generat de X t t 0,1,...T . Aceast proiecie poate fi calculat innd
In funcie de tipul de obiect R (lm, ts, glm, , loess, nls, poly, princomp, spline) cruia i
se aplic funcia predict poate avea argumente diferite n partea ..... Pentru predicia
seriilor ARIMA object din funcia predict trebuie s fie un obiect rezultat al funciei
arima. Urmtorul script produce o predicie pentru 20 pai n avans pentru o seria
ARMA(2,2) simulat ca n exemplul de precedent.
s1<-arima.sim(model=list(ma=c(-.3,.5), ar=c(0.4,-0.2)), n=1000)
model1<-arima(s1,order=c(2,0,2),method="ML")
#tsdiag(model1)
p1<-predict(model1, n.ahead=50)
p1
plot(s1, main="Seria s1 de 1000 masuratori si predictia pentru 50
pasi", xlab="Timpul")
lines(p1$pred, col=5,lwd=3)
171
$pred
Time Series:
Start = 1001
End = 1050
Frequency = 1
[1] 0.30741965
[7] -0.05590263
[13] -0.05814027
[19] -0.05790182
[25] -0.05789656
[31] -0.05789666
[37] -0.05789666
[43] -0.05789666
[49] -0.05789666
$se
Time Series:
Start = 1001
End = 1050
Frequency = 1
[1] 0.9632667
[8] 1.0117388
[15] 1.0117514
[22] 1.0117514
[29] 1.0117514
[36] 1.0117514
[43] 1.0117514
[50] 1.0117514
-0.01205071
-0.06270560
-0.05800335
-0.05789466
-0.05789655
-0.05789666
-0.05789666
-0.05789666
-0.05789666
0.9663791
1.0117442
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
-0.15271697
-0.06009920
-0.05785878
-0.05789444
-0.05789666
-0.05789666
-0.05789666
-0.05789666
1.0064598
1.0117491
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
-0.10329277
-0.05718103
-0.05785189
-0.05789652
-0.05789669
-0.05789666
-0.05789666
-0.05789666
1.0089120
1.0117511
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
-0.04444154
-0.05699457
-0.05789317
-0.05789728
-0.05789667
-0.05789666
-0.05789666
-0.05789666
1.0107742
1.0117512
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
1.0116303
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
-0.03973509
-0.05781187
-0.05790899
-0.05789691
-0.05789666
-0.05789666
-0.05789666
-0.05789666
1.0116409
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
0
-3
-2
-1
s1
200
400
600
800
1000
Timpul
Fig. 7.9
Constatm c prediciile produse de model nu urmeaz variaiile seriei.
Aplicm aceeai tehnic de tratare pentru seria real de CO menionat la nceputul
seciunii de serii de timp obinem:
>co=read.table(file.choose())
>tsco<-ts(co, frequency=168)
> plot(tsco, main="CO intre 1 ian.2008 si 30. iun. 2008",
+xlab="Timpul in saptamani")
172
V1
10
15
20
40
60
80
Timpul in saptamani
Fig. 7.10
Facem graficul pentru ACF i PACF pentru a vedea ce model ar fi potrivit.
> acf(tsco)
0.0
0.2
0.4
ACF
0.6
0.8
V1
0.00
0.05
0.10
0.15
0.20
0.25
Lag
Fig. 7.11
Constatm c ACF nu se anuleaz deci nu poate fi un model MA
Calculm PACF:
> acf(tsco, type="partial")
Obinem:
0.6
0.4
0.2
-0.2 0.0
Partial ACF
0.8
Series tsco
0.00
0.05
0.10
0.15
0.20
Lag
Fig. 7.12
Figura sugereaz un model AR
173
0.25
Incercm i cu EACF:
> eacf(tsco, ar.max = 20, ma.max = 20)
Obinem:
AR/MA
0 1
0 x x
1 x x
2 x o
3 x o
4 x x
5 x x
6 x x
7 x x
8 x x
9 x x
10 x x
11 x x
12 x x
13 x x
14 x x
15 x x
16 x x
17 x x
18 x x
19 x o
20 x x
>
2
x
x
x
o
x
x
x
x
x
x
x
x
x
x
x
o
x
o
o
x
x
3
x
o
o
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
4
x
x
x
x
x
o
x
x
x
x
x
x
o
o
x
x
x
x
o
o
x
5
x
x
x
x
x
o
o
o
o
x
x
x
x
x
x
o
x
o
o
x
x
6
x
x
x
o
o
o
o
o
o
x
x
x
x
x
x
x
x
x
x
o
o
7
x
x
x
o
x
o
o
x
x
x
x
x
x
x
x
x
x
x
x
o
o
8
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
o
x
o
o
9
x
x
x
x
o
x
x
o
o
o
o
o
x
x
x
x
x
x
x
x
o
10
x
x
o
o
o
o
o
x
o
o
o
o
o
o
x
x
o
x
o
x
x
11
x
x
x
x
o
o
o
o
o
o
o
o
o
x
x
x
o
o
o
o
x
12
x
x
o
o
o
x
o
x
o
x
x
x
o
o
o
x
x
o
o
o
o
13
x
x
x
o
o
o
o
o
o
o
o
x
o
o
o
x
x
x
x
x
x
14
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
x
x
x
x
15
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
o
x
x
16
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
x
17
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
x
18
x
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
19
x
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
20
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
o
o
-20 0
20
40
60
80
-0.05 0.10
ACF of Residuals
P-values
10
20
30
40
10
20
30
40
0.0 0.6
Standardized Residuals
Obinem:
Fig. 7.13
ACF arat c exist corelaii semnificative ntre reziduali pentru diferene mari de
timp. Mergem totui mai departe. Predicia dat de model arat astfel:
174
p1=predict(m1,n.ahead=168)
plot(p1$pred, col=5,lwd=3, main="Predictii CO")
0.6
0.2
0.4
p1$pred
0.8
Predictii CO
79.2
79.4
79.6
79.8
80.0
Time
Fig. 7.14
Prediciile pentru CO nu mai urmresc variaiile constatate n modelul real. Se pare c
nu am gsit modelul potrivit de serie temporal.
In general aplicate la modele reale teoria nu se potrivete ntotdeauna cu realitatea. In
seciunea urmtoare prezentm o alt tehnic de analiz a seriilor de timp care s-a
dovedit mai bun pentru aceste date (CO).
175
Fig. 7.15
O uoar modificare a lui (7.2.233) introducnd o anumit ntrziere
este d N * conduce la
s n s n m 1d , s n m 2 d ...s n d , s n
24
(7.2.24)
Eckmann, J.P., D. Ruelle, 1985. Ergodic theory of chaos and strange attractors, Rev. Mod. Phys. 57,
pp. 617-656
25
Rainer Hegger, Holger Kantz, and Thomas Schreiber, 1999. Practical implementation of nonlinear
time series methods: The TISEAN package, Chaos 9,.pp. 413-435.
26
H. D. I. Abarbanel, Reggie Brown, John J. Sidorowich, and Lev Sh. Tsimring, 1993. The
analysis of observed chaotic data in physical systems, Rev M Phys, 65, pp. 1331-1392.
176
(7.2.25)
H p i , j d ln
p p
i, j
i
j
s n 1nT
s n k
1
s jk
card (U n ) s j U n
(7.2.26)
s n1 an s n bn
(7.2.27)
s j U n
a n s j bn
j 1
(7.2.28)
s fie minim. Suma este efectuat dup toi s j dintr- o mic vecintate U n a lui s n
dar destul de mare nct s conin suficiente puncte pentru a asigura ca problema
celor mai mici patrate (7.2.28) s fie nesingular. In lucrrile citate n pagina
anterioar se gsesc i alte metode de predicie.
Aa cum am mai menionat aceste metode au fost implementate de Rainer
Hegger, Holger Kantz i Thomas Schreiber n pachetul TISEAN care este disponibil
i n R. Pentru a putea fi folosit n R trebuie ca pachetul TISEAN cu executabilele s
fie dezarhivat ntr-un director. Pe urm trebuie instalat n R pachetul RTisean care
conine apeluri n stilul R pentru executabilele din TISEAN. La primul apel al unei
funcii din RTisean se cere directorul cu executabilele TISEAN. Informaii despre
funciile din pachet pot fi obinute prin ??RTisean. Acest pachet de analiz a seriilor
temporale a fost utilizat pe date de poluare obinute n municipiul Bucureti, n
177
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
CO
CO
CO
m=48, d=1
24
48
72
96
120
144
168
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
Time
24
48
72
96
CO measured
CO
CO
144
168
CO predicted
CO
m=100, d=8
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
48
168
b)
CO
m=100, d=1
24
144
CO predicted
a)
120
Time
CO measured
72
96
120
144
168
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
Time
CO measured
24
48
72
96
120
Time
CO predicted
CO measured
c)
CO predicted
d)
Fig. 7.16
Concentria de CO este nefiresc de bine estimat prin predicia 7.2.26 pentru o dimensiune de
scufundare m>=48. Contrar cu teoria, la o ntrziere d=1 predicia e mai bun dect pentru d=8, unde
este primul minim al informaiei mutuale empirice 7.2.25. Rutina TISEAN utilizat a fost lzo (n R se
numete lzo.test).
PM 2.5
m= 100, d= 1
30
40
35
25
30
25
20
CO
CO
35
15
20
15
10
10
0
0
24
48
72
96
12 0
14 4
16 8
24
48
72
Time
PM 2 .5 m e as ured
96
12 0
1 44
16 8
Time
P M 2 . 5 pred ict ed
P M 2. 5 m e as ured
a)
P M 2 . 5 pr ed ict ed
b)
Fig. 7.17
Prediciile pentru 168 de ore a polurii cu PM 2.5
27
Viorel Petrehus, Ileana Armeanu, Camelia Slave, Analysis of the Urban Air Pollution in Bucharest,
Proceedings BALCOR 2011, vol 2. pp 72-78
178
In momentul cnd s-au fcut predicii simultane (funcia s din (7.2.22) are
valori n R p , deci S are valori n R mp , pentru p poluani considerai simultan) am
constatat prin multe ncercri c prediciile nu devin mai bune. In figura urmtoare
vedem ce se ntmpl dac simultan lum CO i PM 2.5 n considerare. Datele
msurate pentru un an i jumtate sunt utilizate pentru a prezice poluarea pe o
sptmn.
PM 2.5
m=48, d=1
CO
CO
m=48, d=1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
35
30
25
PM20
15
10
5
0
0
24
48
72
96
120
144
168
CO measured
24
48
72
96
120
144
168
Time
Time
CO predicted
b)
a)
Fig. 7.18
Cele mai bune predicii simultane sunt obinute pentru d = 1 i sunt semnificative numai pentru un
interval de timp mai mic de 20 de ore
179
Bibliografie
**. The R Development Core Team, R: A Language and Environment for Statistical
Computing, 2011-12-13.
1. M. Allehard. A Tyny Handbook of R, Springer, 2011-12-13.
2. Y. Aragon. Sries Temporelles avec R. Mthodes et cas. Springer, 2011.
3. M. Dumitrescu, A. Bttorescu. Applied Statistic using the R System, Ed.
Universitii Bucureti, 2006.
4. J. D. Cryer, Kung-Sik Chan. Time Series Analysis, with Applications in R,
Springer, 2008.
5. J. Maindonald, W. J. Braun. Data Analysis and Graphics using R an ExampleBased Approach, Cambridge University Press, 2003
6. Murrell, P. (2005) R Graphics. Chapman & Hall/CRC Press.
7. A. Pun, M. Pun. Analiz Statistic folosind limbajul R, Editura Matrix Rom,
Bucureti, 2009.
8. V. Petrehu, S.A. Popescu, Probabiliti i Statistic, Universitatea Tehnic de
Construcii, Bucureti, 1997, civile.utcb.ro/cmat/cursrt/psvp.pdf.
9. D. Ruppert. Statistics and Data Analysis for Financial Engineering. Use R!
Springer, 2010.
10. G. Zbganu. Metode Matematice n Teoria Riscului i Actuariat, Editura
Universitii Bucureti, 2004.
180