Sunteți pe pagina 1din 181

INIIERE n R

Pentru persoane cu pregtire matematic




Maria Miroiu
Viorel Petrehu
Gheorghi Zbganu
1

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
2
http://cran.r-project.org/doc/html/interface98-paper/paper.html
3
http://www.fsf.org/
4
http://www.biostat.jhsph.edu/~rpeng/

2
surs (libertatea 1). Libertatea de a redistribui copiile pe care le avei oricui, aa
nct s i poi ajuta vecinul (libertatea 2); libertatea de a distribui oricui
mbuntirile fcute de tine.
Sigur c exist i dezavantaje. Nu exist garanie c nu s-a strecurat pe undeva
vreo greeal. Trebuie s tii matematic dac vrei s l foloseti n siguran. Nu este
prietenos, aa cum este de exemplu Excel-ul. Ca s poi folosi help-ul exist chiar o
instruciune help.search; nu are un help uor accesibil. Dar nici matematica nu este
uor accesibil, iar cartea aceasta este destinat unor cititori cu pregtire matematic
fie ei studeni la matematic, informatic, politehnic sau construcii
5
.
Cartea este intenionat a fi o iniiere n R. Sistemul R este imens exist deja
mai mult de 1000 de pachete. Noi vrem s prezentm doar pachetul de baz, acela
care se descarc de la CRAN (http://cran.r-project.org). Acesta este suficient pentru a
putea rula R i conine funciile fundamentale ale limbajului.
Utilizatorul poate fi descurajat de cantitatea imens de documentaie care
exist n legtur cu R. Numai editura Springer a publicat, ncepnd cu 2004, cteva
zeci de cri dedicate acestui limbaj, scrise pentru cititori cu pregtire matematic. O
list aproape complet se poate gsi la http://www.r-project.org/doc/bib/R-books.html
6
.
Cunosctorii apreciaz R-ul pentru facilitile sale grafice
7
.
Pentru un nceptor n R exist cel puin trei mari dificulti.
Prima este legat de sintax. O parantez greit pus, sau o parantez [.] n loc
de (.) sau de {.} poate face necazuri foarte mari. Mesajele de eroare sunt sibilinice.
A doua este legat de scripturi. Dup cum se va vedea, utilizatorul poate da
instruciunile ori n linie de comand, ori n pachete de instruciuni numite scripturi.
Un script este un fiier cu extensia .R. Ca s deschizi un script, ns trebuie s tii
unde e salvat. Un script nu este un program sau o singur subrutin, el poate s
conin mai multe asemenea programe. Pentru a-l rula, este suficient s l deschizi, s
caui paragraful care te intereseaz, s l selectezi i apoi s tastezi Ctrl+R. Se va
executa exact ceea ce doreti, dar asta se nva mai greu. Pe de alt parte, este bine ca
proiectele diferite s fie puse n directoare diferite, fiindc R pstreaz n memorie
variabilele ultimei sesiuni de lucru i probabilitatea de a da acelai nume unor
variabile diferite este foarte mare.
n fine, a treia dificultate este legat de introducerea datelor din fiiere.
nceptorul poate fi foarte frustrat ncercnd s copieze un tabel din Excel ntr-o
matrice din R: dac tabelul din Excel nu este o matrice de exemplu daca are celule
lsate necompletate atunci R d mesaje de eroare neinteligibile cum ar fi Error in
scan (file, what, nmax, sep, dec, quote, skip, nlines,
na.strings, : line 3 did not have 3 elements. Acelai lucru l putem
spune i despre salvarea n fiiere a rezultatelor obinute prin calcule: a transfera un
vector din R n Excel este o operaie care poate provoca mare frustrare utilizatorului
neavertizat, aa cum se va vedea la capitolul doi.

5
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.
3
Odat depite aceste dificulti inerente nceputului, apar i satisfaciile. De
exemplu a gsi minimul, maximul, mediana unui ir de date, ai face histograma, a-l
sorta devin o joac de copii.
n primele patru capitole se prezint principalele posibiliti de utilizare a
mediului R n regim de comand. n capitolul al cincilea se prezint posibilitile de
programare n R, iar n capitolul al aselea sunt prezentate aplicaii programate n R
din diverse domenii care au legtur cu statistica. n ultimul capitol se prezint teste
statistice i serii de timp.
Maria Miroiu a scris capitolele 1,2 i 7.1; Viorel Petrehu a scris capitolele
3,4,5 i 7.2 iar Gheorghi Zbganu a scris capitolul 6.
Variantele de R utilizate au fost: 2.12 i 2.14.
Accentum: cartea se adreseaz utilizatorilor nceptori ai sistemului R, dar
care au o minim pregtire n matematic, ndeosebi n domeniul statisticii. Se
presupune c exist la cititor o oarecare familiaritate cu termenii de variabil
aleatoare, repartiie, test statisctic. Este important s accentum ns c sistemul R
poate fi utilizat n mai multe domenii ale matematicii aplicate, nu numai n statistic,
de exemplu pentru rezolvarea ecuaiilor i sistemelor de ecuaii difereniale.
n final avem de adugat urmtoarele: cartea a fost elaborat n cadrul
proiectului POSDRU/56/1.2/S/32768, Formarea cadrelor didactice universitare i a
studenilor n domeniul utilizrii unor instrumente moderne de predare-nvare-
evaluare pentru disciplinele matematice, n vederea crerii de competene performante
i practice pentru piaa muncii.
Finanat din Fondul Social European i implementat de ctre Ministerul Educaiei,
Cercetrii, Tineretului i Sportului, n colaborare cu The Red Point, Oameni i
Companii, Universitatea din Bucureti, Universitatea Tehnic de Construcii din
Bucureti, Universitatea Politehnica din Bucureti, Universitatea din Piteti,
Universitatea Tehnic Gheorghe Asachi din Iai, Universitatea de Vest din
Timioara, Universitatea Dunrea de Jos din Galai, Universitatea Tehnic din Cluj-
Napoca, Universitatea 1 Decembrie 1918 din Alba-Iulia, proiectul contribuie n
mod direct la realizarea obiectivului general al Programului Operaional Sectorial de
Dezvoltare a Resurselor Umane POSDRU i se nscrie n domeniul major de
intervenie 1.2 Calitate n nvmntul superior.
Proiectul are ca obiectiv adaptarea programelor de studii ale disciplinelor
matematice la cerinele pieei muncii i crearea de mecanisme i instrumente de
extindere a oportunitilor de nvare.
Obiectivele de interes ale proiectului sunt evaluarea nevoilor educaionale ale
cadrelor didactice i studenilor legate de utilizarea matematicii n nvmntul
superior, masterate i doctorate precum i analizarea eficacitii i relevanei
curriculelor actuale la nivel de performan i eficien, n vederea dezvoltrii de
cunotine i competene pentru studenii care nva discipline matematice n
universiti. Obiectivele specifice la care rspunde materialul de fa sunt: dezvoltarea
i armonizarea curriculelor disciplinelor matematice, conform exigenelor moderne;
elaborarea i implementarea unui program de formare a cadrelor didactice i a
studenilor interesai din universitile partenere, bazat pe dezvoltarea i armonizarea
de curriculum; crearea unei baze de resurse inovative i funcionale pentru predarea i
nvarea n disciplinele matematice pentru nvmntul universitar. sunt obiectivele
specifice care au ca raspuns materialul de fa.
4
Formarea de competene cheie de matematic i informatic presupune crearea de
abiliti de care fiecare individ are nevoie pentru dezvoltarea personal, incluziune
social i inserie pe piaa muncii. Se poate constata ns c programele disciplinelor
de matematic nu au ntotdeauna n vedere identificarea i sprijinirea elevilor i
studenilor potenial talentai la matematic.
n acest context, analiza flexibilitii curriculei, nsoit de analiza metodelor i
instrumentelor folosite pentru identificarea i motivarea studenilor talentai la
matematic ar putea rspunde deopotriv cerinelor de mas, ct i celor de elit.
Viziunea pe termen lung a acestui proiect preconizeaz determinarea unor
schimbri n abordarea fenomenului matematic pe mai multe planuri: informarea unui
numr ct mai mare de membri ai societii n legtur cu rolul i locul matematicii n
educaia de baz n instrucie i n descoperirile tiinifice menite s mbunteasc
calitatea vieii, inclusiv popularizarea unor mari descoperiri tehnice, i nu numai, n
care matematica cea mai avansat a jucat un rol hotrtor. De asemenea, se urmrete
evidenierea a noi motivaii solide pentru nvarea i studiul matematicii la nivelele
de baz i la nivel de performan; stimularea creativitii i formarea la viitorii
cercettori matematicieni a unei atitudini deschise fa de nsuirea aspectelor
specifice din alte tiine, n scopul participrii cu succes n echipe mixte de cercetare
sau a abordrii unei cercetri inter i multi disciplinare; identificarea unor forme de
pregtire adecvat de matematic pentru viitorii studeni ai disciplinelor matematice,
n scopul utilizrii la nivel de performan a aparatului matematic n construirea unei
cariere profesionale.

5



CUPRINS


Introducere 1

Cap.1 Preliminarii 5

Cap.2 Tipuri de date 10

Cap.3 Funcii predefinite n R 30

Cap.4 Funcii grafice n R 52

Cap.5 Programare n R 64

Cap.6 Aplicaii diverse programate n R 77

Cap.7 Aplicaii rezolvate prin funcii predefinite n R

7.1 Teste statistice 122

7.2 Serii de timp 151

Bibliografie 179








/R
6
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.
7
R dispune de un mecanism de rechemare a comenzilor executate n linia de
comand n fereastra RConsole. Prin apsarea tastei de deplasare pe vertical n sus
(), se pot obine comenzile scrise anterior. Acestea pot fi reexecutate sau modificate
i apoi executate.

Toate datele citite sau salvate prin comenzi R sunt asociate cu directorul
curent care poate fi schimbat prin File Change dir... la calea dorit de utilizator.

Directorul curent (de lucru) poate fi aflat prin comanda getwd() i poate fi
fixat i prin comanda setwd("directorul de lucru dorit").


R dispune de funcii care permit obinerea rapid de informaii referitoare la
funciile i facilitile sistemului R instalat pe calculatorul propriu. Pentru a obine
informaii despre facilitile oferite de functia help(), din R se execut comanda
> help.start()
Se va lansa o pagin web cu o serie link-uri care permit accesarea informaiilor legate
de sistemul R.
Pentru a obine informaii despre o anumit funcie R, de exemplu plot, se
execut comanda
> help(plot)
sau comanda alternativ
> ?plot
Aceasta va deschide un Web browser cu o pagin n care se afieaz informaii
referitoare la funcia plot.
Pentru funciile specificate prin cuvinte cheie, ca de exemplu, if, while,
function, argumentele trebuie incluse ntre ghilimele:
> help("while")
Pentru a afia fiiere, titluri, obiecte, etc. ce conin un anumit ir de caractere,
se folosete comanda
> help.search(ir de caractere, .)
De exemplu:
> help.search("poisson")
sau echivalent
> ??poisson
conduce la afiarea urmtoarelor rezultate
Help files with alias or concept or title matching
poisson using fuzzy matching:
boot::poisons Animal Survival Times
stats::family Family Objects for Models
stats::Poisson The Poisson Distribution
stats::poisson.test Exact Poisson tests


8
Dac dorim s ncrcm un anumit pachet de programe R, mai nti trebuie
descrcat n subdirectorul library al directorului R (de exemplu n: C:\Program
Files\R\R-2.13.0\library). Pentru ncrcarea de exemplu a pachetului graphics (the R
graphics package), putem folosi funcia
> library(graphics)
Dac dorim s aflm informaii despre un anumit pachet de programe, de exemplu
utils (the R Utils package)
> library(help="utils").
Pentru vedea ce pachete de programe R sunt disponibile n versiunea curent R, se
poate folosi funcia
> library()
De exemplu, pahetele disponibile n versiunea RR-2.13.0 sunt:
base The R Base Package
boot Bootstrap R (S-Plus) Functions (Canty)
class Functions for Classification
cluster Cluster Analysis Extended Rousseeuw et al.
codetools Code Analysis Tools for R
compiler The R Compiler Package
datasets The R Datasets Package
foreign Read Data Stored by Minitab, S, SAS, SPSS,
Stata, Systat, dBase, ...
graphics The R Graphics Package
grDevices The R Graphics Devices and Support for Colours
and Fonts
grid The Grid Graphics Package
KernSmooth Functions for kernel smoothing for Wand &
Jones (1995)
lattice Lattice Graphics
MASS Support Functions and Datasets for Venables
and Ripley's MASS
Matrix Sparse and Dense Matrix Classes and Methods
methods Formal Methods and Classes
mgcv GAMs with GCV/AIC/REML smoothness estimation
and GAMMs by PQL
nlme Linear and Nonlinear Mixed Effects Models
nnet Feed-forward Neural Networks and Multinomial
Log-Linear Models
rpart Recursive Partitioning
spatial Functions for Kriging and Point Pattern
Analysis
splines Regression Spline Functions and Classes
stats The R Stats Package
stats4 Statistical Functions using S4 Classes
survival Survival analysis, including penalised
likelihood.
Tcltk Tcl/Tk Interface
tools Tools for Package Development
utils The R Utils Package


9
Pentru a vizualiza example referitoare la anumite funcii R, de exemplu pentru
funcia mean, se poate proceda astfel:
> example(mean)
iar rspunsul sistemului este urmtorul:
mean> x <- c(0:10, 50)
mean> xm <- mean(x)
mean> c(xm, mean(x, trim = 0.10))
[1] 8.75 5.50
mean> mean(USArrests, trim = 0.2)
Murder Assault UrbanPop Rape
7.42 167.60 66.20 20.16


Odat cu lansarea R-ul se deschide o nou sesiune R. Ieirea din sesiunea R se
poate face utiliznd comanda:
> q()
sau echivalent
> quit()
Pe ecran va apare o ntrebare referitoare la memorarea sesiunii de lucru (instruciuni
lansate la linia de comand, obiecte cu care s-a operat, etc.) care se poate salva ntr-un
fiier i redeschide mai trziu sau se poate renuna definitiv la aceasta.

Dac se dorete salvarea spaiului de lucru (ce cuprinde toate variabilele create
n R), ntr-un fiier anume se poate folosi comanda save. S presupunem de exemplu
c ntr-o nou sesiune R, n spaiul de lucru, printre altele, avem i variabila x:
> 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
Funcia save este echivalent cu saveimage.
S mai precizm c R este case sensitive i deci x i X sunt interpretate ca
simboluri diferite i se vor referi la variabile diferite.
De asemenea, s precizm c orice ir de caractere precedat de simbolul #
este interpretat ca fiind un comentariu.

La redeschiderea unei noi sesiuni R se poate proceda n modul urmtor:
> load("c:/lucru/date.RData")
> #se incarca obiectele din fisierul date
> x #se afiseaza valoarea variabilei x
[1] 2 #raspunsul sistemului
n mod similar, exectnd dublu click pe fiierul date.Rdate, se realizeaz
deschiderea unei noi sesiuni R i apoi ncrcarea fiierului date.Rdate. De
asemenea, salvarea spaiului de lucru curent se poate realiza prin meniul File Save
Workspace ..., respectiv ncrcarea unui fiier Rdate se poate realiza prin meniul File
Load Workspace ...
10
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

Dac o comand nu este complet la sfritul unei linii de la prompt-ul >, R va
lansa un nou prompt, de obicei simbolul + n linia sau liniile urmtoare. Acest
simbol dispare cnd comanda este complet. De exemplu:
> x=4
> y=6
> z=x*
+ y
> z
[1] 24


Istoria comenzilor introduse la prompt n Rconsole ntr-o sesiune de lucru R
poate fi salvata, iar apoi rencrcat folosind comenzile savehistory i
loadhistory, care se regsesc i n meniu: File Save History..., respectiv File
Load History.... Fiierele n care se salveaz / de unde se ncarc comenzile au
extensia .Rhistory.


Pentru alte comenzi / funcii R de baz se poate consulta help-ul Pachetul R
Utils:
> library(help="utils")


11
Capitolul 2
Tipuri de date



Entitile cu care opereaz R pentru a memora i a lucra cu date se numesc
tipuri de date sau obiecte. Acestea pot fi: scalari, vectori, matrice, liste, tablouri,
iruri de caractere, factori, dataframe-urile, etc. De asemenea, se pot defini tipuri noi
de obiecte.
Funcia typeof(obiect) sau echivalent mode(obiect) pot fi folosite
pentru a afla tipul atributelor intriseci ale unui obiect. Cteva dintre cele mai des
folosite tipuri de obiecte: "numeric" (ntreg="integer" sau real="double"),
"complex", "logical" (logic), "character" (caracter) sau "raw" (vector de
bii, fiecare component a acestuia fiind reprezentat separat ca pereche de cifre
hexazecimale). De exemplu:
> x=3.2 > s="unu" > s="sir"
> typeof(x) > typeof(x) > b=charToRaw(s);b
[1] "numeric" [1] "character" [1] 73 69 72
> typeof(b)
> x=1+2i > e=1<3 [1] "raw"
> typeof(x) > typeof(e)
[1] "complex" [1] "logical"
Accesul la obiecte se face prin intermediul unor simboluri numite variabile. n
R, variabilele sunt ele nsele obiecte i pot fi manipulate n acelai mod ca i obiectele.
Numele variabilele din R ncep cu o liter, apoi pot conine litere, cifre, . sau _.
Pentru a atribui o valoare unei variabile se poate folosi operatorul de
atribuire (= sau < sau <<- sau -> sau ->>) sau se poate folosi funcia
assign din pachetul de programe R base:
> variabila = valoare
> variabila <- valoare
> variabila <<- valoare
> valoare -> variabila
> valoare ->> variabila
> assign("variabila,valoare)
Se observ faptul c dup atribuire, rezultatul nu este afiat automat.
Afiarea valorii unei variabile se face explicit, prin apelarea numelui
variabilei sau prin folosirea funciei print. De exemplu:
> x=1.5
> x
[1] 1.5
> print(x)
[1] 1.5
La afiarea valorilor variabilelor se poate folosi funcia options(nume=valoare)
pentru a stabili diverse opiuni. De exemplu, pentru a stabili numrul de zecimale la 2
se apeleaz nainte de afiare: options(digits=2). Valorile valide sunt 1..22 cu
valoarea implicit 7. ns acest numr de zecimale este doar sugestie. De exemplu:
> options(digits=5)
> x=1.3
12
> 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
Pentru a genera 14 numere aleatoare distribuite uniform n intervalul (0,1) se poate
folosi comanda:
> runif(n=14, min=0, max=1)
[1] 0.70871023 0.39347162 0.51954422 0.23446865 0.38287326 0.26328696
[7] 0.56719362 0.82779636 0.01660613 0.49667370 0.20340420 0.96901185
[13] 0.25215480 0.94807566

Operatorii binari cu care poate lucra R sunt:

Operaia matematic Simbolul R Expresia R
Adunarea x+y
+ x+y
Scderea xy
x-y
nmulirea xy
* x*y
mprirea x / y
/ x/y
Exponeniala x
y
^ x^y
Ctul ntreg al mpririi lui x la y: [x/y]
%/% x%/%y
Restul mpririi lui x la y = x - y * [x / y]
%% x%%y
Expresia matematic se evalueaz de la stnga la dreapta, innd cont de i ordinul de
prioritate:
Ordinul de prioritate
1 Paranteza
2 Exponeniala
3 nmulirea, mprirea, ctul, restul
4 Adunarea i scderea

Operatorii %% i %/% pot fi folosii i pentru operatori nentregi. De exemplu:
> 10.2%/%1.2
[1] 8
> 10.2%%1.2
[1] 0.6
13
n R exist constante speciale precum: Inf (ce ine locul lui infinit ), NaN (not-a-
number, 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)
Pentru vizualizarea unei componente, de exemplu a doua, se poate face astfel:
> u[2]
[1] 2
Funcia de concatenare se poate folosi i pentru a construi vectori de
dimensiune mai mare prin concatenarea mai multor vectori de dimensiuni mai mici. n
exemplul urmtor s-a creat un vector numeric, x
1
, un vector x
2
cu elementele de tip ir
de caractere i s-au combinat cei doi vectori n unul singur, x
3
. Vectorul x
3
trebuie s
aib componentele de acelai tip i tipul este ir de caractere. Regula de conversie a
datelor este logice => numere => caractere.
> x1=c(1,2,3) #vector numeric
> x2=c("unu","doi") #vector de siruri
> x3=c(x1,x2); x3 #concatenarea celor doi vectori
[1] "1" "2" "3" "unu" "doi" #conversie la siruri
14
Limbajul R permite efectuarea interactiv a diferitor operaii cu vectori
numerici, precum adunarea (+), scderea (-), nmulirea(*), mprirea (/) i ridicarea
la putere (^). De exemplu, pentru vectorii x = (2 4 6) i y=(1 2 3) avem:
> x=c(2,4,6)
> y=c(1,2,3)
> x+y
[1] 3 6 9
> x-y
[1] 1 2 3
> 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

Un operator special este %*% care aplicat unor vectori conduce la
determinarea produsului scalar, ca n exemplul de mai jos:
> x=c(2,4,6)
> y=c(1,2,3)
> x%*%y #produsul scalar a vectorilor x si y
[,1]
[1,] 28
R dispune de o serie de faciliti pentru generarea secvenelor de numere,
organizate ca numere sau matrice. De exemplu, pentru a genera secvena de numere
consecutive de la 1 la 5 i memorarea acesteia n vectorul u se poate proceda astfel:
> u=1:5; u
[1] 1 2 3 4 5
n mod similar, pentru se poate genera secvena de numere consecutive de la 5 la 1 i
apoi memorarea acesteia n vectorul v folosind instruciunea
> v=5:1; v
[1] 5 4 3 2 1
Generarea de numere se poate face i cu funcia seq(from,to,by). Primele dou
argumente specific valorile de nceput (from) i sfrit (to) ale secvenei, iar ultimul
argument (by) reprezint pasul. De exemplu:
> v1=seq(3,5) #sau v1=seq(from=3,to=5)
[1] 3 4 5
> v2=seq(from=1, to=2, by=0.2); v2
[1] 1.0 1.2 1.4 1.6 1.8 2.0
> seq(4,16,length=6)
[1] 4.0 5.2 6.4 7.6 8.8 10.0
O funcie nrudit cu seq() este rep(). Aceasta se utilizeaz pentru a replica
un obiect n diferite moduri.
> x=c(1,2,3)
> x1=rep(x, times=2); x1 #x se repeta de 2 ori
[1] 1 2 3 1 2 3
> x2=rep(x, each=2); x2
#fiecare componenta a lui x se va repeta de 2 ori
[1] 1 1 2 2 3 3
> rep(1:3,c(2,4,6))
[1] 1 1 2 2 2 2 3 3 3 3 3 3
#prima componenta s-a multiplicat de ori, a doua de 4 ori etc
15
>rep(0,10)
[1] 0 0 0 0 0 0 0 0 0 0
Este important s putem identifica anumite iruri de numere. Operatorul
%in% care testeaz existena unei secvene ntr-un vector de numere este deosebit
de util n acest scop. De exemplu:
> x=rep(1:3,rep(2,3)); x
[1] 1 1 2 2 3 3
> x[x %in% c(1,3)]
#se testeaz existena valorilor 1 i 3
[1] 1 1 3 3
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

Elementele unui vector logic sunt succesiuni de TRUE (adevrat), FALSE
(fals) i NA (not available). Deseori, TRUE se abreviaz cu T, iar FALSE cu F, dar
este posibil ca variantele abreviate s fie variabile deja definite.
Vectorii logici sunt generai atunci cnd se impun anumite condiii. De
exemplu, dac punem condiia ca elementele vectorului v = (2 1 5) s fie pozitive,
putem genera vectorul logic (TRUE, FALSE, TRUE) cu secvena de instruciuni:
> v=c(2,-1,5); v
[1] 2 -1 5
> y=v>0
> y
[1] TRUE FALSE TRUE
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

Vectorii de tip caracter sunt secvene de caractere delimitate de ghilimele.
Acetia pot fi concatenai utiliznd funcia c(). De asemenea, vectorii de tip caracter
pot fi concatenai folosind funcia paste(), care accept un numr arbitrar de
argumente pe care le concateneaz unul cte unul, separndu-le printr-un caracter
blank. Orice numr este transformat n caracter.

16
> 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 strsplit se poate folosi pentru extragerea unor caractere dintr-un
vector utilizat ca argument. De exemplu, pentru eliminarea caracterului a din irul
Transilvania se poate proceda astfel
> strsplit("Transilvania","a")
[[1]]
[1] "Tr" "nsilv" "ni"
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"


2.3. Matrice i tablouri de numere

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.
17

Funciile cbind i cbind se pot aplica i la matrice. De exemplu:
> 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
18
Se observ c din elementele vectorului y
3
se formeaz coloanele matricii m
3
.
Numrul de elemente ale primului parametru trebuie s fie multiplu sau submultiplu
al lui nrow*ncol. n cazul n care este submultiplu, valorile vor fi ciclate pn cnd
toate valorile sunt completate. De exemplu:
> m=matrix(1:6, nrow=4, ncol=3); m
> #completare pe coloane
[,1] [,2] [,3]
[1,] 1 5 3
[2,] 2 6 4
[3,] 3 1 5
[4,] 4 2 6
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 #x este vector
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> dim(x)=c(4,3); x #x este matrice
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
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
19
> m[,1] #sau m[1:2,1] (coloana 1)
[1] 1 2
> m[,2:3] #coloanele 2 si 3
[,1] [,2]
[1,] 3 5
[2,] 4 6
Pentru a prezenta operaiile cu matrice, s considerm nti matricele
A=
|
|
|
.
|

\
|
0 6
10 1
4 2
i B=
|
|
|
.
|

\
|
2 1
5 8
6 4
:
> 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]
[1,] 6 10
[2,] 9 15
[3,] 7 2
> A-B
[,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
20
De observat c nmulirea matricelor folosind operatorul * nu este nmulirea clasic
ci nmulirea element cu element. Analog, folosirea operatorului /, respectiv ^
conduce la construirea unei matrice n care fiecare element este de tipul a
ij
/ b
ij
,
respectiv a
ij
^ b
ij
.
Pentru nmulirea clasic a dou matrice se folosete operatorul %*% aplicat
unor matrice de dimensiuni corespunztoare.
> C=matrix(c(2,4,1,10),ncol=2,byrow=TRUE); C
[,1] [,2]
[1,] 2 4
[2,] 1 10
> D=matrix(c(4,6,8,5),ncol=2,byrow=TRUE); D
[,1] [,2]
[1,] 4 6
[2,] 8 5
> C%*%D #inmultirea clasica dintre doua matrice
[,1] [,2]
[1,] 40 32
[2,] 84 56
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 #vector
[1] 1 2
> A=matrix(1:4,c(2,2)); A #matrice
[,1] [,2]
[1,] 1 3
[2,] 2 4
> x%*%A
[,1] [,2]
[1,] 5 11
> A%*%x
[,1]
[1,] 7
[2,] 10
Pentru determina transpusa unei matrice se poate folosi funcia t:
> A=matrix(c(2,4,1,10,6,0),ncol=2,byrow=TRUE); A
> A
[,1] [,2]
[1,] 2 4
[2,] 1 10
[3,] 6 0
> t(A) # transpusa matricei A
[,1] [,2] [,3]
[1,] 2 1 6
[2,] 4 10 0
Pentru a determina inversa unei matrice se poate folosi funcia solve:
> M=matrix(c(1,2,3,4),ncol=2,byrow=TRUE); M
[,1] [,2]
[1,] 1 2
[2,] 3 4
) 11 5 (
4 2
3 1
) 2 1 ( =
|
|
.
|

\
|

|
|
.
|

\
|
=
|
|
.
|

\
|

|
|
.
|

\
|
10
7
2
1
4 2
3 1

21
> 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.4. Tablouri numerice


Tablourile de numere (arays) sunt generalizri ale matricelor la dimensiuni
mai mari sau egale cu doi. O matrice este un array de dimensiune doi.
Crearea unui tablou de numere se poate face utiliznd funcia
array(elemente,dimensiuni). De exemplu:
> m5=array(1:12, dim=c(2,3,2))
> m5
, , 1

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

, , 2

[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
O alt modalitate de a crea tablouri multidimensionale, este de a utiliza funcia
dim ca n exemplul de mai jos:
> x=1:8
> dim(x)=c(2,2,2)
> x
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4

, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
Astfel, vectorul x a fost transformat n tablou de dimensiuni 222.
Tablourile pot fi utilizate n diferite operaii aritmetice, multe dintre acestea
fiind similare celor descrise pentru matrice. Se pot efectua de asemenea operaii ntre
tablouri numerice i alte obiecte R precum ar fi vectorii i matricele. De exemplu:
22
> 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,] 1 3
[2,] 2 4
> t2
, , 1
[,1] [,2]
[1,] 5 7
[2,] 6 8

, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
> t1*t2
, , 1
[,1] [,2]
[1,] 5 21
[2,] 12 32

, , 2
[,1] [,2]
[1,] 5 21
[2,] 12 32
> t1%*%t2 #suma_k suma_i,j t1[i,j]*t2[i,j]
[,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,*)
De remarcat c produsul definit de simbolul %*% (nmulirea clasic dintre matrice)
este diferit de produsul reprezentat prin simbolul %o%.
Funcia aperm() poate fi utilizat pentru a permuta dimensiunile unui tablou
numeric. Al doilea argument este o permutare de numere ntregi {1, 2,..., k}, unde k
este numrul de indici al tabloului numeric. Rezultatul acestei funcii este un tablou
numeric de aceeai dimensiuni cu dimensiunile, respectiv datele permutate conform
23
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] [,3]
[1,] 7 9 11
[2,] 8 10 12

> B = aperm(A,c(2,1,3))
> B
, , 1
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6

, , 2
[,1] [,2]
[1,] 7 8
[2,] 9 10
[3,] 11 12
n cazul particular al unei matrice A, instruciunea B=aperm(A,c(2,1)) este
echivalent cu instruciunea B=t(A) i determin transpusa matricei A.


2.5. Factori

Conceptual, factorii n R sunt variabile care iau un numr limitat de valori
diferite. Acetia sunt reprezentani intern ca valori ntregi 1, 2,..., k, unde k este
numrul de niveluri. Variabilele de tip numeric sau cele de tip caracter pot fi
convertite n factori. Nivelurile de factori sunt ntotdeauna iruri de caractere. Factorii
pot fi utilizai pentru sortarea elementelor vectorului, ct i pentru ordonarea dup o
anumit funcie de distribuie.
Pentru crearea unui obiect de tip factor se folosete funcia factor. S
considerm un exemplu n care avem 10 studeni cazai la un cmin studentesc,
acetia fiind identificai prin identificatorul judeului din care provin:
> orase=c("VL","DB","VL","AG","OT","SB","DB","VL","AG","AG")
> orase
[1] "VL" "DB" "VL" "AG" "OT" "SB" "DB" "VL" "AG" "AG"
> orasef=factor(orase) #generarea obiectului factor
> orasef
[1] VL DB VL AG OT SB DB VL AG AG
Levels: AG DB OT SB VL
> levels(orasef) #lista judetelor in ordine alfabetica
[1] "AG" "DB" "OT" "SB" "VL"
24
Ordonarea irurilor de caractere n ordine alfabetic se poate face i cu funcia sort:
> sort(orasef)
[1] AG AG AG DB DB OT SB VL VL VL
Levels: AG DB OT SB VL
Continund aplicaia anterioar, s presupunem c mai tim mediile generale
de admitere, respectiv mediile de pe anul universitar anterior:
> medii = c(7.9,9,8.5,7.7,8.6,9.3,7.3,9.5,8.8,9.2)
S presupunem c dorim s tim media general medie i erorile standard
corespunztoare fiecrui ora n parte. Pentru ceasta putem folosi funcia tapply:
> media_medie=tapply(medii,orasef,mean)
> media_medie
AG DB OT SB VL
8.566667 8.150000 8.600000 9.300000 8.633333
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
Valorile NA corespund cazului n care calculul erorii standard nu a fost posibil,
deoarece numrul studenilor a fost mai mic sau egal cu 1.
Factorii ordonai se obin practic prin ordonarea nivelurilor. Pentru a crea un
factor ordonat sau pentru a ordona un factor existent se poate utiliza funcia ordered.
Nivelurile unui factor ordonat specific poziia acestora pe o scar ordinar. Pe lng
factorii ordonai, mai exist i factorii de contrast.


2.6. Data frame

Data frame este o colecie de date organizate ntr-un tablou dreptunghiular
n care pe fiecare coloan sunt date de acelai tip. Un exemplu este tabelul urmtor:

Nume Analiz Algebr
Popescu Nicolae 8 6
Stan Ion 7 7
Vasile Anca 9 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) #creare data frame
> df1

25
c1 c2
1 a 1
2 b 2
3 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 coincide cu numele vectorilor, iar liniile au numele 1, 2, 3, ...
Putem schimba aceste nume ca n secvena de mai jos:
> rownames(df1)=c("linia.1","linia.2","linia.3")
> colnames(df1)=c("unu","doi")
> df1
unu doi
linia.1 a 1
linia.2 b 2
linia.3 c 3
Numele liniilor,
coloanelor ca i
valorile 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
n procesul de editare am schimbat numele liniilor.
Se pot crea matrice sau data frames cu ajutorul editorului ncorporat prin
instruciunile
> df2=edit(data.frame())
> m5=edit(matrix())
Valorile pentru df2 i m5 vor fi cele completate n editor.
26
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
O variabil de tip data.frame este de fapt un tabel. Poate fi gndit ca o matrice
care are un cap de tabel n care i liniile i coloanele au denumiri. Liniile sunt
considerate nivele, iar coloanele sunt vectori de acelai tip care poarta un nume.

Datele data frame pot fi introduse n R i din fiiere text exterioare prin
comanda read.table. Datele n fiier trebuie s umple o zon dreptunghiular.
Fiierul text cu date poate fi copiat n clipboard, poate fi pe un suport de memorie,
ntr-o locaie de internet. Din mulimea de parametri ai instruciunii read.table este
important de reinut: numele fiierului, sep=semnul separator ntre date, header care
poate fi TRUE dac primul rnd este citit ca nume ale variabilelor, altfel FALSE, dec
ce indic semnul separator pentru zecimale (implicit). Liniile vide ca i cele care
ncep cu semnul # sunt ignorate. Datele citite sunt interpretate ca data frame. O
comand asemntoare este read.csv. n acest caz fiierul trebuie s fie un fiier
text cu datele separate prin virgul.




27
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
Pentru a vedea ce tip de dat este t apelm funcia class:
> class(t)
[1] "data.frame"
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
Funcia file.choose deschide o fereastr de dialog pentru alegerea fiierului. Dac
se pune numele fiierului atunci fiierul trebuie s fie n directorul curent sau s fie
indicat cu cale cu tot. n rezumat avem:
t=read.table(clipboard)
#pentru citirea din clipboard
t=read.table(file.choose())
#citire dintr-un fiier text
t=read.table(numele.fiierului)
#citire dintr-un fiier aflat n directorul curent
t=read.table(http://adresa.web/fisier.txt)
#citire fiier de pe internet.
Pentru a scrie un obiect data frame ntr-un fiier se folosete instruciunea
write.table sau write.csv care au cam aceeai parametri ca read.table. De
exemplu prin instruciunea
28
> write.table(t, file="t.txt")
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
date ce se citesc (dac lipsete sau nu e pozitiv atunci se citete pn la sfritul
siierului), n are aceeai semnificaie doar c se ignor valorile invalide, sep este
separatorul de date (dac lipsete se presupune c datele sunt separate prin spaii), dec
este separatorul pentru zecimale n numerele reale (implicit), skip reprezint numrul
de linii de la nceput care sunt ignorate, nlines este numrul maxim de linii care se
citesc.

R include i un numr de baze de date care se pot folosi n diverse aplicaii.
Aceste bazele de date sunt de fapt data frame-uri.
Pentru a vizualiza toate bazele de date disponibile, se poate folosi funcia
data:
> data()
i se va deschide o fereastr n care sunt enumerate toate bazele de date disponibile.
Pentru a afla informaii suplimentare despre o anume baz de date, se poate apela
help-ul sistemului R:
> ?cars
Se va deschide o fereastra web n care se specific faltul c baza de date conine 50 de
observaii luate din anul 1920, iar viteza este numeric i msurat n mph, iar
disctana este de asemenea numeric, msurat in ft.
Pentru a accesa una dintre aceste baze de date, se poate scrie data(numele
bazei de date). De exemplu, pentru a accesa baza de date cars care conine vitezele i
distanele de oprire ale unor maini putem proceda astfel:
> data(cars)
> cars[1:5,] #primele 5 rnduri ale bazei de date
speed dist #coloanele bazei de date
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
29
Dac se dorete manipularea pe caracteristici, atunci se poate folosi vectorul
cars[,1] ce ne d toate vitezele msurate sau vectorul cars[,2] ce ne d toate distanele
disponibile.
O alt modalitate de a lucra cu o baz de date este de a folosi funcia attach:
> attach(cars)
> names(cars) #numele coloanelor bazei de date
[1] "speed" "dist"
> mean(speed) #media datelor din prima coloanei
[1] 15.4
> mean(cars[,1]) #o varianta echivalenta
[1] 15.4
> mean(cars$speed) #a doua varianta echivalenta
[1] 15.4


2.7. Liste

Lista este o colecie de obiecte R care pot fi de tipuri diferite i de mrimi
diferite. Crearea unei liste se face simplu prin funcia list urmat ntre paranteze de
numele obiectelor ce o compun. S presupunem c exist o familie cu numele tatlui
Ion, numele mamei Maria, iar numele copiilor sunt: Andrei (4 ani),
Alexandra (7 ani) i Bogdan (9 ani).
> lista1=list(sot="Ion",sotie="Maria",nr.copii=3,
varsta.copii=c(4,7,9))
> lista1 #afisarea continutului listei
$sot
[1] "Ion"
$sotie
[1] "Maria"
$nr.copii
[1] 3
$varsta.copii
[1] 4 7 9
iar accesul la un element din list se face prin numele_listei[[numarul de
ordine]] al elementului ca n comanda:
> lista1[[2]]
[1] "Maria"
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]]
30
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
Vectorii de tip raw pot fi manipulai folosind operatorii la nivel de bii:
! (complement fa de 1), & (i), | (sau) and xor (sau exclusiv). Continund exemplul
de mai sus:
> y=!x #complement data de 1
> rawToBits(y)
[1] 01 01 00 01 01 00 00 01 01 00 01 00 00 01 00 01
> z=charToRaw("AB"); z
[1] 41 42
> rawToBits(z)
[1] 01 00 00 00 00 00 01 00 00 01 00 00 00 00 01 00
> rawToBits(xr&z) #si la nivel de biti
[1] 00 00 00 00 00 00 01 00 00 01 00 00 00 00 01 00
> rawToBits(xr|z) #sau la nivel de biti
[1] 01 00 01 00 00 01 01 00 00 01 00 01 01 00 01 00


31

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
De asemenea, unele funcii admit un numr mai mare de argumente care nu
sunt compatibile dect n anumite combinaii, ca n exemplul de mai jos :
> seq(by=2, to=5, from=1)
[1] 1 3 5
> seq(from=1, by=2, length=3)
[1] 1 3 5
> seq(from=1, by=2, to=5, length=3)
Error in seq.default(from = 1, by = 2, to = 5,
length = 3): too many arguments
Numele argumentelor formale este ales intuitiv (n englez) i dup un pic de
practic nu este dificil a le ine minte. De la o funcie la alta unele argumente formale
au valori predefinite i funciile pot fi apelate fr aceste argumente (se utilizeaz
valorile implicite n calcul). Apar astfel situaii cnd aceeai funcie este apelat cu un
numr diferit de argumente. O astfel de situaie este curent pentru funciile grafice de
exemplu. Dac funciile sunt apelate fr menionarea numelui argumentelor atunci
ordinea i semnificaia argumentelor este strict, ca n programul de definiie a
funciei. De exemplu
> seq(1,5,2)
[1] 1 3 5

32
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
ceiling(x) Dac xe(n-1,n] valoarea returnat este n
floor(x), trunc(x) Partea ntreag a lui x
round(x, digits=n) Rotunjire la n zecimale
signif(x, digits=n) Rotunjire la cele mai semnificative n cifre
cos(x), sin(x), tan(x),
acos(x), asin(x), tan(x),
cosh(x), acosh(x), etc.
Funcii trigonometrice directe i inverse
precum i funcii hiperbolice directe i inverse
log(x) Logaritmul natural, ln x
log10(x) Logaritmul n baza 10, lg x
exp(x)
x
e
besselI(x, nu)
besselK(x, nu)
besselJ(x, nu)
besselY(x, nu)
Funcii Bessel. Parametru nu este ordinul
funciei. Parametru x este un vector numeric
cu valori pozitive.
gamma(x), lgamma(x) Funcia gamma i logaritm natural din gamma
beta(a,b), lbeta(a,b) Funcia beta i logaritm natural din beta
digamma(x) Calculeaz derivata lui log(gamma(x))
psigamma(x, deriv) Calculeaz derivata de ordin deriv a lui
digamma(x)
choose(n,k), lchoose(n,k) Combinri de n cte k (n poate fi real);
lchoose calculeaz logaritm natural din
choose.
factorial(x) Calculeaz gamma(x+1)






33
F<-splinefun(x, y, method)

Valoarea ntoars este o funcie, F, care poate
fi ulterior apelat normal, F(a) pentru
valoarea funciei sau F(2, deriv=1) ceea ce
duce la calculul derivatei funciei spline.
deriv poate lua valorile 0, 1, 2, 3.
x, y sunt vectorii cu coordonatele punctelor de
interpolat method = "fmm", "periodic",
"natural", "monoH.FC", i indic tipul de
funcie spline
spline(x, y , n, method,
xmin, xmax, xout)

Forma aceasta calculeaz valoarea funciei
spline determinat de vectorii x i y n n
puncte echidistante ntre xmin i xmax sau n
vectorul xout.

Exemplul 3.1 S se reprezinte grafic funcia Bessel J
2
pentru ] 20 , 0 [ e x .
O posibil rezolvare este:
x=seq(0,20,length=1000)
y=besselJ(x,2)
plot(x,y,type="lines",lwd=2,ylab="BesselJ(x,2)",
xlab="x", main="O functie Bessel")
grid(5,5)
Graficul este :
0 5 10 15 20
-
0
.
2
0
.
0
0
.
2
0
.
4
O functie Bessel
x
B
e
s
s
e
l
J
(
x
,
2
)

Exemplul 3.2 Se dau doi vectori i s se reprezinte grafic punctele care au
coordonatele date de cei doi vectori precum i funcia spline natural ce trece prin
puncte. O posibil rezolvare este:
x=0:10
y=x*sin(x)/(1+x^2/10)
plot(x,y,main="O functie spline", xlab="x", ylab="y,
Spline(x)")
F<-splinefun(x,y,method="natural")
x1=seq(0,10,length=100)
y1=F(x1)
lines(x1,y1,lwd=2)
grid(5,5)
34
Graficul este:
0 2 4 6 8 10
-
1
.
0
-
0
.
5
0
.
0
0
.
5
1
.
0
O functie spline
x
y
,

S
p
l
i
n
e
(
x
)



3.2. Funcii pentru matrice

Matricele reprezint un obiect matematic important n statistic i de aceea R
are implementate multe funcii referitoare la ele. Mai jos indicm unele din ele.

Operatorul sau funcia Explicaii
A * B nmulirea element cu element
A %*% B nmulirea matriceal
outer(a,b,f)
a %o% b

Dac a i b sunt vectori genereaz o matrice x cu
x
i,j
= f(a
i
, b
j
). Dac a i b sunt matrice genereaz un array
x cu x
i,j,k,l
= f(a
i,j
, b
k,l
) .
Forma a %o% b este asemntoare fa de funcia produs.
crossprod(A,B)
crossprod(A)
A
t
B, respectiv A
t
A
cbind(A,B,...) Combin orizontal (rezultatul va avea liniile din A, B,...)
rbind(A,B,...) Combin vertical (rezultatul este o matrice cu coloanele din
A, B,...)
rowMeans(A) Se obine un vector cu mediile liniilor
rowSums(A) Se obine un vector cu sumele elementelor liniilor
colMeans(A) Se obine un vector cu mediile coloanelor
colSums(A) Se obine un vector cu sumele elementelor coloanelor
min(A), max(A),
range(A)
Minimul, maximu, respectiv un vector cu minimul si
maximul
solve(A) Inversa matricei A
ginv(A) Inversa generalizat Moore-Penrouse (se gsete n pachetul
MASS)
x<-eigen(A) x$values conine valorile proprii ale lui A
x$vectors conine vectorii proprii ai lui A
35
t(A), det(A) Transpusa, respectiv determinantul unei matrice
x<-svd(A) Descompunerea singular a matricei A, A=UDV
t
, cu
D=diag(d)
x$d = vector ce conine valorile singulare ale matricei A
x$u = matrice ortogonal cu vectorii singulari la stnga ai
matricei A
x$v = matrice ortogonal cu vectorii singulari la dreapta ai
matricei A
R <- chol(A) Factorizarea Choleski, A=R
t
R, cu R superior triunghiular,
iar A pozitiv definit.
x<- qr(A) Descompunerea QR a matricei A
x$qr are deasupra diagonalei principale matricea R (superior
triunghiular), iar sub diagonala principal informaii
pentru construcia matricei Q.
x$rank este rangul lui A
x$qraux este un vector cu informaii suplimentare despre Q
x$pivot conine informaii despre strategia utilizat
qr.Q(x), qr.R(x),
qr.X(x)
Creaz dintr-un obiect x de tip qr generat de funcia qr
matricile Q, R sau matricea iniial x.
v<-sort(A,....) v$x conine elementele vectorului sau matricei A (matricea
este convertit n vector punnd coloanele una dup alta)
sortate.
v$ix conine dac parametrul suplimentar index.return=
FALSE un vector cu poziiile originale ale elementelor
ordonate.
Dac decreasing=TRUE sortarea se face descresctor
Dac partial=vector de ntregi sortarea se face
numai pentru componentele indicate de partial
rev(x) Inverseaz ordinea elementelor vectorului x


Exemplul 3.3 Se genereaz aleator un sistem liniar i se determin soluia lui.
a = matrix(runif(25),ncol=5)
b = runif(5)
x = solve(a,b)
a
b
x
Se obine rspunsul:
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 0.2368829 0.79721628 0.1265954 0.04369927 0.2061009
[2,] 0.1015411 0.70852984 0.7379991 0.03374915 0.4783938
[3,] 0.4941975 0.28829965 0.2681115 0.92383512 0.3105410
[4,] 0.8037851 0.04331768 0.5082257 0.62702404 0.3799365
[5,] 0.2050783 0.22855288 0.3172556 0.75981321 0.1595518
36
> b
[1] 0.4920966 0.5553061 0.3207777 0.2010808 0.5628473
> x
[1] 0.1839354 0.9262001 1.2986354 0.3486333 -2.2779749

Exemplul 3.4 S se determine n ct timp se rezolv un sistem liniar
10001000 generat aleator. Rezolvarea este n secvena de cod urmtoare:
ptm <- proc.time()
a = matrix(runif(1000000),ncol=1000)
b = runif(1000)
x = solve(a,b)
proc.time() ptm
Rspunsul pe un calculator cu procesor Q9300 quad la 2.5 Ghz este:
user system elapsed
0.69 0.08 1.36

Exemplul 3.5 S se determine valorile i vectorii proprii ai unei matrice
precum i descompunerea ei singular. Se va alege o matrice singular.
x=runif(5); y=runif(5)
a=outer(x,y,"+")
v<-eigen(a)
ds<-svd(a)
Ca produs outer, matricea a este singular. Valorile i vectorii proprii sunt:
> v
$values
[1] 6.819055e+00 -7.174162e-02 -2.935982e-16 -5.941790e-17
-1.790505e-17

$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] 0.3264044 0.73432693 -0.67659694 0.3795791 0.3029054
[2,] 0.4377868 0.04995971 0.68624453 -0.3881873 -0.1576330
[3,] 0.5506698 -0.64362770 0.21134194 0.6398041 0.3044435
[4,] 0.4216151 0.14932348 -0.14367175 -0.5354580 -0.8120513
[5,] 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,] -0.3262407 0.77055695 -0.5096937 -0.1995559 0.014098365
[2,] -0.4377668 0.09392287 0.3454248 0.1386439 -0.813017974
[3,] -0.5507955 -0.59182723 -0.3600220 -0.4655446 -0.004147016
[4,] -0.4215743 0.19216386 0.6827627 -0.2779026 0.491887645
[5,] -0.4699219 -0.10116352 -0.1584718 0.8043592 0.311178980

37
$v
[,1] [,2] [,3] [,4] [,5]
[1,] -0.3932570 -0.5884878 0.674404332 -0.20995153 -0.01141111
[2,] -0.3959388 -0.5602933 -0.706356531 0.03387009 0.17093016
[3,] -0.4729784 0.2496549 -0.138133931 -0.21376690 -0.80572118
[4,] -0.4682765 0.2002217 0.164709931 0.84032560 0.08574326
[5,] -0.4955703 0.4871727 0.005376199 -0.45047726 0.56045887

Putem verifica faptul c A=UDV
t
, 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 -8.881784e-16 -8.881784e-16 -6.661338e-16 -8.881784e-16
[2,] 0.000000e+00 -4.440892e-16 -2.220446e-16 -2.220446e-16 -2.220446e-16
[3,] -2.220446e-16 -4.440892e-16 -2.220446e-16 -2.220446e-16 -4.440892e-16
[4,] -2.220446e-16 -4.440892e-16 -2.220446e-16 -2.220446e-16 -2.220446e-16
[5,] -2.220446e-16 -6.661338e-16 -4.440892e-16 -4.440892e-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

Pentru prelucrarea irurilor i vectorilor cu elemente iruri de caractere se pun
la dispoziie mai multe funcii. Unele sunt n tabelul de mai jos.

Funcia 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)
gsub(sir1,sir2,x,fixed=TRUE)


nlocuiete ir1 cu ir2 n x. Dac
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.
38
strsplit(x, split) Scindez irul x n subiruri. Scindarea se face
acolo unde este ntlnit irul split. De
exemplu irul "as de frt yt uutyh" este scindat
prin comanda sir1=strsplit(sir,"t") n
irurile: "as de fr", " y", " uu", "yh". sir1 este o
list ce conine un singur vector sir1[[1]] ce
are ca elemente subirurile rezultat.
paste(..., sep=" ",
colapse=NULL)
Convertete argumentele n iruri de caractere
pe care le concateneaz utiliznd separatorul
sep. Dac unele argumente sunt vectori se face
concatenarea termen cu termen repetnd ciclic
elementele vectorilor mai scuri. Dac
De exemplu, paste("a",1:3,1:4,
sep="") are ca rezultat "a11" "a22" "a33"
"a14". Dac collapse="" atunci elementele
apar ca un singur ir de caractere. Comanda
paste("a",1:3,1:4,sep="",collapse="
") d ca rezultat: "a11a22a33a14".
toupper(x) Convertete la majuscule
tolower(x) Convertete la minuscule
LETTERS, letters 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="")

39
> 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" "r"
[4] "y"
> i=grep("r",x8)
> i
[1] 1 2 3
> x8[i]
[1] "avxfdr" "yudbcbdgfjavsjhdhgder" "r"
Constatm c irul de comenzi care duc de la x la x4 inverseaz caracterele ntr-un ir.


3.4. Repartiii de probabilitate

R pune la dispoziia utilizatorilor un mare numr de distribuii de probabilitate.
Numele pentru densitatea de probabilitate ncepe cu d (de exemplu, dnorm), pentru
funcia de repartiie ncepe cu p (de exemplu, pnorm), pentru cuantile ncepe cu q (de
exemplu, qnorm), pentru vectori aleatori ncepe cu r (de exemplu, rnorm).
Densitatea de probabilitate are argumentul opional log=FALSE. Dac
log=TRUE atunci se calculeaz logaritm din densitate.
Funcia de repartiie are parametrii opionali lower.tail = TRUE,
log.p = FALSE. Dac lower.tail=TRUE atunci funcia de repartiie returneaz
valoarea P(Xx), altfel P(X>x). Dac log.p=TRUE se interpreteaz c probabilitile
sunt date prin logaritmii lor.
Funcia care calculeaz cuantilele are parametrii opionali lower.tail =
TRUE, log.p = FALSE. Dac lower.tail = TRUE, atunci funcia aplicat lui q
ntoarce valoarea minim x astfel ca P(Xx) q.

n tabelul de mai jos sunt prezentate cteva distribuii disponibile n R.

Distribuia Modul de apelare
Normal
( )
( )
2
2
2
2
1
o
o t

m x
e x

=
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
40
mean = m, sd=
Log-normal
( )
( )
2
2
2
log
2
1
o

o t

=
x
e
x
x
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 =
Binomial
P(X=x) = ( )
x n x x
n
p p C

1
x = 0, 1, 2, ..., n
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
size=n, prob=p
Binomial negativ
P(X=x) =
( )
( )
( )
x n
p p
x n
n x

I
+ I
1
!

xeN , n>0
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
Student
( )
2
1
2
1
2
2
1 +

|
|
.
|

\
|
+
|
.
|

\
|
I
|
.
|

\
| +
I
=
v
v v
vt
v

x
x
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
df = v , ncp nu este de obicei utilizat
Hi ptrat
( )
( )
2 / 1 2 /
2 /
2 / 2
1
x
e x x

I
=
v
v
v
,
x>0
dchisq(x, df, ncp=0, log=FALSE)
pchisq(q,df,ncp=0,lower.tail=TRUE,
log.p = FALSE)
qchisq(p,df,ncp=0,lower.tail=TRUE,
log.p = FALSE)
rchisq(n, df, ncp=0)
df = v
ncp nu se utilizeaz de obicei, implicit e zero.
Cauchy
( )
|
|
.
|

\
|
|
|
.
|

\
| =
+
=
2
0
1
1

x x
x
dcauchy(x, location=0, scale=1,
log=FALSE)
pcauchy(q, location = 0, scale = 1,
lower.tail = TRUE, log.p = FALSE)
qcauchy(p, location = 0, scale = 1,
lower.tail = TRUE, log.p = FALSE)
rcauchy(n, location = 0, scale = 1)
location = x
0
, scale =
Exponenial
( )
x
e x



= , x>0, >0
dexp(x, rate = 1, log=FALSE)
pexp(q, rate = 1, lower.tail = TRUE,
log.p = FALSE)
qexp(p, rate = 1, lower.tail = TRUE,
log.p = FALSE)
rexp(n, rate = 1)
rate=
41

Gamma
( )
( )
a
x
k
k
x
a k
x
x

I
=
1
, x0, k>0, a>0
dgamma(x, shape, scale=1, log=FALSE)
pgamma(q, shape, scale = 1,
lower.tail = TRUE, log.p = FALSE)
qgamma(p, shape, scale = 1,
lower.tail = TRUE, log.p = FALSE)
rgamma(n, shape, scale = 1)
shape=k, scale=a
Beta
( )
( )
( ) ( )
( )
1 1
1


I I
+ I
=
b a
x x
b a
b a
x
>0, >0, xe(0, 1)
dbeta(x, shape1, shape2, ncp = 0,
log=FALSE)
pbeta(q, shape1, shape2, ncp = 0,
lower.tail = TRUE, log.p = FALSE)
qbeta(p, shape1, shape2, ncp = 0,
lower.tail = TRUE, log.p = FALSE)
rbeta(n, shape1, shape2, ncp = 0)
shape1=o , shape2= |
F
( )
2
1
2
2 /
1
2
,
2
1
b a
a
a
x
b
a
x
b
a
b a
x
+

|
.
|

\
|
+ |
.
|

\
|
|
.
|

\
|
=
|


a>0, b>0, x0, este funcia beta

df(x, df1, df2, ncp=0, log = FALSE)
pf(q,df1,df2,ncp=0,lower.tail=TRUE,
log.p = FALSE)
qf(p,df1,df2,ncp=0,lower.tail=TRUE,
log.p=FALSE)
rf(n, df1, df2, ncp=0)
df1=a, df2=b
Geometric
P(X=x) = p(1-x)
x-1
, xeN, pe[0,1]
dgeom(x, prob, log = FALSE)
pgeom(q, prob, lower.tail = TRUE,
log.p = FALSE)
qgeom(p, prob, lower.tail = TRUE,
log.p = FALSE)
rgeom(n, prob)
prob=p
Hipergeometric
P(X=x) =
k
n m
x k
n
x
m
C
C C
+


dhyper(x, m, n, k, log = FALSE)
phyper(q, m, n, k, lower.tail = TRUE,
log.p = FALSE)
qhyper(p, m, n, k, lower.tail = TRUE,
log.p = FALSE)
rhyper(nn, m, n, k)
Poisson

P(X=x) =
! k
e
x


, >0, xeN
dpois(x, lambda, log = FALSE)
ppois(q, lambda, lower.tail = TRUE,
log.p = FALSE)
qpois(p, lambda, lower.tail = TRUE,
log.p = FALSE)
rpois(n, lambda)
lambda =
Uniform
( )
a b
x

=
1
, xe[a, b]

dunif(x, min=0, max=1, log = FALSE)
punif(q,min=0,max=1,lower.tail=TRUE,
log.p = FALSE)
qunif(p,min=0,max=1,lower.tail=TRUE,
log.p = FALSE)
runif(n, min=0, max=1)
min=a, max=b
42

Weibull
( )
a
b
x
a
e
b
x
b
a
x
|
.
|

\
|

|
.
|

\
|
=
1
, x>0, a>0,
b>0

dweibull(x,shape,scale=1,log=FALSE)
pweibull(q, shape, scale = 1,
lower.tail = TRUE, log.p = FALSE)
qweibull(p, shape, scale = 1,
lower.tail = TRUE, log.p = FALSE)
rweibull(n, shape, scale = 1)
shape=a, scale=b
Logistic
( )
2
1
1
|
|
|
.
|

\
|
+
=

s
m x
s
m x
e
e
s
x
dlogis(x, location = 0, scale = 1,
log = FALSE)
plogis(q, location = 0, scale = 1,
lower.tail = TRUE, log.p = FALSE)
qlogis(p, location = 0, scale = 1,
lower.tail = TRUE, log.p = FALSE)
rlogis(n, location = 0, scale = 1)
location=m, scale=s

Exemplul 3.7. S realizm graficul densitii i funcia de repartiie pentru
distribuia logistic, m = 0, s = 1.
x=seq(-10,10,length=200)
y=dlogis(x, location = 0, scale = 1, log = FALSE)
y1=plogis(x, location = 0, scale = 1, log = FALSE)
plot(x, y, ylim=range(y,y1), ylab="densitatea si functia
de repartitie", main="Repartitia logistica, m=0,s=1")
lines(x,y1, lwd=3, lty=5), grid(5,5)
-10 -5 0 5 10
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
Repartitia logistica, m=0, s=1
x
d
e
n
s
i
t
.


s
i

f
u
n
c
t
i
a

d
e

r
e
p
a
r
t
i
t
i
e


3.5. Funcii statistice elementare

Funcia Explicaii
mean(x, trim=0,
na.rm=FALSE)
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.
sd(x,na.rm=FALSE) Deviaia standard
43

var(x, y = NULL,
na.rm = FALSE, use)

Variana (dispersia) vectorului, matricei sau
data.frame x. Parametrul use este unul din irurile:
"everything", "all.obs", "complete.obs",
"na.or.complete" sau "pairwise.complete.obs" i
specific felul n care se trateaz valorile lips.
Vectorul y trebuie s aib aceeai dimensiune ca x.
Implicit y=NULL nseamn y=x.
median(x,na.rm=FALSE) Valoarea median
cov(x, y = NULL,
use = "everything",
method = "kendall")
Covariana vectorilor x i y sau a matricei ori
data.frame x (n acest caz se face covarian ntre
coloane). Parametrul method poate fi "pearson",
"kendall", "spearman".
cor(x, y = NULL, use
= "everything",method
= "kendall")
Coeficientul de corelaie al vectorilor x i y sau a
matricei ori data.frame x (n acest caz se face
corelaia ntre coloane). Parametrul method poate fi
"pearson", "kendall", "spearman".
quantile(x,prob,
na.rm=FALSE,type=7)
Se determin cuantilele din vectorul de probabilitai
prob pentru datele numerice din x. Parametrul na.rm
controleaz dac se exclud valorile NA i NaN.
Parametrul type ia valori ntregi ntre 1 i 9 n funcie
de metoda dorit de calcul a cuantilelor.
range(x) Intervalul [minim, maxim]
sum(x,y),
prod(x,y,...)
Suma elementelor vectorilor x, y,.. respectiv produsul.
diff(x, lag=1) Diferene finite x
i+lag
x, cu pasul lag. Implicit este
lag=1, iar rezultatul are lungimea cu 1 mai mic. Dac
x este matrice se fac diferenele pe componente.
min(x) Minimul
max(x) Maximul
summary(obiect,...) Este o funcie generic al crei rezultat depinde de
obiectul creia i se aplic. Pentru un vector numeric se
dau minimul, maximul, media, mediana, prima i a
treia cvartil. Pentru o matrice sau data frame se face
acelai lucru pentru coloane.
scale(x, center=TRUE,
scale=TRUE)
Se nlocuiete x
i
cu
scale
center x
i

. Dac center=TRUE
atunci se ia center egal cu mean(x), iar dac
scale=TRUE se ia scale=sd(x). Dac x este o
matrice se aplic procedura pentru fiecare coloan.
Center i scale trebuie s fie n acest caz un vector
de centre, respectiv un vector de parametri de scalare.

44
Exemplul 3.8. Se d un vector numeric x i se cere un sumar al caracteristicilor
statistice elementare.
> x<-c(1,2,-1,3,4,10,6,4,-2,6,8,3,5)
> summary(x)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-2.000 2.000 4.000 3.769 6.000 10.000


3.6. Funcii de mapare

Prin aceste funcii se evit folosirea unor instruciuni de ciclare. O anumit
funcie este aplicat repetat unor date extrase din argumentele instruciunii.

Funcia Explicaii
apply(x, MARGIN,
FUN, ...)

x este un array, iar MARGIN un vector cu poziiile pe care
sunt indicii care se cicleaz, FUN este funcia care se aplic
acelui array cu indicii din MARGIN fixai, ... sunt parametrii
adiionali pentru FUN. De exemplu, dac x este un array cu
mai mult de dou dimensiuni, s zicem trei, comanda
y=apply(x, c(1,2), sum) ne d o matrice unde
y[i,j]=sum(x[i.j,]), pentru orice i,j ntre limitele permise, iar
comanda y=apply(x,c(1,3),sum) ne d y[i,j]=sum(x[i,j]).
lapply (x, FUN, ...)

Aplic funcia FUN fiecrui element al unui vector sau
list.
sapply (x, FUN, ...,
simplify = TRUE,...)
La fel ca lapply doar c rezultatul se convertete
(simplific) la un array.
replicate(n, expr,
simplify = "array")
Evaluarea de n ori a expresiei expr. Dac x este un
vector atunci y=replicate(3,mean(x)) ne d un vector cu
trei componente egale cu media lui x.
tapply(x, INDEX, FUN
= NULL, ...,
simplify = TRUE)

Se aplic funcia FUN elementelor din vectorul x
grupate dup lista de factori INDEX. Dac
symplify=TRUE se ncearc convertirea la array a
rezultatului.
mapply(FUN, ...,
MoreArgs = NULL,
simplify = TRUE,
use.names = TRUE)

Se aplic funcia FUN, funcie de mai multe argumente,
primelor elemente ale argumentelor...., pe urm
elementelor de pe locurile doi ale argumentelor, etc. ...
poate fi o niruire de vectori da aceeai lungime, data
frame cu acelai numr de coloane sau liste cu acelai
numr de componente. De exemplu dac z1=c(1,2,3,4),
z2=c(3,4,5,6) atunci mapply(sum,z1,z2) ne d 4 6 8 10.


Exemplul 3.9. S aplicm funciile apply, lapply, sapply i mapply unor
matrice sau vectori. Rezultatele se pot vedea dup fiecare comand.
> x=matrix(1:12,ncol=4)
> x
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
45
> 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
46
[1] 1 12 23 34 45 56 67 78 89 100 111 122
> 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
Se constat c funcia lapplay are ca rezultat o list. Pentru a obine un vector
trebuie utilizat funcia sapplay n loc de lapplay sau aplicat funcia unlist
rezultatului ntors de lapplay.

Exemplul 3.10. S calculm produsul de convoluie p al vectorilor x i y. Prin
definiie

= +
=
k j i
j i k
y x p . Indicii vectorului x apar n vectorul ix, ai vectorului y n
iy, iar ai vectorului p n ip.
> x=1:5;y=c(1,2,2);ix=-2:2; iy=0:2
> x
[1] 1 2 3 4 5
> ix
[1] -2 -1 0 1 2
> y
[1] 1 2 2
> iy
[1] 0 1 2
> r=as.vector(outer(x,y,"*"))
> ir=as.vector(outer(ix,iy,"+"))
> r
[1] 1 2 3 4 5 2 4 6 8 10 2 4 6 8 10
> ir
[1] -2 -1 0 1 2 -1 0 1 2 3 0 1 2 3 4
> 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










47
3.7. Funcii pentru citire i scriere

Descrierile care urmeaz sunt incomplete, dar suficiente n aplicaii uzuale.
Prin apel la help se pot obine informaii suplimentare.

Funcia Explicaii
print print(x, ...)
Se tipresc la consol datele x. Printre opiuni se numr
digits=numrul maxim de cifre semnificative ce se tipresc,
justify = "left", "right", "centre", "none".
cat cat(...,file="",sep="",fill=FALSE,append=FALSE)
Vectorii i numele din ... sunt scrise n fiierul file (dac nu
apare n instruciune atunci se scrie la consol) utiliznd
separatorul sep. fill este un numr pozitiv care d lungimea
unei linii n fiier sau FALSE cnd se creaz linie nou doar la
apariia caracterului \n. Dac append=TRUE se adaug datele
la fiierul existent.
read.csv,
read.table,
read.csv2
read.delim
read.delim2

Prin aceste instruciuni se citesc date de tip data.frame din
fiiere text. Pe fiecare linie din fiier trebuie s fie o linie din
tabel. Dac header=TRUE atunci prima linie conine numele
coloanelor. Parametrul row.names este fie un numr ce indic
pe ce coloan este numele liniilor fie un sir de caractere cu
numele coloanei.
read.csv(file,header=TRUE,sep=",",quote="\"",
dec=".")
read.table(file,header=FALSE,sep="",quote="\"'",
dec=".",row.names,col.names,,nrows=-1,skip=0,
blank.lines.skip=TRUE, comment.char="#",)
Parametrii din instruciuni se explic singuri prin nume (dec este
semnul pentru separarea zecimalelor). Dac lipsesc se pun
valorile implicite. read.csv2, read.delim, read.delim2
sunt la fel ca read.csv cu ali separatori ntre cmpuri i ali
delimitatori pentru zecimale.
readLines
Se utilizeaz pentru a citi linii de la o conexiune (de exemplu
dintr-un fiier)
write,
write.table,
write.csv,
write.csv2
write(x,file,ncolumns,append=FALSE,sep=" ")
write.table(x,file="",append=FALSE,quote=TRUE,
sep="",eol="\n",na="NA",dec=".",row.names=TRUE,
col.names = TRUE)
Parametrii care nu se pun efectiv n instruciuni se iau implicit.
Cu instruciuni se scriu date de tip data.frame n fiiere text.
scan scan(file="",what,nmax=-1,n=-1,sep="",skip=0,
nlines=0), unde file este fiierul, what este tipul de date din
fiier: logical, integer, numeric, complex, character, raw, list
(implicit numeric), sep este separatorul de date din fiier
(implicit blanc), skip este numrul de linii de la nceputul
fiierul de ignorat, nlines este numrul max.de linii ce se citesc.
48

format format(x, digits, nsmall, justify, width)
Se specific felul n care se va tipri x, digits este numrul de
cifre, nsmall este numrul de cifre dup virgul (20),
justify="left","right","centre","none", width este limea min.
save
save(...,list,file,ascii=FALSE), unde ... este lista de
variabile ce se salveaz, list este la fel liste de variabile ce se
salveaz, file este fiierul n care se salveaz, ascii este TRUE
sau FALSE.
save.image save.image(file=".RData", ascii=FALSE, compress,
safe = TRUE)
Compress poate fi "gzip", "bzip2" or "xz" i specific tipul de
compresie al datelor. Prin aceast comand se salveaz toate
datele din spaiul de lucru.
load
load(file), unde file este fiierul de unde se restaureaz
datele salvate cu save sau save.image
ls()
Rezultatul este o list cu variabilele active n programul curent
rm(list)
Prin aceast funcie sunt terse din memorie variabilele din lista
dat de parametrul list. Instruciunea rm(list=ls()) terge
toate variabilele din memorie.

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


3.8. Funcii de creare de date

Printre funciile de creare de date discutate a capitolul despre tipuri de date
amintim: rep, seq, c, matrix, array, table, cbind, rbind. Aceste
funcii au fost utilizate n mai multe rnduri n cpitolul despre tipurile de date.

Funcia Exemple
seq (from, to, by, length.out,
along.with=NULL, ...)

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,
length.out, each (la each se repet
fiecare element al lui x)
rep(x,10); rep(x,times=10);
rep(1:3,length=5);
rep(1:5,each=2)

49
x<-c(2,3,4)
cbind, rbind
combina pe coloanele (liniile) unor vector,
ale unei unor matrice sau data.frame
x=1:3; y=4:6; z<-cbind(x,y);
u=rbind(x,y)
matrix, array
permit crearea de matrice sau blocuri
multidimensionale
x=matrix(1:10, ncol=2)
y=array(1:24, dim<-c(2,3,4))


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] [,3]
[1,] 1 3 5
[2,] 2 4 6

, , 2

[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12

, , 3

[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18

, , 4

[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24


50
3.9. Funcii de conversie

Conversia datelor dintr-un tip n altul se poate face prin comenzi ca
as.numeric as.integer, as.character, as.factor, as.function,
as.vector, cut (convertete un vector numeric ntr-un factor), strtoi
(convertete iruri de caractere n ntregi), toString (convertete un obiect R ntr-un
ir de caractere, data.matrix (convertete un obiect data.frame ntr-o matrice) etc.
Dac nu e posibil conversia atunci rezultatul rmne nemodificat.

Exemplul 3.13. Din doi vectori de aceeai dimensiune se construiete o
data.frame care se ncearc a se converti n mai multe feluri dintre care unele sunt
imposibile.
> 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


3.10. Funcii pentru teste statistice

Pentru teste statistice se poate apela n R la funcii specializate ca: t.test,
binom.test, prop.test, var.test, wilcox.test, shapiro.test, bartlett.test, Box.test,
chisq.test, fisher.test, friedman.test, ks.test, etc. Informaii despre aceste funcii,
parametrii de intrare i rezultatele ntoarse, se pot gsi n paginile de ajutor din R.
Valoarea de baz ntoars de un test este p.value, notat n exterior ca p-value. Dac
este mai mare dect pragul de risc definit 1-nivelul de ncredere (n teste nivelul de
ncredere este numit conf.level) atunci ipoteza este acceptabil cu o eroare de tipul
I sub pragul de risc.

51
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
n cazul nostru p-value=0.548 > 0.05=pragul de risc=1-conf.level, deci ipoteza
c p=0.5 este admisibil. n plus, avem i o estimare a lui p sub forma unui interval de
ncredere cu ncrederea conf.level=0.95.

Exemplul 3.15. Utiliznd testul Kolmogorov-Smirnov s se decid dac datele
dintr-un vector sunt repartizate conform unei distribuii date (n cazul de fa N(1,2)).
> x <- runif(500,-1,1)
> rez=ks.test(x, "pnorm",1,2)
> rez
One-sample Kolmogorov-Smirnov test
data: x
D = 0.5005, p-value < 2.2e-16
alternative hypothesis: two-sided
Am generat un vector aleator uniform cu valori n [-1,1]. Testul ks a detectat c datele
nu provin dintr-o distribuie normal cu media 1 i abaterea standard 2. Acest lucru se
reflect prin faptul c p-value este foarte mic, mult mai mic dect pragul de risc
uzual 0.05. Dac schimbm datele de testare cu un vector repartizat N(1,2), testul ks
art c ipoteza este acceptabil (p-value este 0.7422 > 0.05=pragul uzual de risc)
> x <- rnorm(500,1,2)
> rez=ks.test(x, "pnorm",1,2)
> rez
One-sample Kolmogorov-Smirnov test
data: x
D = 0.0304, p-value = 0.7442
alternative hypothesis: two-sided

52

3.11. Funcii pentru determinarea duratei de execuie a unor poriuni de
program

Funcia Exemple
system.time(expr)
Este determinat durata de execuie a expresiei expr.
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()
Este determinat timpul ct calculatorul cheltuie cu anumite
proceduri. Se utilizeaz ca de exemplu:
ptm <- proc.time()
a=matrix(runif(1000000),ncol=1000)
b=runif(1000)
x=solve(a,b)
proc.time() ptm

user system elapsed
0.69 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.

53

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 Explicaii
plot 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
> <i
y n funcie de x. plot(x)
pentru o variabil care are metoda plot produce un grafic specific
acelui tip de variabil.
pairs
pairs (x) unde x este o matrice face toate graficele ( )
> < > < j i
x x ,
unde
> <i
x i
> < j
x sunt coloane ale lui x
coplot coplot(x~y,f) execut graficele lui y depinznd de x, pentru fiecare
nivel al factorului f
hist 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.
54

boxplot boxplot(x,...) sau boxplot(x~y,data=z,...). n primul caz se execut
un boxplot pentru valorile din vectorul sau lista de vectori x, iar n
al doilea caz se execut un box plot pentru valorile din coloana x
grupate dup factorul y, date ce se afl n variabila z ce trebuie s
aib date numite x i y (de exemplu z este data.frame iar x, y sunt
dou coloane n z).
qqnorm, qqplot,
qqline
qqnorm(x) reprezint grafic cuantilele lui x fa de cele ale
distribuiei normale standard, qqplot(x,y) reprezint grafic
cuantilele lui x fa de cele ale lui y, qqline(x) reprezint pe lng
graficul ca n qqnorm(x) i linia ce aproximeaz graficul.
barplot barplot(x,...), unde ... sunt opiuni, tiprete sub form de bare
verticale valorile lui x
dotchart dotchart(x,...) la fel ca barplot(x,...) face graficul valorilor lui x
sub form de puncte
image image(x,y,z,...), image(z,...) reprezint matricea z prin culori; x[i] i
y[j] reprezint coordonatele centrului dreptunghiului unde se
reprezint prin culoare valoarea z[i,j]
contour,
filled.contour
contour(x,y,z, nlevels=n,...) reprezint grafic liniile de contur ale
valorilor z[i,j] din matricea z, avnd pe axe gradaiile date de
vectorii x, respectiv y. Opiuni suplimentare se pot afla cu
help(contour). Analog pentru filled.contour, unde spaiul ntre
dou linii de contur e colorat.
persp persp(z), persp(x,y,z), persp(x,y,z,theta=a,phi=b,...) deseneaz o
suprafa pe care sunt punctele de coordonate (x[i], y[j], z[i,j]).
Direcia de vedere a suprafeei se ajusteaz prin parametrii theta i
phi (in grade), iar ltheta i lphi dau direcia de unde vine lumina
pe suprafa, r d distana de la care se vede (r mare e ca vederea
de la infinit). Culoarea este controlat prin parametrul opional
col. Pentru o variaie continu a culorii col trebuie s fie un vector
de culori de dimensiune egal cu numrul de faete (vezi exemplul
de mai jos). Pentru a obine o senzaie de relief mai puternic se
utilizeaz opiunea shade=numr de obicei ntre 0 i 1, thicktype
poate fi simple sau detailed, axes este TRUE sau FALSE dup
cum se pun sau nu marcajele pe axe, xlim, ylim, zlim dau valorile
limit pe axe, valori care sunt cuprinse n grafic, main i sub sunt
titlul i subtitlul, xlab,ylab, zlab sunt titlurile axelor. Dac scale =
TRUE atunci nu se pstreaz proporia pe cele trei axe.

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 Explicaii
points points(x,y,...) tiprete puncte n coordonatele specificate de x i y
lines lines(x,y) adaug linii ntre punctele de coordonate specificate n
vectorii x, y.
text text(x,y,text,...) determin scrierea ncepnd din poziia (x[i],y[i]) a
caracterelor din text[i]. Un parametru auxilar numit pos ce poate avea
valorile 1, 2, 3, 4 controleaz dac textul este sub, la stnga, deasupra sau
la dreapta punctului (x, y).
55
mtext mtext(text,...) scrie un text pe o margine a graficului. Printre
parametrii opionali : side pentru a controla marginea (1=jos,
2=stnga, 3=sus, 4=dreapta), col este culoarea pentru text,
line=ntreg controleaz deprtarea fa de marginea corespunztoare
a graficului (n linii).
abline abline(a=valoare1, b=valoare2) traseaz graficul lui y=a+bx,
abline(h=valoare) traseaz linia orizontal prin y=h,
abline(v=valoare) traseaz linia vertical prin x=v.,
abline(coef=vector) traseaz linia care are n coef ordonata la
origine i panta, abline(obiect) traseaz o linie de parametrii coef
din obiectul obiect (dac exist).
axis axis(side,...) traseaz o ax n funcie de parametrul side (1=jos,
2=stnga, 3=sus i 4=dreapta). Exist mai muli parametri opionali.
segments segments(xo,yo,xd,yd,...) traseaz segmente de la (xo,yo) la (xd,yd).
Dac xo, yo, xd, yd sunt vectori atunci se traseaz mai multe
segmente. Printre parametrii opionali amintim col care este egal cu
indicele culorii segmetului (col poate fi un nume de culoare).
arrows arrows(xo,yo,xd,yd,...) este ca i rutina segments de mai sus doar c
traseaz sgei de la (xo,yo) la (xd,yd)
rect rect(xleft, ybottom, xright, ytop,...) traeaz o mulime de
dreptunghiuri n care xleft reprezint coordonatele lor x stnga,
ybottom reprezint coordonatele lor y jos, etc. Printre parametrii
opionali menionm col un vector cu indicii de culoare din paleta
curent, density un vector cu numrul de linii de haurare, lty un
vector cu tipurile de linie de haur, angle un vector cu unghiurile
fa de Ox aleliniilor de hurare.
polygon polygon(x,y,...) traseaz un poligon cu vrfurile consecutive date de
vectorii x i y. Printre opiuni sunt importante col=culoarea cu care
se umple interiorul poligonului, density=numrul de linii cu care se
haureaz poligonul, angle=unghiul cu axa Ox al liniilor de
haurare (n grade)
box box(lty=tip, col=culoare) determin trasarea unui dreptunghi n
jurul graficului cu tipul de linie tip i culoarea culoare.
grid grid(nx,ny, col=culoare, lty=tiplinie) datermin trasarea unui
caroiaj cu culoarea culoare i tipul de linie tiplinie. Se mai poate
introduce parametrul lwd care d grosimea liniilor de caroiaj. Pe axa
Ox sunt nx diviziuni, iar pe axa Oy sunt ny diviziuni.
legend legend(x,y, legenda, col=vector, text.col=vector, lty=vector,
pch=vector, bg=,...) unde (x,y) este poziia pe grafic al colului
stnga sus al legendei (se poate indica poziia prin cuvinte "topleft"
sau "bottomright" sau prin instruciunea locator() caz n care este
aleas cu mausul), legenda este un vector cu elemente text (se poate
da textul din legend prin legend=textul , col este un vector cu
indicii culorilor din paleta curent de culoare pentru culorile
marcajelor din legend, text.col este un vector cu indicii de culoare
pentru textele din legend, lty este un vector de ntregi cu indicii
tipurilor de linie din grafice, pch este un vector cu indicii tipurilor
de linie din legend, bg este indicele culorii de fundal din legend.
Culorile, tipurile de linie sau tipurile de puncte pot fi specificate i
prin cuvinte)
56
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 Valoare
implicit
Explicaii
xlog FALSE Dac este TRUE pe axa x se utilizeaz scara
logaritmica
ylog FALSE Analog cu xlog dar pentru axa y
pch 1 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 black 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.
col.axis "black" Culoarea axelor
col.lab "black" Culoarea pentru etichete pe axe
col.main "black" Culoarea pentru titlu
col.sub "black" Culoarea pentru subtitlu
cex, cex.axis,
cex.lab, cex.main,
cex.sub
1 Un factor de amplificare pentru mrimea textului
fa de mrimea implicit. Doar cex.main are
valoarea implicit 1.2
adj -1 Se controleaz cum apare textul justificat fa de
punctul de referin: 0 aliniat la stnga, 1 aliniat la
dreapta , 0.5 centrat orizontal
font, font.axis,
font.lab, font.main
font.sub
1 Un ntreg ce reprezint fontul pentru text, axe,
etichete, titlu, subtitlu.
fg, bg black,
white
Culorile pentru foreground respectiv background
lty solid Tipul de linie: 0=blank, 1=solid (default),
2=dashed, 3=dotted, 4=dotdash, 5=longdash,
6=twodash
lwd 1 Grosimea liniei. Depinde de tipul de dispozitiv
grafic pe care se tiprete
mai 1.02 0.82
0.82 0.42
Un vector ce conine dimensiunile n inci ale
marginilor n ordinea: jos, stnga, sus, dreapta
mar 5.1 4.1
4.1 2.1
La fel ca la mai dar dimensiunea este n linii
mex 1 Factor de amplificare pentru mrimea fontului cu
57
care se scrie pe margine
mfcol 1 1 Vector de tipul c(nr,nc). Ecranul va fi mprit n
nc nr regiuni. Figurile consecutive vor fi scrise pe
coloan.
mfrow 1 1 Vector de tipul c(nr,nc). Ecranul va fi mprit n
nc nr regiuni. Figurile consecutive vor fi scrise pe
linie.
mfg 1 1 1 1 Un vector de tipul c(i,j,nr,nc) prin care se specific
n ce regiune de pe ecran se scrie. Se accept i
valori de tipul c(i,j)
fig Printr-un vector de patru numere ntre 0 i 1 se
controleaz poziia figurii n pagin fa de colul
stnga-jos.
xaxs, yaxs Controleaz stilul marcajelor pe axe i pot fi "r", "i",
"e", "s", "d".
xaxp, yaxp 0 1 5 Au forma c(n1,n2,n) unde n1 i n2 reprezint
coordonatele extreme ale punctelor de marcaj (tick
marks) de pe axe, iar n este numrul dorit de
marcaje
lab 5 5 7 Vector de tipul c(n1,n2,n): n1, n2 reprezint
numerele dorite de marcaje pe axe, iar nu e
implementat.
las Este un ntreg 0, 1, 2, sau 3, i controleaz felul n
care se traseaz marcajele pe axe.
xaxt, yaxt s Controleaz tipul axelor "n", "l" , "t", "s".
usr 0 1 0 1 Vector de tipul c(x1,x2,y1,y2) pentru valorile
extreme pe coordonate
tcl -0.5 Lungimea marcajelor pe axe ca fracie din limea
unui rnd de text.
srt 0 Unghiul de rotaie al irurilor de caractere

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" "green3" "blue" "cyan" "magenta"
[7] "yellow" "gray"

58
Pentru culorile care nu au nume se utilizeaz descrierea lor hexazecimal. Putem crea
palete de culori prin palette(rainbow(n)), palette(heat.colors(n)), palette
(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"

Se vede c funcia colorRampPalette ne ntoarce ca rezultat o funcie de calcul a
culorilor. Aceast funcie aplicat unui numr natural n creaz o palet de lungime n.
Putem vedea culorile din palet tiprind de exemplu:
> plot(1:20, col=paleta, pch=1:20, main="Puncte si culori")

5 10 15 20
5
1
0
1
5
2
0
Puncte si culori
Index
1
:
2
0

Fig 4.1

Un clic dreapta pe grafic face s apar un meniu contextual unde apar
opiunile de salvare a graficului n format metafile sau postscript sau de copiere n
clipboard n format metafile sau bitmap (n windows). De aici este uor s-l includem
ntr-un document.


Pe lng parametrii din vectorul par n comenzile grafice de nivel nalt apar i
ali parametri opionali:


59
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,
log=xy
Se specific ce axe sunt gradate logaritmic. Acest lucru se
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")

Rezultatul este n Fig 4.2.

Observaii:
a) Este bine cnd se reprezint grafic mai multe funcii, la apelul rutinei plot s
se specifice xlim=range(x1,x2,x3...), ylim=range(y1,y2,y3,..) unde x1, x2, x3, .. sunt
vectorii cu abscisele coordonatelor punctelor de pe grafic iar y1, y2, y3, .. conin
ordonatele punctelor. Acest lucru ne asigur c toate graficele vor fi complet
reprezentate. Dac la reprezentrile din figura de mai sus mai adugm un grafic ce
are puncte n afara zonei delimitate (n cazul nostru [-3,3][-1,1]) acestea nu vor
apare.
b) Primul grafic se execut cu plot iar celelalte cu lines, ponts sau alte comenzi
de nivel inferior pentru a se aduga elementele la ceea ce este deja reprezentat.
c) Titlurile se pot aduga ntr-o instruciune plot, sau prin comanda title.
Atenie la faptul c adugarea ulterioar a unui titlu nu schimb altul existent ci se
suprapune celui existent.
d) Poziionarea legendei se poate face prin cuvintele topleft, topright,
top, bottomleft, bottomright, bottom, lft, right, sau prin coordonatele x, y
60
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")

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-3 -2 -1 0 1 2 3
-
1
.
0
-
0
.
5
0
.
0
0
.
5
1
.
0
Un exemplu de grafic
Graficele a trei functii
axa X
a
x
a

Y
sin
cos
alta

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=x-
sin(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),
61
main="Al doilea grafic", sub="Graficul functiei z=x-
sin(2*x)^2+2*y^2",
xlab="axa X",ylab="axa Y", zlab="Z",
ticktype="detailed",cex.main=2, cex.sub=2)

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=x-
sin(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=x-
sin(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))

Rezultatul este n Fig 4.3. Se constat c nu se respect paletele de culori utilizate la
fiecare figur. Cnd se utilizeaz o singur culoare pentru suprafa ea este imediat
luat imediat n consideraie pe cnd dac se variaz culoarea de la o faet la alta
atunci paletele utilizate se permut cumva ntre grafice.


axa X
-1.0
-0.5
0.0
0.5
1.0
axa Y
-1.0
-0.5
0.0
0.5
1.0
Z
-2
-1
0
1
2
Primul grafic
Graficul functiei z=x-sin(2*x)^2+2*y^2
axa X
-1.0
-0.5
0.0
0.5
1.0
axa Y
-1.0
-0.5
0.0
0.5
1.0
Z
-2
-1
0
1
2
Al doilea grafic
Graficul functiei z=x-sin(2*x)^2+2*y^2
axa X
-1.0
-0.5
0.0
0.5
1.0
a
x
a
Y
-1.0
-0.5
0.0
0.5
1.0 Z
-2
-1
0
1
2
Al treilea grafic
Graficul functiei z=x-sin(2*x)^2+2*y^2
axa X
-1.0
-0.5
0.0
0.5
1.0
a
x
a
Y
-1.0
-0.5
0.0
0.5
1.0
Z
-2
-1
0
1
2
Al patrulea grafic
Graficul functiei z=x-sin(2*x)^2+2*y^2
Fig 4.3

62
Exemplul 4.3. Pentru adnotri matematice pe grafice se pot obine informaii
din help prin comanda help(plotmath). Expresiile matematice se alctuiesc cu
comanda expression(...) n care se introduce sub forma unei expresii apropiate de cea
latex formula matematic dorit. Pentru a lipi ntre ele mai multe iruri se utilizeaz
comanda paste(sir1, sir2,...). n tabelul de mai jos avem cteva astfel de expresii.


Expresia n R Forma pe grafic dup executia
comenzii text(locator(), ex)
ex=expression(paste(x*y, ", ", x%*%y,", ",
x/y, ", ", x%/%y,", ",x%+-%y))

ex=expression(paste(x^2,", ",x[2],",
",sqrt(x),", ",sqrt(x,3)))
ex=expression(paste(x == y,", ",x!=y,",
",x<=y,", ",x %~~% y,", ",x %==% y))

ex=expression(paste(cdots,", ",x %subset%
y,", ",ldots,", ",x %notsubset% y,", ",x
%in% y,", ",x %notin% y))

ex=expression(paste(hat(x),, , tilde(x),,
,dot(x),, ,ring(x),, ,bar(xyzu),,
,widehat(xyzu)))

ex=expression(paste(x %->% y,, ,x %up%
y,, ,x %=>% y,, ,alpha,, ,Alpha,,
,infinity,, ,nabla))

ex=expression(paste(underline(x),, ,
frac(x, y),, ,sum(x[i], i==1, n),,
,integral(f(x)*dx, a, b),, ,union(A[i],
i==1, n),, ,lim(f(x), x %->% 0)))

ex=expression(paste(y=sqrt(frac(x^2-
1,x^2+1))%*%sin(x)))

ex=expression(paste(bgroup((,frac(x+y,x-
y)+frac(x^2+y^2,x^2-y^2),))^2))


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)
63
ex1=expression(paste(f(x)%==% bgroup("(",frac(x^2-
1,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.5 0.0 0.5 1.0
-
0
.
5
0
.
0
0
.
5
1
.
0
x
f
(
x
)
,
g
(
x
)
Adnotari matematice pe grafice
Graficul a doua functii
f(x)
|
\

x
2
1
x
2
+1
+sin(x)
|
.
|
|
2
g(x)
|
\

log(2+sin(x)) + 1
2+cos(2x)
|
.
|

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)

64
Histograma valorilor y=rnorm(200, mean=2, sd=4)
Valorile lui y
D
e
n
s
i
t
a
t
e
a

v
a
l
o
r
i
l
o
r

l
u
i

y
-5 0 5 10
0
.
0
0
0
.
0
2
0
.
0
4
0
.
0
6
0
.
0
8
0
.
1
0
(x)=
1
4 2t
e
(x2)
2
24
2

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).

x1=runif(1000);x2=rnorm(1000, mean=1, sd=1)
par(mfrow=c(1,2));
qqnorm(x2, main="Q-Q norm pentru o selectie normala",
xlab="Cuantilele teoretice",
ylab="x2=rnorm(100, mean=1, sd=1)", pch="+");
qqplot(x1,x2, main="Q-Q plot pentru doua selectii",
pch="+",
xlab="x1=runif(100)", ylab="x2=rnorm(100, mean=1, sd=1)");
par(mfrow=c(1,1))

+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
++
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
++
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
++
+
+
+
+
++
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++ +
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-3 -2 -1 0 1 2 3
-
2
-
1
0
1
2
3
4
Q-Q norm pentru o selectie normala
Cuantilele teoretice
x
2
=
r
n
o
r
m
(
1
0
0
,

m
e
a
n
=
1
,

s
d
=
1
)
+
++
++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++
+++
+
+
+
0.0 0.2 0.4 0.6 0.8 1.0
-
2
-
1
0
1
2
3
4
Q-Q plot pentru doua selectii
x1=runif(100)
x
2
=
r
n
o
r
m
(
1
0
0
,

m
e
a
n
=
1
,

s
d
=
1
)

Fig 4.6

65

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.

5.1. Tipurile de date n R. Citirea i scrierea lor. Operaii predefinite

Capitolul 2 este dedicat tipurilor de date, operaiilor asupra lor i modalitilor
de a le crea, citi sau extrage din mediul R. n capitolul 3 se da o list mai extins a
operaiilor predefinite asupra datelor recunoscute de R. Aceste operaii sunt prezentate
sub forma unor funcii. Aici menionm doar c datele simple cu care lucreaz R sunt
alctuite din numere, valori booleene, caractere (iruri de caractere), date binare (raw).
Tipurile fundamentale de date compuse din date simple sunt vectorii, matricele,
blocurile multidimensionale (array), data.frame, listele. Se utilizeaz de asemenea NA
pentru date indisponibile i NaN pentru valori nenumerice. Pot fi create tipuri noi de
date.
Un lucru important care trebuie avut n vedere este posibilitatea de grupare a
instruciunilor prin acolade. Astfel {instr1; instr2; instr3} este un grup. Aceste grupuri
apar n general n instruciuni de decizie sau repetiie. Dac sunt pe acelai rnd
instruciunile se separ prin ; iar dac sunt pe rnduri diferite nu e nevoie de vreun
semn de separaie.
Pentru comentarea unor seciuni de program se utilizeaz caracterul # la
nceputul liniei de comentariu.
66
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)


5.2. Instruciunea de decizie

Instruciunea de decizie este IF. Forma ei este la fel ca n alte limbaje:

if (conditie) instr_1 else instr_2

i. conditie este o expresie care d o valoare logic (TRUE, FALSE)
ii. instr_1 este o instruciune sau un grup de instruciuni i la fel instr_2
iii. else nu poate s apar singur pe o linie. Este de preferat s fie pus dup
instruciunea (sau grupul) instr_1.

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

Exist i o funcie ifelse de forma:

ifelse (conditie, da, nu)

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
67

3. Instruciuni de repetiie

Instruciunile de repetiie (ciclare) sunt n R: for, while, repeat. Aceste
instruciuni au formele:
for (var1 in var2) instr
unde var2 este o variabil ce se poate converti la un ir de valori (ca de exemplu
vector sau list), iar instr este o instruciune sau un grup de instruciuni.
while (cond) instr
unde cond este o expresie ce se evalueaz la TRUE sau FALSE, iar instr este o
instruciune sau un grup de instruciuni. Se va avea desigur grij ca variabila cond s
se modifice n grupul de instruciuni instr pentru a deveni la un moment FALSE i a
se opri repetiia.
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
Rezolvare prin repetiie cu while
a=matrix(c(1:12),nrow=3)
s=rep(0,3)
i=1
while(i<=3){
j=1
while (j<=4) {s[i]=s[i]+a[i,j];j=j+1}
i=i+1
}

> s
[1] 22 26 30

Rezolvare prin repetiie cu repeat
68

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

Exemplul 5.4. Date matricele a, b, c de dimensiune 3x4 s se determine
matricea d de dimensiune 3x4 pentru care d[i, j] este media a vectorului format de
a[i, j], b[i, j], c[i, j].
Repetiia cu for ne d dou cicluri:

a=matrix(1:12,nrow=3);
b=matrix(seq(1,2,length=12),nrow=3)
c=matrix(11:22, nrow=3)

d=matrix(rep(0,12),nrow=3)
for (i in 1:3)
for (j in 1:4)
d[i,j]=mean(a[i,j],b[i,j],c[i,j])

> d
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

69

Repetiia prin funcia mapply se realizeaz astfel:

a=matrix(1:12,nrow=3);
b=matrix(seq(1,2,length=12),nrow=3)
c=matrix(11:22, nrow=3)

d=mapply(mean,a,b,c)
d=matrix(d,nrow=3)

> d
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12



5.4. Definirea funciilor proprii

n limbajul R definirea funciilor se face sub forma

nume_functie<-function(argumente) {instructiuni de calcul}

iar apelul funciei se face simplu nume_functie(argumente). Rezultatul ntors de
funcie trebuie s apar ultimul, fr atribuire. O alt posibilitate este instruciunea
return(val). n acest caz, execuia instruciunilor din funcie se ncheie imediat i val
este returnat ca valoare a funciei.

Exemplul 5.5. S definim funcia ( ) xyz x z y x f
2
+ = , , i apoi s o aplicm
argumentelor x=3, y=5, z=9.

f<-function(x,y,z){r<-x^2+x*y*z;r}
f(3,5,9)

[1] 144

n continuare am strns cteva observaii referitoare la funcii

a) Deoarece n definiia funciei am folosit numele x, y, z, dac la apelul
funciei vom utiliza argumentele cu numele lor, atunci ordinea n care apar poate fi
schimbat.

> f<-function(x,y,z){r<-x^2+x*y*z;r}
> f(3,5,9)
[1] 144
> f(y=5,z=9,x=3)
[1] 144
> f(3, z=9,y=5)
[1] 144
> f(3,y=5,9)
[1] 144
> f(3,9,y=5)
[1] 144
70

b) Dac unele argumente sunt prezente cu numele lor i altele fr nume,
atunci cele fr nume trebuie s apar n ordinea n care apar n definiia funciei.

c) Este posibil ca n definiia unei funcii unele argumente s aib valori
implicite prestabilite. n acest caz la utilizarea funciei nu este neaprat necesar ca ele
s fie specificate dect dac se dorete utilizarea lor cu alte valori dect cele implicite.
Mai jos avem un exemplu:

> f<-function(x,y=5,z){r<-x^2+x*y*z;r}
> f(3,5,9)
[1] 144
> f(x=3, z=9)
[1] 144

Un apel f(3,9) pentru funcia precedent genereaz un mesaj de eroare pentru c se
face identificarea x<-3, y<-9 i nu este definit valoarea pentru z.

> f(3,9)
Error in x * y * z : 'z' is missing

d) Putem utiliza n definiia unei funcii i alte funcii definite anterior. De
asemenea putem utiliza n definiia unei funcii argumentul ... (trei puncte) care
reprezint argumente opionale. De obicei aceste argumente sunt transferate funciei
interioare.

> g<-function(a=4,b=6) a+b/2
>
> f<-function(x,y=5,z,...){r1<-x^2+x*y*z; r2<-g(...)
+ r<-r1+r2; r}
>
> f(1,2,3)
[1] 14
> f(1,2,3,4); # a=4 ; b=6 implicit
[1] 14
> f(z=3,x=1,y=2,4,6); #a=4, b=6
[1] 14
> f(z=3,x=1,y=2,4,8); #a=4, b=8
[1] 15
> f(z=3,x=1,y=2,b=8,a=4); #a=4, b=8
[1] 15
> f(z=3,x=1,y=2,b=8); #a=4 (implicit), b=8
[1] 15

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)
71
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

Rezultatele sunt aceleai pentru cele dou metode:

> rez1
[,1] [,2] [,3] [,4]
[1,] 3 72 231 480
[2,] 16 115 304 583
[3,] 39 168 387 696
> rez2
[,1] [,2] [,3] [,4]
[1,] 3 72 231 480
[2,] 16 115 304 583
[3,] 39 168 387 696

f) Variabilele definite n corpul unei funcii, s zicem f, au caracter local. Ele
sunt vizibile doar n corpul funciei f. De asemenea n corpul funciei f se pot utiliza
date sau funcii definite n funcia n care este definit f, sau date ori funcii globale.
Atunci cnd se caut valoarea unei variabile (sau definiia unei funcii) se caut
printre parametrii locali (inclusiv argumentele funciei), apoi printre parametrii locali
funciei superioare (n interiorul creia este definit) s.a.m.d. Modificrile
parametrilor locali nu modific parametrii globali cu acelai nume. Pentru a modifica
n corpul unei funcii un parametru global, s zicem A, trebuie s utilizm
instruciunea de atribuire A<<-expresie. La crearea unei funcii se creaz un
context de vizibilitate (environment) cu ceea ce este vizibil de ctre funcia respectiv.

Comentm acum (i modificm) un exemplu din manual: An introduction
to R , pg. 47 (manualul vine cu distribuia standard de R).

Apelul funciei open.account produce o list ce are ca elemente trei funcii
(deposit, withdraw, balance). Crearea unui cont se face printr-o instruciune de tipul
client=open.account(sumadepusa). Variabila data este produs de program.
Variabila dob reprezint rata anual a dobnzii (compuse) i poate fi modificat de
utilizatorul scriptului: este aceeai pentru orice client



open.account <-
function(total=0,data,dob=0.10){

data=Sys.time()






list(

deposit = function(amount) {
La crearea unui nou cont se apeleaz o
singur dat funcia sub forma
client=open.account()
Sistemul genereaz un context de vizibilitate
pentru rezultatul funciei (n cazul nostru
lista client). Funciile din lista client
au n contextul lor de vizibilitate parametrii
de intrare ai funciei generatoare
open.account . n acest context vor fi
vzute variabilele total, dob,data;
data este data crerii contului

Prima funcie: deposit modific
72
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
},

withdraw <- function(amount) {
dataa=Sys.time()
durata<-as.numeric(dataa) -
as.numeric(data)
durata<-durata/86400
durata<-durata/365
total1<-total*(1+dob)^durata
if(amount > total1)
stop("You dont have that much
money!\n")
total <<- total1 - amount
data<<-dataa
cat(amount, "withdrawn. Your
balance is", total, "\n\n")
},

balance <- function() {
dataa=Sys.time()
durata=as.numeric(dataa) -
as.numeric(data)
durata=durata/86400
durata=durata/365
total1=total*(1+dob)^durata
cat("Your balance is", total1,
"last change
",as.character(data),"\n\n")
}

)
}
valoarea contului innd seama de
dobnd i valoarea depus
dataa este data alimentrii contului
Se convertesc datele n secunde, apoi n
zile, apoi n ani pentru a se calcula
durata de la ultima operaie n cont
Se actualizeaz suma dup formula
total = total(1+dob)
durata
+ amount
Se afieaz informaiile pentru client
Actualizeaz data


A doua funcie: withdraw modific
valoarea contului innd seama de
dobnd i valoarea retras

Se actualizeaz totalul dup formula
Total1 = total(1+dob)
durata

Dac total1 este prea mic, se d mesaj
de eroare
Dac nu, se modific valoarea contului
Actualizeaz data
Mesaj de confirmare


A treia funcie: balance nu modific
nimic n cont, nici data, doar informeaz
clientul asupra sumei disponibile i asupra
datei ultimei operaii n cont.




Dup ce se ruleaz scriptul ce conine funcia open.account se poate lucra n flul
urmtor cu conturile:

> gh<-open.account(10000000)
> gh$deposit(1000000)
1e+06 deposited. Your balance is 1.1e+07

> gh$withdraw(100000)
1e+05 withdrawn. Your balance is 10900001

> gh$balance()
Your balance is 10900002 last change 2011-12-19 01:23:47

73
Se vede cum cu trecerea timpului se adaug dobnda.

g) Printre parametrii unei funcii pot fi alte funcii. De asemenea n corpul unei
funcii pot fi apeluri la ea nsi ceea ce duce la aplicarea recursiv a funciei. n acest
caz e nevoie de condiii care s asigure c numrul de aplicri recusive e finit. Ca
exemplu avem urmtorul script simplu ce calculeaz recursiv termenii irului
Fibonacci.

fib<-function(n){
if(n==1) return(c(1))
if(n==2)return(c(1,1))
s1=fib(n-1)
urm=s1[n-1]+s1[n-2]
return (c(s1,urm))
}
> fib(10)
[1] 1 1 2 3 5 8 13 21 34 55



5.5. Apelul din R al funciilor scrise n C

Apar situaii cnd nu avem n R rutine pentru anumite operaii. Soluia este
scrierea de rutine (funcii) proprii. Utilizarea ntr-o msur mare a instruciunilor de
decizie sau repetiie n R face ca timpul de rulare s creasc mult datorit faptului c
R este un limbaj interpretat. O ieire o reprezint uneori utilizarea de rutine scrise ntr-
un limbaj n care se face compilarea la nivel de cod main, cum ar fi C, Fortran,
Pascal, etc. n R exist mecanisme de apel a funciilor scrise n C ori Fortran precum
i mecanisme de apel ntr-un program extern a unor rutine din R. Ne vom ocupa de
metoda de apel n R a unor rutine scrise n C.
Atunci cnd se apeleaz ntr-un program funcii scrise n alt program trebuie
avute n vedere corespondena tipurilor de date, modul de transfer al datelor spre
rutina apelat, modul de preluare a rezultatelor produse de rutina apelat. n
documentaia standard pentru R gsim urmtoarea coresponden ntre tipurile de date
din R, C, Fortran :

R storage mode C type FORTRAN type
logical int * INTEGER
integer int * INTEGER
double double * DOUBLE PRECISION
complex Rcomplex * DOUBLE COMPLEX
character char ** CHARACTER*255
raw unsigned char * none

Pentru cei care doresc s scrie pachete de programe pentru R utiliznd
limbajul C, n subdirectorul include din directorul unde este instalat R se gsesc
fiiere de definiie pentru diverse tipuri de date i diverse funcii din librrii larg
utilizate. Pentru noi corespondena de tipuri din tabelul de mai sus este suficient.
Cteva observaii sunt de avut n vedere:
a) Datele ntre R i rutine externe se schimb doar prin adrese.
74
b) Rutinele externe nu trebuie s ntoarc vreo valoare (n C ele trebuie s fie
funcii de tip void iar n Fortran trebuie s fie subprograme de tip subroutine)
c) Schimbul de date (parametri de intrare i rezultate) se face doar prin
argumentele funciilor (subrutinelor n Fortran)
d) Rutinele externe (n C ori Fortran) se pun n biblioteci dinamice (.dll n
windows, .so n linux) care se ncarc n R cu comanda dyn.load(nume_librarie, ....) i
se deconecteaz de la R prin comanda dyn.unload(nume_librarie).
e) n principiu se pot utiliza n R i rutine scrise n Pascal dac acestea sunt
declarate de tip C. Declararea n Pascal a unor rutine ca fiind de tip C este important
pentru a se face corect corespondena ntre parametri (n Pascal transmiterea
parametrilor ctre o subrutin se face n ordine invers fa de C). De asemenea
trebuie avut grij la corespondena tipurilor de date (de exemplu double din R
corespunde cu ^double n Pascal)
f) Apelul funciilor C se poate face cu comanda
.C(NAME, ..., NAOK = FALSE, DUP = TRUE, PACKAGE, ENCODING)
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.

|
|
|
|
|
.
|

\
|
7 6 5 4
8 15 14 3
9 16 13 2
10 11 12 1

Ordinea de extragere a elementelor din matrice

Programul de extragere l scriem n C. Am utilizat mediul de programare C++ gratuit
Code:Blocks 8.02 (pentru windows) n care am ales un proiect nou de tip .dll numit
pr1, care va avea ca efect crearea librriei dinamice pr1.dll. In cadrul acestui proiect
au fost create automat dou fiiere main.h i main.dll de mai jos n care partea pe care
am adugat-o este evideniat (se recunoate rutina de extragere a elementelor din
matricea a n vectorul b n ordinea specificat, precum i declaraia c aceast rutin
s aparin librriei numit aici pr1.dll)
Fiierul main.h

75
#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);
}


void DLL_EXPORT rot(int *nlin, double *a,double *b){
int i,j,k,cnt=0;
int n=*nlin,mi=n/2;

for (k=0;k<mi;k++){
for(i=k;i<n-k-1;i++){b[cnt]=a[i+n*k];cnt++;}
for(j=k;j<n-k-1;j++) {b[cnt]=a[n-k-1+n*j];cnt++;}
for(i=n-k-1;i>k;i--){b[cnt]=a[i+n*(n-k-1)];cnt++;}
for(j=n-k-1;j>k;j--) {b[cnt]=a[k+n*j];cnt++;}
}
if(n%2==1) b[cnt]=a[mi+n*mi];
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
LPVOID lpvReserved)
76
{
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
}

Dup compilare i linkeditare (am optat pentru compilatorul GCC) se obine
librria pr1.dll pe care am mutat-o n directorul curent din R.

Programul R n care am utilizat funcia rot este urmtorul:

dyn.load("pr1.dll")
x=1:25
a=matrix(x,ncol=5)

b=rep(0,length(a))
rez<-
.C("rot",as.integer(ncol(a)),as.double(a),as.double(b))

dyn.unload("pr1.dll")

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 6 7 8
9 14 19 18 17 12 13

77
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")




Rezultatul se vede mai jos:

> 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
> aa
[1] 1 2 3 4 5 10 15 20 25 24 23 22 21 16 11 6 7 8
9 14 19 18 17 12 13
>

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)

unde parametrii au aceeai semnificaie ca la apelul funciilor C.


78
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. Rambursri de credite.

Un client face un credit n valoare de S
0
UM la o banc. n urma negocierilor,
obine o rat a dobnzii egal cu i. Dorete s i fac un plan de rambursare n care s
plteasc ratele la momentele de timp t
1
,...,t
n
; ar mai dori s tie i ce suma mai are de
pltit dup fiecare rat.
S presupunem c ratele pltite la momentele t
i
au valoarea r
i
. Partea efectiv
din datorie pltit atunci va fi egal cu a
i
= r
i
D
i
unde D
i
este dobnda pltit la suma
restant pe intervalul de timp (t
i-1
,t
i
). Fie S
i
suma restant la momentul t
i
, dup
achitarea ratei r
i
.
Axioma este c dac dobnda unitar pe intervalul (t
i-1
,t
i
) este d
i
, atunci
dobnda pltit la momentul t
i
va fi egal cu D
i
= S
i-1
d
i
. S notm q
i
= 1 + d
i
.
Cum prima dobnd se aplic la suma total S
0
obinem urmtoarea recuren
pentru sumele restante
a
1
= S
0
- S
1
= r
1
d
1
S
0
S
1
= (1 + d
1
)S
0
r
1
S
1
= q
1
S
0
r
1

a
2
= S
1
S
2
= r
2
d
2
S
1
S
2
= (1 + d
2
)S
2
r
2
S
2
= q
2
S
1
r
2

.....................
S
k
= (1 + d
k
)S
k-1
- r
k
S
k
= q
k
S
k-1
- r
k
(6.1.1)
Putem scrie relaia (6.1.1) i sub forma S
k
+r
k
= q
k
S
k-1
. S notm o
k
= 1/q
k
.
Atunci relaia (6.1.1) devine
S
k-1
= o
k
S
k
+ o
k
r
k
(6.1.2)

Se propun mai multe scenarii.


6.1.1. Rat constant, dobnd simpl

Dobnda fiind simpl, dobnda unitar pe intervalul (s,t) este d(s,t) = i(t-s),
unde i este rata anual a dobnzii. Acum q
j
= 1 + d
j
= 1 + i(t
j
t
j-1
) pentru j > 2, q
1
= 1
+ it
1
. Scenariul presupune rate egale, adic r
1
= ...= r
n
= r .
Rata se calculeaz punnd condiia ca S
n
= 0.
Relaia (6.1.2) implic, din aproape n aproape S
n-1
=ro
n
S
n-2
=r(o
n-1
+o
n-1
o
n
)
S
n-3
= r( o
n-2
+ o
n-2
o
n-1
+ o
n-2
o
n-1
o
n
) ..... de unde gsim rata
n
S
r
o o o + + o o + o
=
... ...
2 1 2 1 1
0
(6.1.3)
Scriptul urmtor calculeaz rata r dup formula (6.1.3) i amortismentele
(a
k
)
1sksn
. Atenie: comentariile scrise cu font Times New Roman nu fac parte din
script, ci sunt comentarii.

79
Se apeleaz prin instruciunea
a = ratadosi(s0,i,t)
Variabilele funciei sunt suma mprumutat s
0
, rata anual a dobnzii, i i
vectorul t cu momentele cnd se fac plile.
Rezultatul se d n forma unei liste. Aadar rata este a[[1]] iar
amortismentele sunt a[[2]].

#functia ratadosi calculeaza rata constanta daca se da
dobinda
#simpla cu rata i, suma de platit
#si daca se da t=(t1,...,tn) momentele de plata a ratelor
ratadosi<-function(s0,i,t)
{n=length(t);q=t;alfa=t;bet=t;s=t;amo=t # iniializri
q[1]=1+i*t[1];for (k in 2:n) {q[k]=1+i*(t[k]-t[k-1])}
## q
1
= 1 + it
1
, k > 2 q
k
= 1 + i(t
k
t
k-1
)
alfa=1/q;for (k in 1:n) {bet[k]=prod(alfa[1:k])}
##o
k
= 1/q
k
,|
k
=o
1
...o
k
r=s0/sum(bet) ## r = s
0
/(|
1
+ |
2
+...+ |
n
)
s[1]=s0*q[1]-r;for (k in 2:n){s[k]=s[k-1]*q[k]-r} ## Relaia (1)
amo[1]=s0-s[1];for (k in 2:n){amo[k]=s[k-1]-s[k]}## a
k
=S
k-1
- S
k

rata=list(r,amo) ## r = rata[[1]], amortismente = rata[[2]]
rata}

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)
13sk s 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

De remarcat c primul amortisment este negativ (s-a acumulat dobnda!) , celelalte
cresc n progresie geometric.

6.1.2. Rat constant, dobnd compus

Singura deosebire este c acum q
1
= ( ) ( ) , 1 1 , 1
1 1

+ = > +
k k
t t
k
t
i q k i

#functia ratadoco calculeaza rata constanta daca se da
#dobinda compusa cu rata i, suma de platit
#si daca se da t=(t1,...,tn) momentele de plata a ratelor
ratadoco<-function(s0,i,t)
{n=length(t);q=t;alfa=t;bet=t;s=t;amo=t
80
q[1]=(1+i)^t[1];for (k in 2:n) {q[k]=(1+i)^(t[k]-t[k-1])}
## ( ) , 1
1

+ =
k k
t t
k
i q
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
dobnzii, ea nu ar fi egal cu i/12, ci cu ( ) 1 1
12
1
+ i . Pentru i = 0,12 ar rezulta c rata
lunar ar trebui s fie 0.95% i nu 1%, aa cum se ia n mod real.
8


6.1.3. Amortismente constante, dobnd simpl

Relaia folosit este r
k
= a + d
k
S
k-1
cu amortismentul a = S
0
/n. Dobnzile unitare
sunt d
1
= it
1
i k > 2 d
k
= i(t
k
t
k-1
)

#functia amordosi calculeaza ratele in ipoteza
#amortismentelor constante
# daca se da dobinda simpla cu rata i, suma de platit s0
#si daca se da t=(t1,...,tn) momentele de plata a ratelor
amordosi<-function(s0,i,t)
{n=length(t);d=t;r=t;amo=s0/n
d[1]=i*t[1];for (k in 2:n) {d[k]=i*(t[k]-t[k-1])}
for (k in 1:n) {r[k]=amo+d[k]*s0*(1 - (k-1)/n)}
# d
k
= i(t
k
t
k-1
)
r}


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.
81
Soluie.

t=13:24/12
> a=amordosi(1200,.12,t);a
[1] 256 111 110 109 108 107 106 105 104 103 102 101

Cu excepia primeia, ratele formeaz o progresie artitmetic descresctore.


6.1.4. Amortismente constante, dobnd compus

Singura diferen fa de scenariul anterior este c dobnzile unitare sunt acum
d
1
= ( ) 1 1
1
+
t
i i k > 2 ( ) 1 1
1
+

k k
t t
i .

#functia amordoco calculeaza ratele in ipoteza
#amortismentelor constante
# daca se da dobinda compusa de rata i, suma de platit s0
#si daca se da t=(t1,...,tn) momentele de plata a ratelor
amordoco<-function(s0,i,t)
{n=length(t);d=t;r=t;amo=s0/n
d[1]=(1+i)^t[1]-1;for (k in 2:n) {d[k]=(1+i)^(t[k]-t[k-
1])-1}
for (k in 1:n) {r[k]=amo+d[k]*s0*(1 - (k-1)/n)}
r}

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


6.1.5. Compararea celor patru scenarii

Dac dorim s comparm cele patru scenarii din punctul de vedere al sumei totale pe
care o avem de plat, putem apela funcia comprate.

#functia comprate compara cele patru scenarii prin suma
totala
comprate<-function(s0,i,t)
{n=length(t)
a1=ratadosi(s0,i,t);a1=a1[[1]]
a2=ratadoco(s0,i,t);a2=a2[[1]]
a3=amordosi(s0,i,t)
a4=amordoco(s0,i,t)
S1=n*a1;S2=n*a2;S3=sum(a3);S4=sum(a4)
scenarii<-c("rate egale ds","rate egale dc","amo egale
ds","amo egale dc")
sume<-c(S1,S2,S3,S4)
82
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


6.1.6. Rat fix de valoare determinat

Revenim la relaia de recuren a sumelor restante, S
k
= q
k
S
k-1
- r
k
i punem alt
ntrebare: dac dorim s pltim o rat fix, r, cte rate avem de pltit? Ultima rat va fi
eventual mai mic. Deci problema este de a calcula numrul N = min{n S
n
s 0}. De
exemplu, n scenariu de dobnd compus, i = 12%, cu termen de gratie de 1 an, cte
rate de 100 de lei ne trebuie pentru a achita creditul de 1200 lei?
Presupunem c plile se fac la momentele t
0
+ nh. Este posibil ca rata s fie
prea mic pentru a putea achita rambursa creditul.
Dac q
1
=( ) 1 1
1
+
t
i i k > 2 q
k
= ( ) 1 1
1
+

k k
t t
i = ( ) 1 1 +
h
i = q, avem
S
1
= S
0
q
1
r, S
2
= S
1
q r = (S
0
q
1
r)q r = S
0
q
1
q r(1 + q), S
3
= S
0
q
1
q
2
r(1 + q
+ q
2
),....i, n general, S
n+1
= S
0
q
1
q
n
r(1 + q +...+ q
n
).
Atunci S
n+1
s 0 S
0
q
1
q
n
s r(1 + q +...+ q
n
) r( 1 + o + ...+ o
n
) > S
0
q
1
, cu
o = 1/q.
Creditul se poate rambursa ntr-un numr finit de rate egale cu r dac exist un
n ca S
n+1
s 0 . Trebuie deci ca
... 1
2
1 0
+ o + o +
>
q S
r , adic deducem condiia
( ) o > 1
1 0
q S r (6.1.4)
Funcia care calculeaz numrul de rate i arat i evoluia sumelor restante
este nrate. Funcia e calculat n ipoteza dobnzii compuse, dar cititorul o poate
modifica uor nlocuind q
1
i q. De asemenea, am pus o limit numrului de rate (pn
la 1000), care poate fi i ea modificat. Sumele restante sunt puse n vectorul s,
iniializat cu zerouri. Dac rata este prea mic, funcia prevede un mesaj n care se d
rata minim cu care se poate acoperi creditul.

#Cite rate in valoare de "r"UM am de platit daca dobinda
este
#compusa, plata se incepe la t0 si se face la intervale de
h ani.
nrrate<-function(r,s0,t0,h,i)
{s=c(rep(0,1000));q1=(1+i)^t0;q=(1+i)^h;alfa=1/q
if(r<=q1*s0*(1-alfa)) {print("rata prea mica,
n=infinit");return()}
s[1]=s0*q1-r;rest=s[1];k=2
while((rest>0)&&(k<1000)){s[k]=s[k-1]*q-r;rest=s[k];k=k+1}
83
rez=c(k-2,s[k-2])
rez=list(rez,s[1:k-1])
rez}

Exemplu de aplicare
n cazul nostru avem r = 100, S
0
= 1200, t
0
= 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 976.89362 886.16316
794.57178
[7] 702.11130 608.77349 514.55002 419.43248 323.41238
226.48118
[13] 128.63021 29.85075 -69.86600

Interpretare: este nevoie de 14 rate, ultima incomplet (de 29.85 lei).Dup
prima rat, suma restant este de 1244 lei, etc; dac am plti 14 rate a 100 lei, ar trebui
s primim napoi 69,87 lei acesta este sensul ultimului numr din tabelul de mai sus.
Dac dorim s pltim n rate de 10 lei scriem

> a=nrrate(10,1200,1,1/12,0.12);a

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!

6.1.7. Rat fix de valoare determinat, dobnd compus aleatoare

Funcia nralrate(r,s0,i0,i1)face o simulare n ipoteza c rata este r,
suma mprumutat este s0 iar rata dobnzii este aleatoare. Mai precis, aici se
presupune c ratele se pltesc la intervale constante de timp t = h i pe fiecare din
aceste momente de timp dobnzile unitare formeaz un i de variabile aleatoare
independente i identic repartizate uniform pe intervalul (i
0
, i
1
). Pentru a nu risca o
bucl infinit, am ales un prag (n = 1000) peste care nu mai verificm evoluia
sumelor restante. Acum N = min{n S
n
s 0} devine o variabil aleatoare.

#presupun ca rata dobinzii este aleatoare. Atunci
#S[n]=S[n-1]qn-r
#dar q[n] sunt presupuse i.i.d. repartizate uniform pe
#intervalul i1,i2
#functia nralrate are ca argumente r (rata), s0 (suma
#imprumutata)
84
#i0 (rata minima a dobinzii)
#i1(rata maxima). qn = 1 + i[n] sunt presupusi i.i.d
nralrate<-function(r,s0,i0,i1)
{q1=1+(i1-i0)*runif(1);s[1]=s0*q1-r;rest=s[1];k=2
while((rest>0)&&(k<1000)){q=1+(i1-i0)*runif(1)
s[k]=s[k-1]*q-r;rest=s[k];k=k+1}
rez=c(k-2,s[k-2])
rez=list(rez,s[1:k-1])
rez

Exemplu de aplicare
Ca s fim consecveni, lum r = 100, S
0
= 1200, i
0
= 0.05, i
1
= 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 993.777986
963.953179
[7] 917.006879 848.128914 749.050657 714.409097 673.291059
585.682507
[13] 504.665078 424.788245 355.531910 284.929749 199.222488
106.591050
[19] 7.846417 -91.942226

Interpretare: trebuie 19 rate, din care 18 complete. Vectorul a[[2]] d
evoluia sumelor restante.

Putem face o analiz statistic a numrului necesar de rate pentru
rambursarea creditului cu ajutorul funciei nralratesim(n,r,s
0
,i
0
,i
1
), care prezint un
vector cu n simulri

##rata aleatoare, uniform repartizata pe (i0,i1), n simulari
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}

A se remarca rndul al treilea: funcia nralrate(...) returneaz o list cu dou
elemente: primul este un vector cu dou componente (n, S
n-1
) cu n numrul de rate i
S
n-1
ultima sum restant iar a doua component este irul sumelor restante. Daca lista
este a, atunci a[[1]] este primul vector iar a[[1]][1] este numrul n.

Exemplu:
nr=nralratesim(10,100,1200,0.05,.15);nr
[1] 16 18 24 20 16 15 20 19 18 16

Dac dorim s estimm repartiia variabilei aleatoare N , putem folosi funcia
table. Iat rezultatul a 10.000 de simulri:

> nr=nralratesim(10000,100,1200,0.05,.15)
> a=table(nr);x=as.numeric(names(a));m=length(x);p=x;for (k
in 1:m) {p[k]=a[[k]]}
> x
[1] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 36
85
> p
[1] 4 89 479 1165 1809 2106 1721 1128 731 387 200
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

x 13.0000 14.0000 15.0000 16.0000 17.0000 18.0000 19.0000
20.0000 21.0000
pp 0.0004 0.0093 0.0572 0.1737 0.3546 0.5652 0.7373
0.8501 0.9232

x 22.0000 23.0000 24.0000 25.0000 26.0000 27.0000 28.0000
29.0000 36
pp 0.9619 0.9819 0.9916 0.9964 0.9982 0.9992 0.9998
0.9999 1

De exemplu, probabilitatea ca N s 20 este cam 85%

6.1.8. Probabilitatea ca n rate n valoare de r UM s fie suficiente

Revenim la relaia de recuren a sumelor restante, S
k
= q
k
S
k-1
- r
k
.
Presupunem, la fel ca n paragraful anterior, c ratele sunt egale ntre ele, r
k
= r. Ne
punem ntrebarea : care este probabilitatea ca n asemenea rate s fie suficiente pentru
rambursarea creditului?
S precizm.
Lucrurile nu sunt lmurite complet din punct de vedere matematic nici mcar
n cazul cel mai simplu. Acesta este urmtorul: presupunem c ratele anuale ale
dobnzilor formeaz un ir de variabile aleatoare independente i identic repartizate
(i
n
)
n
. Atunci factorii de fructificare q
n
vor forma i ei un ir de variabile aleatoare
independente i identic repartizate, i la fel i coeficienii de actualizare o
n
= 1/q
n
.
O rat este suficient dac S
1
s 0 r > q
1
S
0
o
1
> S
0
/r
Dou rate sunt suficiente dac S
2
s 0 S
0
q
1
q
2
r(1+q
2
)s0 o
1
+ o
1
o
2
> S
0
/r
Trei rate sunt suficiente dac S
3
s 0 o
1
+ o
1
o
2
+ o
1
o
2
o
3
> S
0
/r
n general, n rate sunt suficiente dac
S
n
s 0 o
1
+ o
1
o
2
+...+ o
1
o
2
...o
n
> S
0
/r (6.1.5)
Probabilitatea ca aa ceva s se ntmple este F
n
(S
0
/ r) , unde F
n
este funcia de
repartiie a variabilei aleatoare X
n
= o
1
+ o
1
o
2
+...+ o
1
o
2
...o
n
.
Fie F = F
1
funcia de repartiie a coeficientului de actualizare o
1
.
Observm c X
2
= X
1
(1 + o
2
). Dac notm Y
2
= 1 + o
2
, atunci Y
2
este
independent de X
1
, are funcia de repartiie G(x) = F(x 1) i X
2
= X
1
Y
2
.
Cum gsim repartiia lui X
2
?

Dac X i Y sunt dou variabile aleatoare independente, cu repartiiile F i G,
atunci XY are o repartiie H care se obine din F i G printr-o operaie numit
convoluie multiplicativ . S o notm cu -. Deci H = F-G. Dac F i G sunt
repartiii discrete, atunci H se poate calcula astfel
F ~
|
|
.
|

\
|
m
m
p p p
x x x
...
...
2 1
2 1
, G ~
|
|
.
|

\
|
n
n
q q q
y y y
...
...
2 1
2 1
F-G ~
|
|
.
|

\
|
n m
n m
q p q p q p
y x y x y x
...
...
2 1 1 1
2 1 1 1

Scriptul convm face exact acest lucru.

86
##Calculeaza convolutia multiplicativa intre (x,p) si
(y,q)
convm<-function(x,p,y,q)
{xmy=outer(x,y,"*");pmq=outer(p,q,"*")
a=tapply(pmq,xmy,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}

Variabilele sunt vectorii x =(x
i
)
1sism
, p =(p
i
)
1sism
, y = (y
j
)
1sjsn
, q = (q
j
)
1sjsn
.
Scriptul nu verific dac p i q sunt vectori de probabilitate, adic dac sumele sunt 1.
Cititorul este invitat s l modifice n aa fel nct s se dea un mesaj de eroare n caz
c p sau q nu sunt de sum 1.
n primul rnd se calculeaz matricile xmy
i,j
= x
i
y
j
i pmq
i,j
= p
i
q
j
. Aici se vede fora
operaiei outer din R. n rndul urmtor se folosete o instruciune i mai
puternic, tapply(pmq,xmy,sum). Ea face urmtorul lucru: aplic matricii pmq
funcia sum depinznd de xmy. Explicit, al doilea argument (adic xmy) este vzut ca
o colecie de etichete. Se face o list cu aceste etichete i se adun (funcia sum)
elementele din pmq care au aceast etichet.
De exemplu, dac x = (-1,0,1,2), y = -x = (1,0,-1,-2) , p = q = ( , , , ), avem

> xmy=outer(x,y,"*");xmy
[,1] [,2] [,3] [,4]
[1,] -1 0 1 2
[2,] 0 0 0 0
[3,] 1 0 -1 -2
[4,] 2 0 -2 -4

Deci xmy
i,j
= x
i
y
j
. Apar 7 valori: -4,-2,-1,0,1,2

> pmq=outer(p,q,"*");pmq
[,1] [,2] [,3] [,4]
[1,] 0.0625 0.0625 0.0625 0.0625
[2,] 0.0625 0.0625 0.0625 0.0625
[3,] 0.0625 0.0625 0.0625 0.0625
[4,] 0.0625 0.0625 0.0625 0.0625
> a=tapply(pmq,xay,sum);a
-4 -2 -1 0 1 2
0.0625 0.1250 0.1250 0.4375 0.1250 0.1250

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 x
i
y
j
,
sortat n ordine cresctoare iar al doilea cu probabilitile p-q

Exemplu

> a=convm(x,p,y,q);a
87
[[1]]
[1] -4 -2 -1 0 1 2

[[2]]
[1] 0.0625 0.1250 0.1250 0.4375 0.1250 0.1250

S presupunem acum c rata dobnzii este i ~
|
|
.
|

\
|
2 . 3 . 3 . 2 .
20 15 10 5
. Ratele se vd n
primul rnd, exprimate n procente iar probabilitile lor n al doilea rnd. Atunci q
n

~
|
|
.
|

\
|
2 . 3 . 3 . 2 .
2 . 1 15 . 1 1 . 1 05 . 1
iar coeficienii de actualizare o
n
~
|
|
.
|

\
|
2 . 3 . 3 . 2 .
2 . 1
1
15 . 1
1
1 . 1
1
05 . 1
1

Vrem s gsim repartiia lui o
1
+ o
1
o
2
= F-G unde F =
|
|
.
|

\
|
2 . 3 . 3 . 2 .
2 . 1
1
15 . 1
1
1 . 1
1
05 . 1
1
i
G =
|
|
.
|

\
|
+ + + +
2 . 3 . 3 . 2 .
2 . 1
1
1
15 . 1
1
1
1 . 1
1
1
05 . 1
1
1
. Atunci instruciunile sunt

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

Sau, scris i mai explicit: (x,p)-(y,q) = (z,r) cu z un vector cu 16 valori i r de
asemenea cu 16 valori. S-a ntmplat c toate produsele x
i
y
j
au fost diferite.
Probabilitatea P(X > x) este calculat de scriptul tailfrep

##coada unei repartitii discrete (x,p)calculata in t
tailfrep<-function(t,x,p)
{tailfrep=1-sum(p[x<t]);tailfrep}

De exemplu, dac dorim s tim care este probabilitatea ca o sum S
0
= 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

i rspunsul este prob = 0.35. Dac mrim rata la 800,

a=convm(x,p,y,q);prob=tailfrep(1200/800,a[[1]],a[[2]]);prob
prob = 1.

Era i de ateptat.
Cum calculm celelalte probabiliti?
De exemplu X
3
= o
1
+ o
1
o
2
+ o
1
o
2
o
3
= o
1
(1 + o
2
(1 + o
3
))) Observm c, deoarece
variabilele o
i
au fost presupuse independente i identic repartizate, o
2
(1 + o
3
) are
88
aceeai repartiie ca i X
2
iar o
1
are aceeai repartiie ca i o
3
. Ca atare X
3
are aceeai
repartiie ca o
3
(1 + X
2
) .
Mai general, X
n
= o
1
(1 + (o
2
+ o
2
o
3
+ ....+ o
2
...o
n
)) are aceeai repartiie cu o
n
( 1 +
o
1
+...+o
1
...o
n-1
) , adic cu o
n
(1 + X
n-1
). Dac notm faptul c dou variabile
aleatoare au aceeai repartiie cu X
D
= Y, putem scrie
X
n

D
= o
n
(1 + X
n-1
) (6.1.6)
Sau, n termeni de repartiii,
F
n
= F-h(F
n-1
) (6.1.7)
unde h(F
n-1
) este repartiia variabilei aleatoare X
n-1
+ 1.
Scriptul convmrep calculeaz repartiia lui X
n


##convolutia multiplicativa pentru alfa: F_n+1 =
F_n*delta(1)convmultF
convmrep<-function(n,x,p)
{y=1;q=1
for (i in 1:n) {a=convm(x,p,y,q);y=a[[1]]+1;q=a[[2]]}
a}

De exemplu, pentru a afla repartiia lui X
4
scriem

a=convrep(4,x,p);x1=a[[1]];p1=a[[2]]

Vectorii x1 i p1 vor avea lungimea de 256. Valoarea minim pentru x1 este
2.588735 iar cea maxim este 3.545951. Probabilitatea ca 4 rate n valoare de 400 de
lei s fie suficiente este dat de comanda

a=convmrep(4,x,p);x1=a[[1]];p1=a[[2]];prob=tailfrep(1200/400,x
1,p1);prob

i este egal cu 0.5361
Dac dorim s mrim probabilitatea, mrim puin rata la 450 lei

a=convmrep(4,x,p);x1=a[[1]];p1=a[[2]];prob=tailfrep(1200/450,x1,p1);
prob
[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 X
4
este de 256; n principiu este de 4
n

valori. De exemplu, la n = 10

a=convrep(10,x,p);x1=a[[1]];p1=a[[2]]

vectorul x1 are n= 1048576 componente. Calculul dureaz 5 minute. Nu o s
afim toate valorile, ci doar un sumar prin instruciunea summary

summary(x1)
Min. 1st Qu. Median Mean 3rd Qu. Max.
4.192 5.251 5.574 5.599 5.921 7.722

Deci minimul este 4.192 iar maximul este 7.722.
89
Probabilitatea ca acest credit s fie acoperit n 10 rate a 200 de lei este

prob=tailfrep(1200/200,x1,p1);prob = 0.178917

iar n rate de 250 lei este

prob=tailfrep(1200/250,x1,p1);prob = 0.9737461
Funcia gfrep(n,x,p) face graficul funciei de repartiie a repartiiei (x,p)
n n puncte echidistante calculate ntre min x
1
i max x
1
.Iat graficul funciei de
repartiie al lui X
10
4.5 5.0 5.5 6.0 6.5 7.0 7.5
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
t
f
r
p

Fig 6.1

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 x
1
min x
1
)/998 care, n ipoteza c
repartiia lui F
n
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 6.5 7.0 7.5
0
.
0
0
.
5
1
.
0
1
.
5
2
.
0
2
.
5
3
.
0
t
d
e

Fig 6.2
90

Pentru valori mai mari ale lui n nu este realist s aplicm acest algoritm: dac la n
= 10 X
n
are 1048576 de componente, la n = 20 o s aib 10
12
. Am putea mri
numrul de iteraii dac am modifica problema: dac rata dobnzii nu are dect dou
valori i ~
|
|
.
|

\
|
5 . 5 .
15 . 0 10 . 0
. Ratele se vd n primul rnd, exprimate n procente iar
probabilitile lor n al doilea rnd. Atunci q
n
~
|
|
.
|

\
|
5 . 5 .
15 . 1 10 . 1
iar coeficienii de
actualizare o
n
~
|
|
.
|

\
|
5 . 5 .
15 . 1
1
10 . 1
1
. Atunci am putea calcula repartiia chiar i pentru X
20

2 3 4 5 6 7 8
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
t
f
r
p

Fig 6.3

i densitatea
2 3 4 5 6 7 8
0
.
0
0
.
5
1
.
0
1
.
5
2
.
0
2
.
5
3
.
0
t
d
e

Fig 6.4

Probabilitatea ca 20 de rate a 100 de lei s fie suficiente este

prob=tailfrep(1200/250,x1,p1);prob = 0.1249514

91

6.1 9. Calculul mediei i varianei variabilelor X
n
= o
1
+o
1
o
2
+...+o
1
o
2
...o
n


Dac n este mare de ordinul zecilor, atunci algoritmul de mai sus nu poate fi
aplicat dac inem ca modelul s fie ct de ct realist. Dar dac presupunem c
variabilele o
i
e (0,1) sunt independente i identic repartizate, atunci putem ncerca
estimri bazate pe inegaltatea lui cebev. Chiar dac sunt slabe, ne dau o idee despre
repartiie. S presupunem c
Eo
i
= a, Eo
i
2

= b, EX
n
= , Var(X
n
) = v (6.1.8)
Datorit faptului c variabilele (o
i
)
i
au fost presupuse independente, avem
= Eo
1
+ Eo
1
Eo
2
+....+ Eo
1
Eo
2
...Eo
n
= a +a
2
+...+ a
n
, adic
=
( )
a
a a
n

1
1
(6.1.9)
Pe de alt parte v = Var
i
n
i
o o
=
...
1
1
=
j i
j i
c
,
,
unde c
i,j
= ( )
j i
o o o o ... , ... cov
1 1
=
E( )
j i
o o o o ... ...
1 1
- a
i+j
. Dac i < j avem c
i,j
= b
i
a
j-i
a
i+j
, deci
c
i,j
= b
min(i,j)
a
i j
(6.1.10)
n concluzie, dup efectuarea calculelor ajungem la
v =
( ) ( ) ( ) ( )
2
1 1 1
1
1
1
1
1
1
1
2
|
|
.
|

\
|

+
|
|
.
|

\
|


a
a a
b
b b
b a
b a ab
b
b b
a
a
n n n n n
(6.1.11)
S presupunem, ca la exemplul de la paragraful 7, c rata dobnzii este repartizat
Uniform(0.05, 0.15)
Atunci q ~ Uniform(1.05, 1.15). Cum U ~ U(o,|), E
o |
o |
=
ln ln 1
U
i
E
o|
=
1 1
2
U
avem, n cazul nostru, a =
o |
o | ln ln
, b =
o|
1


alfa=1.05;beta=1.15;a=(log(beta)-log(alfa))/(beta-alfa);b=1/alfa/beta

Rezult a = 0.9097178, b = 0.8281573

Scriptul urmtor, medvar(n,a,b) calculeaz media i variana v

##calculez media si varianta lui X_n
#=alfa_1+alfa_1alfa_2....
##daca Ealfa_n = a, Ealfa_n^2=b
medvar<-function(n,a,b){
mu=a*(1-a^n)/(1-a)
s=b*(1-b^(n-1))/(1-b)-a*b*(a^(n-1)-b^(n-1))/(a-b)
v=2*a*s/(1-a)+b*(1-b^n)/(1-b)-(a*(1-a^n)/(1-a))^2
answ=list(rate=n,media=mu,varianta=v)
answ}

De exemplu, dac n = 60, atunci X
60
are media 10.04189 i variana 0.402313

ans=medvar(60,a,b);ans
$rate
[1] 60

92
$media
[1] 10.04189

$varianta
[1] 0.402312

Atunci abaterea medie ptratic o este 0. 6342815 . Deci P( 10.02 k0.63 <
X
20
< 10.02 + k0.63) > 1 1/k
2
. O aproximaie bun este c P( 10.02 k0.63 < X
20
)
> 1 -
2
2
1
k
. Pentru k = 4, gsim c P(X
20
>7.503) > 96.88%. Dac S
0
= 1200, punem
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.

6.2. Probabilitatea de ruin

O companie pltete n fiecare zi/sptmn/lun (depinde cum se face
balana) X
n
lei i ctig Y
n
lei. Pierderea sa zilnic este atunci
n
= X
n
Y
n
.
Pierderea dup n zile este
S
0
= 0, n > 1 S
n
=
1
+ ...+
n
(6.2.1)
Dac admitem (o simplificare matematic!) c variabilele (X
n
)
n
sunt i.i.d.,
variabilele (Y
n
)
n
sunt i ele i.i.d. i c X
n
este independent de Y
n
pentru orice n, atunci
repartiia variabilei aleatoare S
n
este convoluia repartiiilor variabilelor aleatoare
n
.
Iar repartiia lui
n
este convoluia dintre repartiia F
X
a variabilelor X
n
i repartiia F
-Y

a variabilelor -Y
n
. Convoluia se noteaz cu -.
Vom considera repartiiile F
X
i F
Y
ca fiind discrete altfel nu prea putem
folosi calculatorul . Atunci F
X
=
|
|
.
|

\
|
m
m
p p p
x x x
...
...
2 1
2 1
, F
Y
=
|
|
.
|

\
|
m
m
p p p
y y y
...
...
2 1
2 1
i rezult
c
F
X
-F
Y
=
|
|
.
|

\
| + + +
n m
m m
q p q p q p
y x y x y x
...
...
2 1 1 1
2 1 1 1
. Fiind discrete, cele dou repartiii pot fi
codificate prin (x,p) i (y,q). n cazul acesta putem scrie (x,p) - (y,q) = (x
1
,p
1
)
Scriptul conva(x,p,y,q) calculeaz exact acest lucru: produce vectorii x
1

i p
1
. Este o operaie mai obinuit dect convoluia multiplicativ prezentat n
capitolul anterior. Diferena este c vaorile x
i
i y
j
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}
S presupunem, ca s revenim la scenariul nostru, c X
n
~
|
|
.
|

\
|
1 . 2 . 4 . 3 .
10 3 1 0
.
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
93
10%. Ctigurile le presupunem a avea repartiia Y
n
~
|
|
.
|

\
|
1 . 2 . 3 . 4 .
4 3 2 1
. Am ales
exemplul n aa fel nct EX
n
= EY
n
= 2. Care este repartiia lui
n
?
Instruciunile vor fi

x=c(0,1,3,10);y=c(1,2,3,4);p=c(3,4,2,1)/10;q=c(4,3,2,1)/10
a=conva(x,p,-y,q);a
$x1 -4 -3 -2 -1 0 1 2 6 7 8 9
$p1 0.03 0.10 0.17 0.26 0.20 0.06 0.08 0.01 0.02 0.03 0.04

Probabilitatea s nu avem pierderi este este P(
n
s 0), pentru care avem scriptul

frep<-function(t,x,p)
{frep=sum(p[x<=t])frep}

Rezult concret frep<(0,x1,p1)= 0.76

Dac dorim s calculm repartiia sumei S
n
apelm funcia convarep. De exemplu,
pentru n = 3 avem

a=conva(x,p,-y,q);x1=a[[1]];p1=a[[2]];a=convarep(3,x1,p1);a
$xn
[1] -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5
6
[20] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27
$yn
[1] 0.000027 0.000270 0.001359 0.004762 0.012921 0.028188 0.050933 0.077658
[9] 0.100392 0.111242 0.106719 0.088602 0.065603 0.045132 0.030813 0.027390
[17] 0.031509 0.037536 0.041444 0.038796 0.030717 0.020202 0.012105 0.006282
[25] 0.003435 0.003792 0.004395 0.005130 0.004788 0.003618 0.001993 0.000870
[33] 0.000405 0.000056 0.000111 0.000174 0.000219 0.000204 0.000144 0.000064

Pentru probabilitatea de a nu fi n pierdere

x1=a[[1]];p1=a[[2]];prob=frep(0,x1,p1);prob = 0.648676

Observm c este mai mic.
S presupunem acum c avem o rezerv de u UM. Dac pierderea depete u,
declarm faliment. Care este probabilitatea de faliment dup n zile?
Putem reformula problema n termeni de pierdere maxim.
Fie L
n
= max (S
0
,S
1
,...,S
n
). Aceasta este pierderea maxim pe care o avem dup n
zile. Ruina apare dac L
n
> u. Probabilitatea P(L
n
> u) se noteaz cu
n
(u) i se
numete probabilitatea de ruin dup n pai. Observm c ea este coada funciei de
repartiie a pierderii maxime L
n
.
Fie F = F
X
-F
-Y
repartiia pierderii
n
i F
n
repartiia sumei S
n
.
Observm c L
1
= (
1
)
+
. Dac o variabil aleatoare are repartiia F, notm cu
F
+
repartiia prii sale pozitive. Adica F
+
(x) = F(x) dac x > 0 i F
+
(x) = 0 dac x < 0.
Aadar F
1
= F
+

Avem apoi L
2
= max (0,
1
,
1
+
2
) = max(0,
1
+ 0,
1
+
2
) = max(0,
1
+
max(0,
2
)). Dar
1
are aceeai repartiie cu
2
iar max(0,
2
) are aceeai repartiie ca i
L
1
= (
1
)
+
, deci L
2
are aceeai repartiie ca (L
1
+
2
)
+
. n concluzie, repartiia sa va fi
F
2
= (F
1
-F)
+
.
94
Analog avem L
3

D
= (L
2
+
3
)
+
i, n general rezult recurena
L
n+1

D
= (L
n
+
n+1
)
+
F
n+1
= (F
n
-F)
+
(6.2.2)
Scriptul care calculeaz partea pozitiv a unei repartiii este ppos

## partea pozitiva a unei repartitii
ppos<-function(x,p)
{a=data.frame(v=c(0,x[x>0]),p=c(sum(p[x<=0]),p[x>0]))
a}
cel care calculeaz partea pozitiv a unei convoluii este convap

##convolutia pozitiva a doua repartitii
convap<-function(x,p,y,q)
{a=conva(x,p,y,q);x1=a[[1]];p1=a[[2]]
a=ppos(x1,p1)
a}
iar cel care calculeaz convoluia pozitiv iterat, adic exact repartiia F
n
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}
Astfel, dac dorim s calculm repartiia pierderii maxime dup 10 zile,
folosim comanda
a=convaprep(10,x,p,y,q);a
v p
0 3.176752e-01
1 6.331282e-02
2 6.736288e-02
3 4.082990e-02
4 4.043586e-02
5 4.000655e-02
6 4.474262e-02
7 4.794617e-02
8 4.961629e-02
9 4.887334e-02
10 3.192275e-02
11 2.745033e-02
12 2.284033e-02
13 2.112670e-02
14 1.962573e-02
15 1.826939e-02
16 1.636947e-02
17 1.408383e-02
18 1.158424e-02
19 9.172632e-03
...............
95
Rezultatul este prezentat sub forma unei matrici N 2, unde N este numrul de valori
pe care le poate lua S
n
. 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(L
10
> 20) . Pentru ea avem la dispoziie funcia tailfrep

prob=tailfrep(20,x1,p1);prob = 0.04675292

Dar dup 100 de zile?

> tailfrep(20,x1,p1); prob =0.4706843

Deja probabilitatea este aproape de .
Dup 200 de zile, probabilitatea este
200
(20) = 0.6063088
De curiozitate,
200
(100) = 0.0224711. Probabilitatea de ruina este de doar
2.2% dac se dispune de o rezerv de 100 lei.
Se poate arta c dac EX > EY ( acesta este cazul nostru), ruina este sigur.
Adic
n
(u) 1 dac n indiferent de capitalul iniial u. Este adevrat c dac
EX = EY se converge lent.
Ruina nu este sigur doar dac EX < EY.
S nlocuim n exemplul nostru probabilitile n aa fel nct
X
n
~
|
|
.
|

\
|
1 . 1 . 2 . 6 .
10 3 1 0
. Acum EX = 1.5, E
n
= - 0.5, deci ruina nu mai este
sigur. Repartiia lui L
100
e calculat cu instruciunile

> 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. Max.
0 225 450 450 675 900
> tailfrep(20,x1,p1); prob = 0.135263

Un capital iniial de doar 20 UM face ca probabilitatea de ruin dup 100 de
zile s fie n jur de 13.5%.
Putem compara aceast probabilitate cu marginea dat de Lundberg.
Notm (u) = lim
n

n
(u). Marginea lui Lundberg este (u) s e
-Ru
unde R
este soluia ecuaiei m

(t) = 1.

##calculul functiei generatoare de momente
mgf<- function(t,x,p)
{y=exp(t*x); mgf=y%*%p
mgf}

Soluia este R = -0.08551
Marginea Lundberg: (20) s e
-20u
= e
-1.7102
= 0.1808296
Marginea Lundberg este una pesimista.


96
6. 3. Probleme de asigurri. Suma daunelor, recurena Panjer

Pentru un asigurator, fiecare client reprezint o cerere potenial de daun,
deci el trebuie s fie pregtit s i onoreze obligaiile. Ce rezerv trebuie s aib?
n cel mai simplu model, clienii sunt modelai printr-un ir de variabile
aleatoare i identic repartizate (X
n
)
n
cu o funcie de repartiie F. Acesta se numete un
portofoliu omogen de tip F. n planificarea rezervei, mrimea N a portofoliului (adic
numrul de clieni de tip F) este necunoscut. Este o alt variabil aleatoare N cu
valori numere naturale. n modelul cel mai simplu, contorul N va fi independent de
variabilele (X
n
)
n
.
Atunci suma pe care trebuie s o aib la dispoziie managerul va fi o variabil
aleatoare
S
N
= X
1
+ X
2
+ ...+ X
N
(dac N >1) sau S
N
= 0 (dac N = 0) (6.3.1)

Asiguratorul i va alege un risc o ( de exemplu o = 5%, o = 1% etc) i va
aloca portofoliului de tip F o suma n aa fel ca P(S
N
> ) s 1 - o
Ca s fie posibil acest lucru, va trebui s tie repartiia lui S
N
. De regul, acest
lucru este imposibil. O prim abordare ar fi s se foloseasc inegalitatea lui Cebev
P(S
N
ES
N
> ko(S
N
)) < 1/k
2
(6.3.2)
Sau, acelai lucru, dar pus n form afirmativ
P(ES
N
- ko(S
N
) s S
N
s ES
N
+ ko(S
N
) >1 1/k
2
(6.3.3)
pentru c exist formule pentru ES
N
i Var(S
N
) , numite formulele lui Wald
9

ES
N
= EX
1
EN, Var(S
N
) = Var(X
1
)EN + Var(N)E
2
X
1
(6.3.4)
Exemplul 1. S spunem c X
n
~ Bin(10, ) i N ~ Poisson(100). Ne ateptm s avem
n jur de 100 de clieni i fiecare s cear, n medie 5 lei. Ce sum s avem pregtit?
Avem EX
1
= 10 = 5, Var(X
1
) = 10 (1 ) = 2.5, EN = 100, Var (N) = 100
Rspuns. ES
N
= 5100 = 500, Var(S
N
) = 2.5100 + 1005
2
= 2750 o(S
N
) = 2750
52.44
Aplicnd (6.3.4) vedem c P(500 - k52.44 s S
N
s 500

+ k52.44) >1 1/k
2

Alegnd k = 10, avem P(S
N
s 1024) > 0.99 . Deci ar trebui planificai 1024 de lei.
Inegalitatea lui Cebev poate fi mbuntit, dac nlocuim variana cu semivariana
superioar Var
+
(X) = E(X EX)
+
2
i abaterea standard cu abaterea superioar o
+
(X).
S-a constatat empiric faptul c nu se greeete prea mult dac se ia Var
+
(X) = Var(X)/2
o
+
= o/ 2
Inegalitatea (3.3) devine
P( S
N
s ES
N
+ ko(S
N
)/ 2 )>1 1/k
2
(6.3.5)
n cazul exemplului de mai sus, ar rezulta P(S
N
s 500 +370.8) > 0.99 P(S
N
s 871)
> 0.99
Parc ar fi suficieni 871 lei, nu 1024. Poate c e nevoie i de mai puini?
Dac dorim s calculm o limit i mai precis, ar trebui s putem calcula
repartiia lui S
N
.
Uneori acest lucru este posibil. Dac acceptm c X
n
au o repartiie discret,

9
Vezi, de exemplu Gheorghia Zbganu, Metode matematice n teoria riscului i actuariat, Editura
Universitii Bucureti, 2004
97
X
n
~
( ) ( ) ( )
|
|
.
|

\
|
k p .... 1 p 0 p
k ... 1 0
i c N ~
( ) ( ) ( )
|
|
.
|

\
|
... 2 1 0
... 2 1 0
q q q
, atunci S
N

~
( ) ( ) ( )
|
|
.
|

\
|
... 2 1 0
... 2 1 0
f f f
i probabilitile f(n) se pot calcula.
ntr-adevr,
f(j) = P(S
N
= j) = ( ) =
=
j
n
j n
q j S P
1
(6.3.6)
Pentru probabilitile ( ) j S P
n
= avem la dispoziie scriptul convarep

Convarep<-function(n,x,p)
{y=0;q=1
for (i in 1:n){a=conva(x,p,y,q);y=a[[1]];q=a[[2]]}
xn=a[[1]];yn=a[[2]]
a=list(xn=xn,yn=yn)}

care calculeaz a n a convoluie a repartiiei (x,p) a lui X
n
.
Dificultatea n programare nu ar fi aa de mare; facem o matrice pr
j,i
= P(S
j
=
i)P(N = i) i calculm sumele de la (3.6)
Iat scriptul convarepN (convoluii aditive repetate de N ori) care calculeaz
probabilitile f
j
i funcia de repartiie F(j) = f
0
+ + f
j


## functia convarepN calculeaza repartitia sumei S_N
## daca nici x nici N nu au prea multe valori
convarepN<-function(x,p,N,q){
nx=length(x);nN=length(N);nmax=nx*nN;f=c(rep(0,nmax));F=f
pr=c(rep(0,nN*nmax));dim(pr) = c(nN,nmax)
pr[1,1]=q[1]
for (j in 2:nN){a=convarep(j-1,x,p);p1=a[[2]];nj=length(p1)
for (i in 1:nj) {
pr[j,i]=p1[i]*q[j]
}}
for (j in 1:nmax) {f[j]=sum(pr[,j])}
for (j in 1:nmax) {F[j]=sum(f[1:j])}
a= list(f=f,F=F)a}

Rezultatul este prezentat ntr-o list. Apelarea se face prin comanda

a= convarepN(x,p,N,q);f=a[[1]];F=a[[2]]

Problema este c prin apelarea scriptului convarep se face un consum mare de
resurse. De exemplu, dac N ~ Uniform({0,1,...,40} i X
n
~ Binom(10, ), rularea
scriptului convarepN dureaz 2 minute. Scriptul se poate optimiza, renunnd la
scriptul convarep, dar programul se mai complic. Putem compara ct de eficient este
metoda inegalitii lui Cebev fa de cea exact.
Exemplul 2. X
n
~ Binom(10, ), N ~ Uniform({0,1,...,40} EX = 5, Var(X)
= 2.5, EN = 20, Var(N) = 140, ES
N
= 520 = 100, Var(S
N
) = Var(X
1
)EN + Var(N)E
2
X
1

= 2.520 + 1405
2
= 3550, aadar ES
N
= 100, o(S
N
) 59.58. Formula (3.5) ne d P( S
N

s 100 + k 42.13075)>1 1/k
2
. Dac dorim un interval de predicie cu risc 1%
suntem forai s lum k = 10 i obinem predicia S
N
s 521. Adic managerul de care
98
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. ntr-
adevr, F(207) = 0.990797, F(206) = 0.9892509
10
. De altfel, marginea dat de
inegalitatea Cebev este absurd, cci S
N
nu ia dect 451 de valori.
Exist cazuri n care calculul repartiiei lui S
N
se poate face cu mult mai rapid,
i cu resurse mult mai puine, prin algoritmul lui Panjer.
Definiie. Variabila aleatoare N ~
|
|
.
|

\
|
....
... 2 1 0
2 1 0
q q q
se numete contor de tip
Panjer dac q
0
> 0 i exist a,b e 9 n aa fel nct p
n
= p
n-1 |
.
|

\
|
+
n
b
a
11

Exist trei tipuri de contoare de tip Panjer
- N ~ Bin(n,o) a =
o
o

1
, b =
( )
o
+ o
1
1 n

- N ~ Poisson() a = 0, b =
- N ~ Negbin(n, o) a = 1 - o, b = (1 - o)(n-1)
Panjer a artat c dac X
n
~
|
|
.
|

\
|
k
p p p
k
...
... 1 0
1 0
atunci numerele f
n
= P(S
N
= n)
satisfac recurena

f
0
= g(p
0
), n > 1 f
n
= |
.
|

\
|
+

=

n
j
j n j
f p
n
bj
a
ap
1
0
1
1
(6.3.7)
Aici g(x) =

=0 n
n
n
x q este funcia generatoare a contorului N.
Pe baza acestei recurene se poate face un algoritm de calcul rapid al
convoluiei F
-n
pe care l prezentm n scriptul convrap(x,p,N,epsilon).
Ideea este c dac X
n
~
|
|
.
|

\
|
k
p p p
k
...
... 1 0
1 0
i Y
n
= (X
n
X
n
> 0) ~
|
|
|
.
|

\
|

0 0
1
0
0
1
...
1 1
... 2 1
p
p
p
p
p
p
k
k ,
atunci X
1
+ ....+ X
n

D
= Y
1
+ ...+ Y
N
unde N ~ Binom(n,1 p
0
) este independent de (X
n
).
12

n cuvinte, la adunare nu conteaz zerourile, iar numrul variabilelor aleatoare
X
k
diferite de 0 este o variabil aleatoare N ~ Binom(n, P(X
1
> 0))= Binom(n, 1 p
0
).

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), Ee
tY
= E(e
tX
X > 0) = E(e
tX
; X > 0)/(1- p
0
) = (m
X
(t) p
0
) /(1- p
0
).
Fie S = X
1
+ ...+ X
n
i T = Y
1
+ ...+ Y
N
. Atunci, cum N este independent de X, Ee
T
= g
N
(m
Y
) = (p
0
+ (1
p
0
)m
Y
)
n
=
( )
n
X
p
p
p m
p
|
|
.
|

\
|

+
0
0
0
0
1
1
= (m
X
)
n
= Ee
S
. Adic S
D
= T.


99
Deoarece g
N
(x) = (p
0
+ (1-p
0
)x)
n
, f
0
= p
0
n
, a =
0
0
1
p
p
, b =
( )( )
0
0
1 1
p
n p +
iar
recurena devine f
k
=
( )
( ) = |
.
|

\
|
+
=
=

k
j
j k
f j Y p
k
bj
a
Y ap
1
0 1
1
= |
.
|

\
| +
+
=

k
j
j k j
f p
k
j n
p
1
0
) 1 (
1
1
,
deci
f
0
= p
0
n
, k > 1 f
k
= ( ) +
=

k
j
j k j
f p k j n
kp
1
0
) 1 (
1
(6.3.8)
Vom face un script care s calculeze f
S
i F
S
, probabilitile i funcia de repartiie
ale lui S. Apar dou probleme de programare:
- n principiu, cu excepia primului caz, S va avea o infinitate de valori. Nici un
calculator nu poate calcula aa ceva. Deci trebuie s ne hotrm pn unde
calculm probabilitile f
k
. Vom alege un c i vom calcula f
k
pn la primul k
la care F(k) > 1 - c
- n R, vectorii sunt numerotai cu indici ncepnd de la 1, i nu de la 0.
Trebuie mare atenie ca s nu ne ncurcm n indici. Dac x,p,f sunt gndii ca
vectori, atunci f
j
= f[j+1], p
j
:=p[j+1] i recurena devine
f[1] = g(p[1]), f[n+1] = + + |
.
|

\
|
+

=
n
j
j n f j p
n
bj
a
ap
1
] 1 [ ] 1 [
] 1 [ 1
1

- Totui, f i F trebuie iniializai ca vectori de o anumit lungime. Am ales
aceast lungime s fie egal cu nmax= ES + 15o(S). Inegalitatea lui Cebiev
spune c P( S >nmax) < 1/5
2
= 0.44%. n realitate ea este mult mai mic.


Scriptul urmtor face acest lucru. El este gndit ca o funcie
Panjer(x,p,tip,N,pN,epsilon).
Mai nti verificm dac datele de intrare sunt corecte: x trebuie s fie un vector cu
numere naturale, p un vector cu numere positive de sum 1 de aceeai lungime ca i x
iar pN trebuie s fie un numr cuprins ntre 0 i 1.
Apoi standardizm pe x i p. Sortm pe x n ordine cresctoare i completm la
vectorul p locurile libere 0. De exemplu, dac x = (5,3,6), p=(0.5, 0.2, 0.3) scriem x =
(0,1,2,3,4,5,6) , p = (0, 0, 0, .2, 0, .5, .3)
Verificm daca tip este una din literele b, p sau n. Dac tip = b, avem
de a face cu un contor de tip Binom(N,pN). Nu verificm dac N este numr natural, e
rspunderea utilizatorului. Dac tip = p atunci contorul este repartizat Poisson(N).
Nu mai verificm pN. Dac, n fine, tip = n, atunci N ~ Negbin(N,pN). Este o
repartiie negative binomial generalizat, n sensul c N nu trebuie s fie neaprat
numr natural.
Urmtorul pas este s calculm ES i Var(S)
Aplicnd formulele lui Wald
13
gsim
ES = EX EN, VarS = EN Var(X) + E
2
N Var(N) (6.3.9)
Pe baza lor calculm dimensiunea lui f i F, anume nmax = ES + 15o(S), sue = 1
epsilon.
Acestea au fost pregtirile. Partea principal a scriptului este calculul recurenei
(6.3.7). Cum recurena (6.3.7) este liniar n raport cu f
0
, preferm s punem f[1] = 1
i s nmulim la sfrit cu
f
0
= g(p
0
)

13
Vezi de exemplu G. Zbganu, op. Cit, p. 164
100

Scriptul este urmtorul:

##functia Panjer (x,p,"type",N,pN,epsilon) calculeaza repartitia lui S(N),
## N este un contor Panjer(a,b)
## daca type = "p", N ~ Poisson (N);se ia in considerare doar N, pN=0
## daca type = "b" e vorba de un contor binomial de parametru (N,pN)
## daca type = "n" e contor negativ binomial Bin(N,pN)
## 1. verificam daca x,p sunt de aceeasi lungime si daca p e probabilitate
## 2. Daca nu, mesaj de eroare, daca da, calculam a,b, f0
## 3. Calculam nmax = length(f) in asa fel incit sa evitam dimensiuni prea
mari
## nmax= int(ES + 10 sig(S))+1 cu ES = EXEN, sig^2(S)= ENVarX+VarNE^2X
## 4. Completam x ca sa fie de forma 0,1,...,(nmax-1) si p ca length(p)=nmax
## calculam f si F pina cind F*f0>(1-epsilon);
## Ca sa evitam zerourile de masina incepem cu f[1]=1
## recurenta este f[n+1]=sum(f=p[j+1]f[n+1-j](a+bj/n), 1<=j<=n

Panjer<-function(x,p,type,N,pN,epsilon)
{x = floor(abs(x)); pN=min(pN,1) ## x are componente nr naturale i pN<1
nx=length(x);np=length(p);
if (nx!=np) {print ("Eroare: x si p au lungimi diferite");return()}
for (i in 1:nx)
{if (p[i]<0) {print("Eroare:p nu e probabilitate, are componente
negative");return()}
if (abs(sum(p)-1)>10^(-9)) {print("Eroare:p nu e probabilitate, suma nu e
1");return()}
## standardizam pe x si p
o=order(x); x=x[o];p=p[o] ## am aranjat ca x sa fie crescator
n1=max(x)+1; x1=1:n1;x1=x1-1;p1=c(rep(0,n1))
for (j in 1:nx) {p1[x[j]+1]=p[j]};sue=1-epsilon

#3 intializam a,b,f0, ES, VarS
mux=x%*%p;varx=(x^2)%*%p - mux^2;qN=1-pN
if (type=="b")
{muN = N*pN;varN=N*pN*qN; mus=mux*muN;vars=muN*varx+varN*mux^2;
f0=(qN+pN*p1[1])^N;a=-pN/qN;b=-a*(N+1)}
else if (type == "p")
{muN=N;varN=N;mus=mux*muN;vars=muN*varx+varN*mux^2;f0=exp(N*(p1[1]-
1));a=0;b=N}
else if (type == "n")
{muN=N*qN/pN;varN=N*qN/pN/pN;mus=mux*muN;vars=muN*varx+varN*mux^2
f0=(pN/(1-qN*p1[1]))^N;a=qN;b=a*(N-1)}
else {print ("Nu inteleg tipul")}
}
#4 calculam nmax si initializam f,F
nmax=mus+15*sqrt(vars);nmax=floor(nmax)+1;p=c(p1,rep(0,(nmax-n1)))
f=c(rep(0,n1));F=f;x=x1;su=0
ct=1/(1-a*p[1]);sue=(1-epsilon)/f0;n=1;f[1]=1;F[1]=1
for (n in 1:nmax)
{f[n+1]=0;n2=min(n,n1)
for (j in 1:n2)
{ f[n+1]=f[n+1]+p[j+1]*f[n+1-j]*(a + b*j/n)}
f[n+1]=ct*f[n+1]
F[n+1]=F[n] + f[n+1]
n=n+1
if (F[n]>sue) break
}
f=f0*f;F=f0*F
a=list(ES=mus,sigmaS=sqrt(vars),n_epsilon=n,f=f,F=F)}

Apelarea lui se face prin comanda
a = Panjer(x,p,type,N,pN,epsilon) (3.10)
Funcia furnizeaz o list a cu
- a[[1]] = ES
101
- a[[2]] = o(S)
- a[[3]]=n
c
, unde n
c
este primul n cu proprietatea c P(Ss n
c
) > 1 - c
- a[[4]] = f, cu f[n] = P(S = n-1)
- a[[5]] = F cu F[n] = P(S s n 1)

Revenim acum la Exemplul 1: X
n
~ Bin(10, ) i N ~ Poisson(100), n care ne
ateptm s avem n jur de 100 de clieni i fiecare s cear, n medie 5 lei. Dac
acceptm un risc de 1% , ne intereseaz a[[3]] cu c = .01 . Probabilitile p
j
se
calculeaz cu ajutorul funciei dbinom:

x=0:10; p=c(rep(0,11)); for (i in 1:11) {p[i]=dbinom(i-
1,10,.5)}
[1] 0.0009765625 0.0097656250 0.0439453125 0.1171875000 0.2050781250
[6] 0.2460937500 0.2050781250 0.1171875000 0.0439453125 0.0097656250
[11] 0.0009765625

Comanda principal este

a=Panjer(x,p,"p",100,.1,.01)
> ES=a[[1]];ES
[1,] 500
> sigmaS = a[[2]]; sigmaS
[1,] 52.44044
> VaR_epsilon= a[[3]]; VaR_epsilon
[1] 627

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").

Obinem graficul
0 100 200 300 400 500 600
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
Albastru: densitatea lui S, rosu: functia de repartitie
x
f
/
m
a
x
(
f
)
)
Fig 6.5

102
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 c= 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 c =
10
-10
!!

> a=Panjer(x,p,"p",100,1/11,.0000000001);VaR_S=a[[3]];VaR_S
[1] 872

Exemplul 3. S zicem c X
n
~ Bin(10, ) i N ~ Negbin(10, 1/11). i acum ne
ateptm s avem n jur de 100 de clieni i fiecare s cear, n medie 5 lei. Dar
diferena este destul de mare

a=Panjer(x,p,"n",10,1/11,.01)
ES=a[[1]];sigS=a[[2]];VaR_S=a[[3]]; f = a[[4]]; F=a[[5]]
ES = 500
sigS = 166.5833
VaR_S = 964

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
0 200 400 600 800 1000
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
1
.
0
Contor negativ binomial.Albastru: densitatea lui S, rosu: functia de repartitie
x
f
/
m
a
x
(
f
)


Fig 6.6

La riscul 0.1%, suma necesar ar fi fost 1168.

Putem acum compara algoritmul de convoluie convarep(n,x,p) (algoritmul de
bun sim) care calculeaz convoluia de n ori a repartiiei (x,p) =
|
|
.
|

\
|
k
k
p p p
x x x
...
...
2 1
2 1
cu
103
algoritmul rapid convarap(x,p,N,c) care calculeaz repartiia sumei S = Y
1
+ ...+ Y
N
cu
N ~ Bin(n, 1 P(X
n
= 0) ), unde Y
i
= (X
i
X
i
> 0) pn valoarea la risc VaR
1-c
(S)
( adic pn la primul n care are proprietatea c P(S > n) < c.) Scriptul este urmtorul

Convarap <- function(x,p,n,epsilon)
{nx=length(x)
o=order(x);x=x[o];p=p[o] ##sortm pe x
xmic=min(x);x1=x-xmic
## xmic devine 0, xmare devine xmare+xmic
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
}

O prim observaie este c algoritmul convarep permite efectuarea
convoluiilor fr nici o restricie, pe cnd la convarap trebuie ca x
i
> 0.
O a doua este c n nu poate fi prea mare i nici P(X = x
1
) nu poate fi prea mic
din urmtorul motiv: la iniializare, f
0
= P(X = x
1
)
n
.
S lum cazul unui zar. x = (1,2,3,4,5,6), p = (1,1,1,1,1,1)/6. x
1
= 1/6, deci P(S
= n) = 1/6
n
. Numerele n R sunt date n dubl precizie, adic sunt cuprinse ntre 10
-
63
i 10
63
. Dac o s facem n = 1000, deja nu mai avem ncredere n f
0
, care devine 0.
irul (f
n
) capt un comportament aleator. Totui, pentru n = 400, ambele scripturi
sunt funcionale, al doilea fiind de 120 de ori mai rapid ca primul.
Pentru valori mici ale lui n i mai mari ale lui k, n mod paradoxal este mai
bun algoritmul baby. De ex. dac n = 100, x = (1,3,5,7,11,13,17,19,23,29),
p=(1,1,1,1,1,1,1,1,1,1)/10, atunci suntem mai siguri pe algoritmul naiv convarep, dei
dureaz 30 de secunde, dect pe cel sofisticat, care dureaz jumtate de secund

b=convarap(x,p,100,.00000001);t1=b[[1]];f1=b[[2]]
a=convarep(100,x,p);t=a[[1]];f=a[[2]]
plot(t1,f1,type="l");lines(t,f,col="red")
104
500 1000 1500
0
.
0
0
0
0
.
0
0
2
0
.
0
0
4
0
.
0
0
6
0
.
0
0
8
t1
f
1

Fig 6.7

Cu negru sunt figurate densitile f
i
calculate dup algoritmul rapid. Deja unele
devin negative.
Exist alte tehnici sofisticate de a rezolva problema convoluiei dar nu fac
obiectul lucrrii de fa.

6.4 . Probleme de demografie, asigurri de persoane, tabele de
mortalitate

Un tabel de mortalitate este un tabel cu dou coloane, x i l n care x reprezint
vrsta iar l
x
este probabilitatea ca un individ nscut astzi s depeasc vrsta de x
ani, nmulit cu 100.000. Deci neaprat l
0
= 100000. Tabelele de mortalitate se
construiesc pn la o vrst maxim, notat convenional cu . De obicei = 100 sau
= 110.
Datele brute pe baza crora se construiete tabelul sunt doi vectori, n i d unde
n
i
este numrul total al populaiei cu vrst cuprins n intervalul [i,i+1) i d
i
numrul
de decese ale populaiei cu vrste cuprinse ntre aceste limite.
De exemplu, n
0
este numrul de copii cu vrste cuprinse ntre 0 i 1 an, calculat
la 1 ianuarie iar d
0
este numrul deceselor acestei categorii de populaie, calculat n
acelai an, dar la 31 decembrie. Sunt i alte convenii, dar aceasta este cea mai simpl.
Iat un exemplu de date brute, luat de la institutul de statistic n care avem de
a face cu patru populaii: barbai 1994, femei 1994, brbai 2008 i femei 2008.
Exemplul este pus ntr-un fiier .txt cu numele de barbatfemei19942008 care
trebuie s fie n directorul de lucru, pentru a nu fi complicat de deschis cu
instruciunea read.table.


105
x 1994 2008
barbati femei barbati femei
total decese total decese total decese 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

De exemplu, dac ne uitm la x= 80, vedem c la 1 ianuarie 1994 erau 29268
brbai i 48002 femei cu vrste ntre 80-81 de ani, iar la 31 decembrie 1994 muriser
din ei 3576 brbai i 4847 femei. Tot n acel rnd vedem c la 1 ianuarie 2008 erau
40991 brbai i 65403 femei din care, la 31 decembrie 2008 decedaser 4087 brbai
i 4968 femei.
Se poate vedea c ultimul rnd face excepie: aici sunt cuprinse toate
persoanele cu vrste de peste 85 de ani. La 1 ianuarie 1994 erau 57985 i 98009 femei
(din ei decedaser la 31 decembrie 2008 un numr de 13476 brbai i 21478 femei)
iar la 1 ianuarie 2008 erau 66841 brbai i 133181 femei din care la 31 decembrie
decedaser 13225 brbai i 25154 femei.
Completarea tabelului pn la vrsta de 85 de ani se face identificnd
probabilitatea unui eveniment cu frecvena lui.
Mai precis: s presupunem c timpul de via la natere al unui individ este o
variabil aleatoare T. Vrem s calculm coada sa, F(x) = P(T > x), care n demografie
se noteaz cu
x
p
0
. Normal ar trebui s punem
x
p
0
=
itori supravietu total
x cu vrste itori supravieu total >
,
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 p
0

= d
0
/n
0
cu probabilitatea P(T s 1): probabilitatea ca un nou nscut s moar nainte de
a mplini un an. Atunci numrul q
0
= 1 p
0
este P(T > 1) , adic probabilitatea ca el s
supravieuiasc un an. Apoi, p
1
= d
1
/ n
1
este probabilitatea ca un supravieuitor de 1
an s moar n intervalul de timp (1,2] , adic nseamn P(T s 2 T > 1). Deci q
1
= 1
p
1
nseamn probabilitatea ca un individ s supravieuiasc 2 ani tiind c el deja a
supravieuit 1 an, adic q
1
= P(T > 2 T > 1) , adic avem q
1
= P(T > 2)/P(T > 1)
P(T > 2) = q
0
q
1
. Din aproape n aproape gsim formula
P(T > x+1) = q
1
....q
x
(6.4.1)
valabil pentru x numr natural. nmulim acest numr cu 100000 i obinem l
x
=
10
5
q
x
, rotunjit la cel mai apropiat ntreg. Rezultatul este valabil, n cazul exemplului
nostru numai pn la x = 84, deoarece nu avem date mai multe.
106
Functia tabmort realizeaz acest lucru.

## functia tabmort (numar,death) creeaza un vector
## cu acelasi numar de componente de elemente
tabmort<-function(numar,death)
{nv=length(numar);nm=length(death);tabel=c(rep(0,nv))
if (nv!=nm) {print ("eroare:cei doi vectori au lungimi
diferite");return()}
p=death/numar;q=1-p
for (j in 1:nv) {tabel[j]=prod(q[1:j])}
tabel=c(1,tabel)
tabel = floor(100000*tabel+.5)
tabel
}

Pentru a o aplica, am fcut o pregtire: am copiat n clipboard fisierul
barbatfemei19942008 (cu exceptia primelor doua rnduri, care nu se potrivesc cu
restul) i am obinut o lista cu 9 elemente, numita tabgen

tabgen=read.table("clipboard")

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")

107
0 20 40 60 80
2
e
+
0
4
4
e
+
0
4
6
e
+
0
4
8
e
+
0
4
1
e
+
0
5
tabel mortalitate pe sexe 1994-2008
Index
a

Fig 6.8


Pentru a putea completa tabelul pn la = 100 sau = 110 trebuie s
acceptm unele ipoteze neverificabile. Una din ele ar fi c riscul de moarte este
constant pe intervale de forma (k,k+1] i pe intervalul (84,) crete liniar Alta ar fi c
riscul de moarte crete exponenial (ipoteza lui Gompertz).
n ambele modele se ascunde o ipotez neverificabil, anume c repartiia
timpului mediu de via la natere, T este absolut continu i coada sa, F
T
(x) este de
forma
F
T
(x) =
( )dy y r
x
e
}

0
( )
( )
( ) x F
x F
x r
T
T
'
= (6.4.2)
Funcia r se numete riscul instantaneu de moarte. Dac acceptm c r este
o funcie n scar, constant pe intervale de forma (k,k+1), atunci avem c
x+1
p
0
=
x
p
0
e
-
(x)
de unde deducem expresia
r
x
=
1
ln
+ x
x
l
l

1 +
=
x
x r
l
l
e
x
(6.4.3)
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)
0 20 40 60 80
0
.
0
0
0
.
0
5
0
.
1
0
0
.
1
5
riscuri de moarte pe sexe, 1994 si 2008
Index
r
a
1

108
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
t
p
0
pentru orice t
plecnd de la un table de mortalitate, tab. Din tabelul de mortalitate l reinem doar
acele poziii x n care l
x
>10. Atunci , din formula (4.3) deducem c

t
p
0
= l
[t]
} {
] [
1 ] [
t
t
t
l
l
|
|
.
|

\
|
+
dac t s i
t
p
0
= l

q
t-
( )( )
2
1 + e e
|
|
.
|

\
|
t t
p
q
dac t > (6.4.4)
Am notat
2
1
e
e
=
l
l
p i
1 e
e
=
l
l
q .

## Functia tp0 (t, tabel de mortalitate) calculeaza functia
## de supravietuire a unui nou nascut la momentul t in ipoteza ca
## riscul de moarte creste liniar dupa virsta nv. Ca sa evitam
impartiri cu 0, retinem din tabelul de mortalitate tab doar
elementele mai mari ca 10
tp0<-function(t,tab)
{nv=length(tab);ntv=n-1;k=floor(t);s=t-k
nvv=length(which(tab>10))
p=tab[nvv-1]/tab[nvv-2];q=tab[nvv]/tab[nvv-1]
r=q/p;ss=t-nvv+1
if (k<(nvv-1)) {tp0=tab[k+1]*(tab[k+2]/tab[k+1])^s}
else tp0=tab[nvv]*q^(ss)*r^((ss^2+ss)/2)
tp0=tp0/100000
#list(tp0=tp0,nv=nv,r=r,k=k)
tp0}

Cu ajutorul funciei care calculeaz
t
p
0
pentru orice numr pozitiv, nu neaprat
ntreg, este uor de calculat funcia de supravieuire la vrsta x, care se noteaz cu
t
p
x

i se definete ca
t
p
x
= ( )
( )
( )
0 x
0 t x
p
p
|
+
=
>
+ >
= > >
x X P
t x T P
x T t x T P (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}

Variabila aleatoare cu repartiia (4.5) se noteaz cu T
x
: timpul rezidual de
via la vrsta de x ani. Deci T
x
= (T x T > x) . Media acestei variabile aleatoare
este notat cu e
x
. Aplicnd formula ET
x
= ( )
} }
= >

0
x t
0
p dt dt t T P
x
, pe care o aproximm
cu e
x
=
>0
x t
p
x
formm scriptul

## speranta medie de viata a unui individ in virsta de x ani
ex<-function(x,tab){ex=0
for (j in 0:120) {ex=ex+tpx(x,j,tab)}
ex}
109
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
0 20 40 60 80 100
0
2
0
4
0
6
0
speranta medie de viata la x ani
Index
v
i
d

Fig 6.10


Tabelele acestea sunt importante n studiul asigurrilor de via.
Iat un exemplu tipic.
Un individ de vrst x vrea s i fac urmtoarea asigurare de via: s
primeasc o sum de S
0
lei peste t ani dac va fi n via, iar dac nu, urmaii lui s
primeasc aceeai sum la momentul decesului..Pentru aceasta el constituie un
depozit bancar cu rata anual a dobnzii i la care s aib dreptul el (numai peste n
ani) sau motenitorii lui (la momentul T
x
al decesului)
Ce sum H s depun n aa fel nct probabilitatea ca suma s fie insuficient
s fie c?
Datele problemei sunt S
0
, x, n, i, c. Formal, abordarea este urmtoarea: fie T
x

timpul rezidual de via al individului i = min(T
x
, n). Dac suma depus este H,
atunci suma pe care o va avea el sau urmaii lui peste ani va fi S
1
= H(1 + i)

.
Condiia pus este ca S
1
> S
0
i se cere cel mai mic H cu proprietatea c P(S
1
> S
0
) >
1- c.
Cum S
1
> S
0
( )
H
> +
t 0
1
S
i ln(1+i) > ln
H
0
S
>
( ) i
S
+
H
1 ln
ln
0
rezult c
suma minim care trebuie depus, H va avea valoarea

H = S
0
(1 + i)
y
unde y este soluia ecuaiei P( > y) = 1 - c (6.4.6)

n concluzie, problema se reduce la calculul cuantilelor repartiiei lui .
Cuantila este inversa funciei de repartiie. Altfel spus, este soluia y a ecuaiei se
numete cuantila la nivel c a lui . n cazul nostru avem
P( > y) = 1- c P(min(T
x
, n) > y) = 1- c P(T
x
> y) = 1- c, y < n
y
p
x
= 1 - c
Deci y este cuantila F

- 1
(c)
110

##cuantilele lui tpx
cuant<-function(x,tab,p){p=1-
p;pas=.05;sa=seq(0,120,by=pas);pa=sa;na=length(sa)
for (j in 1:na) {pa[j]=tpx(x,sa[j],tab)}
v=which(pa>p);ja=length(v);ja1=ja+1;alfa=pa[ja];beta=pa[ja
1];tot=alfa+beta
y=beta*ja/tot+alfa*ja1/tot;y=y*pas
y}

Atunci suma H care trebuie depus n depozit pentru a garanta cu riscul c
existena unei sume S
0
la momentul = min(T
x
, n) va fi
H = S
0
/(1 + i)cuant(x,tab,p)

De exemplu, pentru a afla suma necesar unui brbat de 60 de ani care dorete
ca la momentul s aib n depozit suma de 10.000 RON dac dobnda este de 5% i
folosim tabelul de mortalitate pentru 2008, scriem comenzile

b=tabmort(nrbb08,nrbm08);
y=cuant(60,b,.05) ;PI =1000*1.05^(-y);PI
[1] 8927.597

Sau,mai profesionist

s0=10000;i=.05;PI=s0/(1+i)^y;PI
[1] 8927.597

Sau, ca s artm cum se poate face totul cu o singur comand

PI=s0/(1+i)^cuant(60,tabmort(nrbb08,nrbm08),.05);PI
[1] 8927.597

Dac dobnda era 7% i riscul de 1%, am fi avut

PI=s0/1.1^cuant(60,tabmort(nrbb08,nrbm08),.01);PI
[1] 9511.922

Dac o femeie de 60 de ani vrea s fac acelai lucru, atunci am fi pus

PI=s0/1.1^cuant(60,tabmort(nrfm08,nrmm08),.01);PI
[1] 8983.24

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 S
0
= 40.000 (asigurare de tip endowing adic
nzestrare) avem

111
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,T
X
)
s se obin suma S
0
= 10.000 RON este o variabil aleatoare, anume X =
S
0
/ ( )
) , min(
1
n T
x
i + . Ar vrea s depun o sum, H ct mai mic cu putin ca
P(H( )
) , min(
1
n T
x
i + < S
0
) s c , adic P (X > H) s c. Dac este singur, atunci va trebui s
aleag pe H ca fiind cuantila de nivel 1 - c a variabilei aleatoare X.
Dar dac se asociaz cu alii, n aceeai situaie i depun cu toii aceeai sum,
H? S presupunem c s-a format o asociaie din N asemenea indivizi, dornici s
coopereze. S acceptm c timpii lor reziduali, notai cu T
j
au toi aceeai repartiie ca
T
x
. S mai presupunem c T
j
sunt independeni i c toi indivizii notri fac un depozit
comun n care depun aceeai sum, H. Fiecare i retrage bani de acolo atunci cnd
este nevoie. Acesta este numit n asigurri principiul solidaritii.
Fie X
j
= S
0
/ ( )
) , min(
1
n T
j
i + . Variabilele aleatoare X
j
vor fi de asemenea
independente. Probabilitatea ca depozitul s fie insuficient este P(X
1
+ + X
N
> NH) .
Dac dorim ca aceast probabilitate s fie mai mic sau egal cu c, va trebui s
alegem H n aa fel nct nH s fie cuantila la nivel 1 c a repartiiei sumei S
N
= X
1
+
+ X
N
, adic a convoluiei F
-N
, unde F este repartiia lui X
j
.
Este complicat de lucrat cu convoluiile, dac repartiia este continu. Dar se
poate aplica inegalitatea lui Cebev. S spunem c EX
j
= , o(X
j
) = o. Aproximm
E(X-)
+
2
cu o
2
/2. Atunci putem aplica inegalitatea lui Cebev de la (3.5) sub forma
P( S
N
> ES
N
+ ko(S
N
)/ 2 )< 1/k
2
, care n cazul nostru devine P( S
N
> N

+ ko
2
N
)<
1/k
2
. Pentru un risc de c = 4% , de exemplu, alegem k = 5 i avem P( S
N
> N

+
5o
2
N
)< .04 . Lum H n aa fel nct NH =

+ 5o
2
N
, adic H = +
N 2
5o
. Pentru
aceasta avem de calculat EX i o(X).
Dac scriem 1+i = e
o
, atunci X
j
= S
0
) , min( n T
j
e
o
, de unde EX
j
= S
0
L
n
(o), EX
j
2
=
S
0
2
L
n
(2o), unde
L
n
(o) = E
) , min( n T
j
e
o
(6.4.7)
este transformata Laplace a variabilei aleatoare min(T
j
,n). Aceasta se poate calcula
foarte comod folosind formula de integrare prin pri
Eg(X) = g(0) + ( ) ( )dt t F t g
X
}

0
' (6.4.8)
pentru funcia g(x) = e
-omin(x,n)
. Cum g(0) = 1 i g(x) = - oe
- ox
1
(0,n)
(x), formula de mai
sus devine
L
n
(o) = 1 - ( )dt t F e
n
t
}
o
o
0
, unde F este funcia de supravieuire a variabilei aleatoare T
x

(coada sa), care se noteaz cu
t
p
x
i se calculeaz cu ajutorul funciei
112
tpx(x,t,tab) cu care am fcut deja cunotin. n definitiv din (4.8) deducem
formulele
L
n
(o) = 1 - dt e
n
t
x t
0
p
}
o
o
, EX
j
= S
0
L
n
(o), o(X
j
) = S
0
( ) o o
2
2
n n
L L (6.4.9)
Scriptul Laplace(x,n,o,tab,nrint) calculeaz pe L
n
(o) cu o = ln(1+i) prin
metoda trapezelor, cu pasul diviziunii intervalului [0,n] egal cu n/nrint.
Amintim semnificaia parametrilor:
- x este vrsta asiguratului;
- o = ln(1+i) unde i este rata anual a dobnzii;
- n este durata depozitului, dac asiguratul nu moare n aceast perioad;
- tab este tabelul de mortalitate pe baza cruia se face calculul
- nrint este numrul intervalelor echidistante n care se mparte intervalul
[0,n] pentru a putea calcula integrala

## Laplace(x,n,delta,tab,nrint) calculeaza integrala 1 -
#delta int(exp(-tdelta)tpx
Laplace<-function(x,n,delta,tab,nrint)
{ pas=n/nrint;s=1;
for (j in 1:nrint) {s=s+exp(-delta*j*pas)*tpx(x,j*pas,tab)}
s=s-(1+exp(-delta*n)*tpx(x,n,tab))/2; s=s*pas*delta
rez=1-s;rez}
iar scriptul calculeaz media i variana variabilei aleatoare X = X
j
= S
0
) , min( n T
j
e
o


##media si varianta daca x= 60,n=20, i=.05,
medvarxni<-function(s0,x,n,i,tab)
{
delta=log(1+i);nrint=12*n;la1=Laplace(x,n,delta,tab,nrint)
la2=Laplace(x,n,2*delta,tab,nrint)
ex=s0*la1;sigx=sqrt(la2-la1^2)
rez=list(EX=ex,SigmaX=s0*sigx)
rez }

Revenim la individul de 60 de ani care dorete 10000 RON peste 20 de ani.
Calculul pe baza tabelei din 1994 ne d

> medvarxni(s0,x,n,i,a)
$EX 5374.11
$SigmaX 1796.007

Pe baza tabelei din 2008 avem

medvarxni(s0,x,n,i,b)
$EX] 5188.782
$SigmaX 1738.958

Dac e vorba de o femeie, atunci tabela din 1994 d rezultatul

> medvarxni(s0,x,n,i,c)
$EX 4754.943
$SigmaX 1481.948

113
iar dac folosim tabela din 2008,

> medvarxni(s0,x,n,i,d)
$EX 4549.405
$SigmaX 1377.932

Marginea H = +
N 2
5o
, care garanteaz un risc de 4% de insuficien a
depozitului devine H
N
= 5374+
N
6350
.
Comparat cu valoarea exact, n cazul unei autoasigurri cu risc 4% care este
H
0
= 9238, ea devine deja mai mic dac numrul participanilor la asigurarea n grup
este mai mare ca 3. ntr-adevr, H
2
= 9864, dar H
3
=9040 < 9238, H
4
= 8549,.... ,H
100

=6009.
Aceleai rezultate se obin i dac folosim tabele din 2008. Autoasigurarea
realizat de

PI=s0/(1+i)^cuant(60,tabmort(nrbb08,nrbm08),.04);PI
ne d H
0
= 9104, iar fomula H
N
= +
N 2
5o
ne d H
3
= 8738 < 9104, H
4
=8263,..., H
100
=
5804
Spre deosebire de cazul autoasigurrii, fie n individual, fie n grup, n cazul n
care se apeleaz la o companie de asigurri (care din asemenea lucruri triete), la
primele cu risc de forma EX + oo(X) se mai adaug i un comision. Chiar i aa, este
o soluie preferabil fa de autoasigurarea individual.

6.5. Simulri de variabile aleatoare, probleme de portofolii

Dup cum am vzut la capitolul anterior, limbajul R ofer multe repartiii
crora li s ecalculeaz funcia de repartiie (p) densitatea (d), cuantila (q) i se pot
simula (r). Ele sunt

Repartiia Numele ei n R Parametri
beta beta o,|
binomial binom k,p
Cauchy cauchy m,a
_
2
chisQ n
exponential exp
F f m,n
gamma gamma v,
geometric geom p
hipergeometric hyper a, n, k
14

log-normal lnorm ,o
logistic logis ,o
15


14
Extragem k bile dintr-o urn cu a bile albe i n bile negre; X este numrul de bile albe.
15
Repartiia logistic are funcia de repartiie
o

+
x
e 1
1
. Este mai rar folosit..
114
negativ binomial nbinom k,p
normal norm ,o
16

Poisson pois
Student t n
uniform unif a,b
Weibull weibull k,
Wilcoxon wilcox m, n

Pentru a genera un vector cu n componente i.i.d. cu aceste repartiii se pune n
faa numelui lor din R litera r. Apoi se pune numrul de variabile aleatoare dorite i
parametrii repartiiei.
De exemplu:

x=rnorm(100,10,4);x
# x este un vector cu 100 de componente repartizate N(10,4
2
)
x=rbinom(10,10,.4);x
[1] 3 5 1 5 4 6 4 5 6 3
# x este un vector cu 10 #componente repartizate Binomial(10,.4)
x=rnbinom(6,10,.4);x
[1] 19 8 9 25 8 19
# x este un vector cu 10 componente repartizate Negbin(10,.4)
x=rhyper(10,4,6,6);x
[1] 3 2 3 3 2 2 2 2 1 3
# x este un vector cu 10 componente ~Hypergeometric(4,6,6)

Problem. Cum se simuleaz o repartiie care nu face parte dintre acestea?
De exemplu, cum simulm timpii de via reziduali de via (T
j
)
1sjsn
ai unor indivizi
care au aceei vrst, x?
Dac este vorba de repartiii discrete, limbajul R punde la dispoziie dou
instruciuni, care fac, printre altele acest lucru .

sample(x, size, replace = FALSE/TRUE, prob = NULL/p)
sample.int(n, size = n, replace = FALSE, prob = NULL)

Aici x este un vector n care se pun valorile variabilei aleatoare X (nu
neaprat numere, pot fi i simboluri); p este un vector de aceeai lungime ca i x
format cu numere positive, din care se formeaz automat o probabilitate, de ctre R,
nlocuind p[j] cu p[j]/sum(p) . Dac nu se pune nici o probabilitate, p, se consider c
p este repartiia uniform, p = c(rep(1,length(x)). Dac parametrul replace (sau chiar
rep, se accepta prescurtaqrea!) este TRUE, atunci instruciunea
sample(x,n,rep=TRUE,prob=p) simuleaz un ir de n variabile aleatoare X
j

~
|
|
.
|

\
|
k
k
p p p
x x x
...
....
2 1
2 1
, cu k = length(x).
Exemplu. S se simuleze un ir de 100 variabile aleatoare X
j
~
|
|
.
|

\
|
4 . 3 . 2 . 1 .
d c b a
.
Soluie.

x= c("a", "b", "c", "d"); nr=100;xsim=sample(x,nr,rep=TRUE,prob=1:4)
> xsim

16
n codificarea R, x=rnorm(1,,o) produce o variabila aleatoare X ~ N(,o
2
). Parametrul al doilea
reprezint abaterea medie ptratic i nu variana. Uneori se face confuzie.
115
[1] "a" "b" "c" "d" "d" "a" "d" "d" "b" "a" "c" "a" "d" "b" "c" "d" "c"
"d"
[19] "c" "d" "c" "d" "c" "c" "c" "b" "b" "d" "c" "d" "b" "c" "d" "c" "b"
"a"
[37] "c" "d" "c" "a" "b" "b" "c" "a" "c" "b" "b" "a" "a" "b" "a" "c" "c"
"c"
[55] "d" "d" "b" "d" "b" "c" "d" "d" "c" "d" "a" "d" "a" "d" "a" "c" "d"
"a"
[73] "c" "b" "d" "d" "c" "c" "c" "c" "d" "c" "d" "a" "d" "a" "d" "b" "c"
"d"
[91] "c" "d" "c" "a" "c" "d" "c" "b" "d" "b"

Ne putem convinge c este aa folosind instruciunea table, care ne arat
frecvenele empirice ale celor patru simboluri

> table(xsim)
xsim
a b c d
17 18 33 32

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

acest lucru se vede mai clar.

Instruciunea
sample.int(n, size = n, rep = FALSE/TRUE, prob = NULL/p)
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 = (x
1
,,x
k
) 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
116
xsim=sample.int(4,2,rep=FALSE); xsim
[1] 3 1

Dac exist i parametrul p adic probabilitatea, atunci

xsim=sample(x,size,rep=FALSE,prob=p)

genereaz un aranjament x
o(1),,
x
o(size)
n care probabilitile p se aplic succesiv. Mai
precis, dac X ~
|
|
.
|

\
|
k
k
p p p
x x x
...
....
2 1
2 1
i size = d s k, se genereaz un vector aleator V =
(V
1
,,V
d
) cu repartiia
P(V
1
= x
o(1)
,V
2
= x
o(2)
,,V
d
= x
o(d)
) =
( )
( )
( )
( )
( ) ( )
( )
( ) ( ) 1 1 2 1
3
1
2
1
... 1
......
1 1
o o
o
o o
o
o
o
o

d
d
p p
p
p p
p
p
p
p

Exemplu. X ~
|
|
.
|

\
|
4 3 2 1
4 3 2 1
p p p p

Dac d= 2, atunci V = (V
1
,V
2
) cu P(V
1
= i,V
2
= j) =
i
j i
p
p p
1

Dac d= 3, atunci V = (V
1
,V
2
,V
3
) cu P(V
1
= i
1
,V
2
= i
2
,V
3
= i
3
) =
( )( )
2 1 1
3 2 1
1 1
i i i
i i i
p p p
p p p

etc.
Un caz particular: X ~
|
|
.
|

\
|
4 . 3 . 2 . 1 .
4 3 2 1
. Dac d= 2 avem 12 de aranjamente, cu
urmtoarele probabiliti

12 13 14 21 23 24 31 32 34 41 42 43
2/90 3/90 4/90 2/80 6/80 8/80 3/70 6/70 12/70 4/60 8/60 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

Ca s ne convingem c aa stau lucrurile, facem 10000 de simulri

> for (j in 1:nsim)
+ {xsim=sample.int(4,2,prob=p);vax[j]=10*xsim[1]+xsim[2]}
> table(vax)
vax
12 13 14 21 23 24 31 32 34 41 42 43
207 307 439 272 729 948 414 847 1753 685 1319 2080

n concluzie, n cazul variabilelor aleatoare unidimensionale discrete (cu o
mulime finit de valori) problema simulrii este rezolvat complet prin instruciunea
sample.
Vom prezenta algoritmul general de simulare al unei repartiii care nu face
parte din cele furnizate de R: acesta este algoritmul cuantilei. Ideea este c dac U
~ U(0,1), atunci

X = F
-1
(U) este o variabil aleatoare cu funcia de repartiie F (6.5.1)

117
Apare o problem tehnic, aceea c inversa F
-1
(p) nu exist ntotdeauna. De
aceea o nlocuim cu cuantila de la nivel p, definit prin

F
-1
(p) = x F(x 0) s p, F(x) > 0 (6.5.2)

Metoda: gsim dou valori y
1
i y
2
cu proprietatea c F(x
1
) < p, F(x
2
) > p ,
destul de apropiate i aproximm funcia F cu o funcie de gradul I care trece prin
(x
1
,F(x
1
)) i (x
2
,F(x
2
)). Un algoritm simplu i eficient dac diferena dintre x
1
i x
2
nu
este prea mare . n loc s lucrm cu funcia de repartiie, putem lucra cu coada ei, F =
1 F, dar atunci p trebuie nlocuit cu 1 p.
Prezentm dou scripturi: cuantinc care calculeaz cuantila plecnd de la un tabel (x,
F(x)) i scriptul cuantdec, care o calculeaz folosind coada ei (x, F(x)). Aici x este un
vector cu valori ale lui x iar y este vectorul cu valorile lui F sau F.

cuantinc<-function(x,y,p)
{k=length(which(y<p));x1=x[k];x2=x[k+1]
rez=x[k]+(x[k+1]-x[k])*abs((y[k]-p)/(y[k]-y[k+1]))
rez}

cuantdec<-function(x,y,p)
{p= 1-p;k=length(which(y>p));x1=x[k];x2=x[k+1]
rez=x[k]+(x[k+1]-x[k])*(y[k]-p)/(y[k]-y[k+1])
rez}

Exemplu de aplicare: cuantila unei repartiii Pareto(a,b,c). Coada sa este dat
de F(x) =
c
b
ax
|
.
|

\
|
+ 1
1
, x >0. Cuantila se poate calcula i analitic, de data aceasta:
F(x) = p F(x) = 1 p x =
( )
b
c
a
p
1
1
1 1
|
|
|
.
|

\
|


. Dup cum se vede n scriptul de mai
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
Exemplu n care nu avem nici o formul analitic, ci doar un tabel de mortalitate. S
se simuleze timpii reziduali de via pentru un lot de 100 de brbai de 60 de ani.
Soluie. Folosim tabelul de mortalitate din 2008.

## O simulare: N timpi de viata reziduali, barbati de 60
#de ani
b=tabmort(nrbb08,nrbm08);x=0:600/10;y=x
for (j in 0:600) {y[j+1]=tpx(60,x[j+1],b)}
N=100;bb=1:N;for (k in 1:N) {bb[k]=cuantdec(x,y,runif(1))}
> summary(bb)
Min. 1st Qu. Median Mean 3rd Qu. Max.
118
0.2468 11.3200 18.8100 17.6100 25.4900 32.4600

Simularea ajut la verificare unor ipoteze. De exemplu putem s ne convingem c
dac 1000 de brbai de 60 de ani se autoasigur cu 6000 de lei pentru ca la momentul
decesului (sau dup 20 de ani) urmasii lor (sau ei, dac sunt n via) s primeasc
10.000 lei, se creeaz un fond suficient:

> ## 100 de simulari de sume in depozit
> medie=1:100;for (j in 1:100){
+ N;for (k in 1:N) {bb[k]=cuantdec(x,y,runif(1))}
+ depozit=1.05^bb;depozit=6000*depozit;medie[j]=mean(depozit)
+ }
> summary(medie)
Min. 1st Qu. Median Mean 3rd Qu.
Max.
14171 14423 14552 14556 14671 15013

Ar putea chiar s parieze c pot primi 14000 lei!


Vectori aleatori i portofolii

Pentru simularea vectorilor aleatori nu exist algoritmi generali eficieni.
Totui, exist un algoritm rapid de generare a unui vector aleator repartizat
uniform n interiorul mulimii
k,S
= {x e 9
+
k
x
1
+ ... +x
k
= S}. Este mulimea
vectorilor de probabilitate n dimensionali, care se mai numesc i portofolii.
Motivul este urmtorul: la burs exist mai multe active financiare (A
1
,...,A
k
)
mprite n aciuni. Dup cum se tie, preul aciunilor este aleator.
S presupunem c dac se investete 1 leu n activul A
j
rentabilitatea este o
sum de bani R
j
. Mai precis: dac un juctor la burs cumpr aciuni de 1 leu din
activul A
j
la momentul t
0
, i vrea s le vnd la momentul t
1
, el nu le va vinde tot cu
1 leu, ci cu o sum X
j
, depinznd de cotaia de pe piaa financiar a activului A
j
.
Diferena R
j
= X
j
1 se numete rentabilitatea operaiunii financiare. Sigur c ea
depinde de momentele t
0
i t
1
. Din definiie, variabilele aleatoare R
j
sunt ntotdeauna
mai mari sau egale cu 1.
Dac n loc s cumpere aciuni n valoare de 1 leu dintr-un singur activ
financiar A
j
juctorul de burs cumpr de x
1
lei aciuni din activul A
1
, de x
2
lei
aciuni din activul A
2
,.... atunci rentabilitatea operaiunii va fi R(x) = x
1
R
1
+ x
2
R
2

+.....+ x
k
R
k
. Putem ntotdeauna s considerm suma S = x
1
+ ...+ x
k
ca fiind egal cu
1, deoarece este clar c R(Sx) = SR(x).
Un portofoliu n sens strict este atunci format din vectorul alocrilor x =
(x
1
,...,x
k
) e
k,S
al banilor alocai fiecrui activ i din vectorul rentabilitilor R =
(R
1
,...,R
k
). Valoarea portofoliului este R(x) = x
1
R
1
+ x
2
R
2
+.....+ x
k
R
k
, media ER(x) se
numete randamentul portofoliului iar variana Var(R(x)) este riscul portofoliului.
Fie
j
= ER
j
i c
i,j
= Cov(R
i
,R
j
) = EX
i
X
j
-
i

j
. Atunci

ER(x) = x
1

1
+ x
2

2
+.....+ x
k

k
:= x, Var(R(x)) =
j i
j i j i
x x c
,
,
= xCx (6.5.3)
Am notat cu x transpusul lui x, adic vectorul linie cu aceleai componente.
Problema portofoliului optim este atunci urmtoarea: s se gseasc cel mai
bun portofoliu. Doar c aa fiind pus, nu are sens.
119
Ca dou portofolii s fie comparabile, ar trebui s se construiasc din aceeai
sum S. Ne-ar trebui un criteriu de optim. Unul din ele este, care are sens, este: s se
gseasc portofoliul de randament maxim i risc minim. Numai c aceasta de obicei
nu are soluii.
Alte idei sunt: dintre toate portofoliile cu un randament acceptabil, s se
gseasc cel de risc minim; sau, dintre cele de un risc acceptabil, s se gseasc cele
de randament maxim.
O metod care permite o abordare general este principiul utilitii medii
17
.
O utilitate este o funcie u: I 9 continu strict cresctoare, unde I este un interval
de numere reale. Utilitatea medie a unui portofoliu (x , R) este Eu(xR) . Sigur c
pentru ca formula s aib sens trebuie ca xR e I x e
k,S
. Atunci problema capt
un sens precis

S se gseasc x e
k,S
astfel ca Eu(xR) = maxim (6.5.4)

O metod rapid de rezolvare, cu o precizie acceptabil a problemei (5.4) este
metoda Monte Carlo: se simuleaz N portofolii uniform repartizate n
k,S
i se alege
acela pentru care utilitatea medie este maxim.
Algoritm de generare al unui vector repartizat uniform n
k,S
.
Se simuleaz k variabile aleatoare independente repartizate Exp(1) i se
mparte la suma lor, dup care se nmulete cu S.
Exemplu : S = 100, k = 5.

> s=100;k=5; x=rexp(k,1); x=x/sum(x)*s;x
[1] 3.154435 20.061981 38.808900 12.395507 25.579176

Exemplu de calcul. Rentabiliti normal repartizate, utilitate CARA.
Presupunem c vectorul R este repartizat normal N(,C). n practic se
accept, dei este clar c nu exist variabile aleatoare normale repartizate cu valori n
[-1,)
k
.
Lum utilitatea u(t) = - e
rt
. O utilitate ee aceast form se numete CARA cu
coeficient de aversiune la risc egal cu r.
Se tie c xR ~ N(x, Cx x'
2
), Cum funcia generatoare de momente a unei
repartiii N(,o
2
) este m(t) =
2
2 2
o
+
t
t
e avem c Eu(xR) = -
2
'
'
2
Cx x r
rx
e
+
. Aadar
problema (6.5.4) devine

S se gseasc x e
k,S
astfel ca -
2
'
'
2
Cx x r
rx
e
+
= max Cx x'
2
x'
r
= 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
120
[2,] 0.2 4.7 1.6 -0.4 2.3 (6.5.6)
[3,] -2.4 1.6 2.3 -0.6 2.3
[4,] 0.6 -0.4 -0.6 0.8 -0.6
[5,] -1.8 2.3 2.3 -0.6 3.1
> eigen(C)
$values
[1] 8.79649765 4.63101195 0.66399316 0.64015618 0.06834105

Instruciunea eigen(C) am pus-o ca s ne convingem ca C este o matrice pozitiv definit.
Coeficienii de corelaie ntre variabile sunt

> for (i in 1:5) {for (j in 1:5)
{ro[i,j]=C[i,j]/sqrt(C[i,i]*C[j,j])}}
> ro
[,1] [,2] [,3] [,4] [,5]
[1,] 1.00000000 0.04671418 -0.8013367 0.3396831 -0.5176776
[2,] 0.04671418 1.00000000 0.4866393 -0.2062842 0.6025569
[3,] -0.80133668 0.48663925 1.0000000 -0.4423259 0.8613568
[4,] 0.33968311 -0.20628425 -0.4423259 1.0000000 -0.3810004
[5,] -0.51767758 0.60255689 0.8613568 -0.3810004 1.0000000

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 0.20 0.20 0.30)

i C matricea de la 6.5.6. Dispersiile Var(R
i
) sunt elementele de pe diagonal ale lui
C:
sig = (3.9 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 R
4
. Activul R
5
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
121

Dac fceam calculul exact, ne ateptam ca toi cei 100 de lei s fie investii n A
1
i
A
2
. Algoritmul Monte Carlo nea spus s punem 70.61 + 26.60 = 97.21 lei
n A
1
i A
2
.
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 A
2
este evitat: are acelai randament ca A
1
dar este mai
riscant.
Mai experimentm

r=1 xoptim = 22.08 0.58 42.83 33.69 0.82
r=100 xoptim = 27.31 0.10 42.38 28.99 1.21

Dac r este mare, atunci maximul funciei Cx x'
2
x'
r
se atinge cam n acelai
punct n care xCx este minim. Minimul lui xCx (1652.5)se atinge n

x = 24.8 0 41.82 33.39 0

punct care nu difer mult de cel de la r = 100.
Putem calcula i cuantilele valorii = xR a portofoliului optim. n cazul
studiat, cnd repartiia este normal, tim c ~ N(x, Cx x' ). De exemplu, dac
r = .1, probabilitatea de a fi n pierdere cu portofoliul optim alctuit se poate calcula
prin comenzile

> r=1;
x=portopt(S,r,mu,C,N);mux=x%*%mu;sig=sqrt(x%*%C%*%x);
pnorm(0,mux,sig)
[1] 0.2820430
> mux = 24.07753, sig = 42.05184

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

Dac schimbm funcia de utilitate cu alta de exemplu cu u(x) =
+
+ ) 100 (x
atunci nu am mai fi putut aplica metoda de mai sus fiindc nu exist formule analitice
cu care s putem calcula E
+
+ ) 100 ( X dac X ~ N(,o
2
). Atunci ar fi trebuit s
nlocuim media cu media aritmetic a unui eantion de un anumit volum dintr-o
populaie repartizat X ~ N(,o
2
). Se poate simula uor n R. Dar dac vrem s
simulm un vector n
d
dimensional, X ~ N(,C), pachetul de baz nu ne ajut. Sigur
c exist n R i scripturi gata fcute n acest scop, dar nu n pachetul de baz.
Programarea este simpl: trebuie scris X = AY + , unde AA = C i
Y =rnorm(n
d
,0,1) este un vector cu n
d
componente independente repartizate
N(0,1).
122

## simularea unei repartitii normale N(mu,C)
## N este numarul de simulari,mu este media, un vector cu nd
## componente, C este o matrice de corelatie ndxnd

simnorm<-function(N,mu,C)
{nd=length(mu);nd1=length(C[1,]);nd2=length(C[,1])
if (nd != nd1) {print ("eroare1, dimensiuni gresite");return()}
else if (nd != nd2) {print ("eroare2, dimensiuni
gresite");return()}
Ov=eigen(C);v=Ov[[1]];O = Ov[[2]]
D=O-O; for (j in 1:nd) {D[j,j]=v[j]}
DD=sqrt(D);A=O%*%DD%*%t(O)
xx=matrix(nrow=N,ncol=nd)
for (j in 1:N) {xx[j,]=A%*%rnorm(nd,0,1)+mu}
## fac si proba empirica
mup=mu;CE=C
for (j in 1:nd) {mup[j]=mean(xx[,j])}
for (i in 1:nd) {for (j in 1:nd) {CE[i,j]=cov(xx[,i],xx[,j])}}
rez=list(xx=xx,muemp=mup, covemp=CE)
rez}

Scriptul nu numai c simuleaz N vectori repartizai N(,C), dar le calculeaz
apoi media i covariana empiric. Din legea numerelor mari, tim c ele nu trebuie s
difere prea mult de EX i Cov(X). Iat rezultatul pentru N = 10000, = (0.35 0.35
0.20 0.20 0.30) i C matricea de la (5.6).

N=10000;xx=simnorm(N,mu,C);muemp=xx[[2]];covemp=xx[[3]]
> muemp = 0.3705928 0.3555581 0.1921526 0.2123407 0.2905003
> covemp
[,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 x
o
e
nd,S

n aa fel nct E
+
+ ) 10 (
d
n R x
'
o
s fie maxim, va trebui s simulm un numr de N
valori ale vectorului rentabilitilor, R i un numr de N
X
valori de portofolii uniform
repartizate din care s l alegem cel pentru care media empiric este maxim.
123

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 H
0
) i
orice alt ipotez admisibil se numete ipotez alternativ (notat de obicei cu H
a
).
Verificarea ipotezei nule se face pe baza unei selecii (eantion) de volum n,
x
1
,..., x
n
, 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 H
0
: =
0
i H
1
: <
0
sau >
0
.
- teste bilaterale (nedirecionale) n care H
0
: =
0
i H
1
:
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.
124

Un test statistic, n general, parcurge urmtorii pai [7]:
1. Se formulaz ipotezele statistice: o ipotez nul H
0
i o ipotez alternativ H
1
.
2. Pe baza seleciei se calculeaz o statistic numit statistica testului.
3. Se alege un prag de semnificaie pentru testul statistic.
4. Se compar valoarea actual a statisticii testului cu valoarea teoretic.
5. Se stabilesc regulile de decizie de acceptare sau respingere a ipotezei nule.
Exist funcii R predefinite, precum z.test care se gsete n pachetul de
programe R TechingDemos. Acest pachet de funcii R se poate gsi ca arhiv zip la
adresa web
http://cran.r-project.org/web/packages/TeachingDemos/index.html
Dup descrcarea pe calculatorul personal a pachetului, pentru instalare se poate
folosi opiunea Install package(s) from local zip files... din meniul Packages. Dup
instalarea cu succes, se poate alege opiunea Load package..., din acelai meniu
pentru ncarcarea pachetului TechingDemos.
Exist funcii R predefinite, precum sign.test care se gsete n pachetul de
programe BSDA (Basic Statistics and Data Analysis). Acest pachet de funcii R se
poate gsi ca arhiv zip la adresa web
http://cran.r-project.org/web/packages/BSDA/index.html
Se descarc, se instaleaz i se ncarc pachetul BSDA ca n cazul pachetului
TechingDemos.
Alte funcii referitoare la teste statistice se mai gsesc n pachetul standard
stats care se instaleaz automat la instalarea software-ului R.


7.1.1 Teste statistice pentru un singur eantion


7.1.1.1 Testul Z pentru un singur eantion

Testul de concordan Z (sau testul normal) verific o ipotez referitoare la
media unei populaii repartizate normal, cu dispersia cunoscut.
Se consider selecia (eantionul) X
1
, X
2
, ..., X
n
de variabile aleatoare
independente i identic repartizate, de repartiie N (m,
2
), cu cunoscut. Testul Z se
aplic pentru eantione este de dimensiune n 30.
Ipoteza nul este
H
0
: m = m
0
,
iar ipoteza alternativ
H
a
: m m
0
.
Statistica Z se calculeaz dup formula

n
m x
Z
/
0
o

= ,
unde x reprezint media de selecie a eantionului:

=
=
n
i
i
X
n
x
1
1

Ca urmare a teoremei limit central, statistica Z are repartiia normal standard
N(0,1) pentru n mare. Avem n acest caz, dac vom alege un risc , ipotezele i
criteriile de acceptare sau respingere conform cu tabelului urmtor:

125
H
0
H
a
Regiunea de respingere
m = m
0
m m
0

2
1
| |
o

) z z
m = m
0
m > m
0

o
)
1
z z
m = m
0
m < m
0

o
(
1
z z

Aplicaie: S presupunem c avem 10 voluntari care au fcut un test de
inteligen. Media obinut la acelai test, referitor la ntreaga populaie este 75. Vrem
s verificm dac exist o diferen statistic semnificativ (cu nivel de semnificaie
de 5%) ntre media eantionului cu valorile 65, 78, 88, 55, 48, 95, 66, 57, 79, 81 la
testul de inteligen i media populaiei, presupunnd c dispersia este cunoscut i
egal cu 18.
Soluie: Pentru a rezolva aceast aplicaie, se poate folosi testul Z cu un eantion.

n pachetul de funcii R TechingDemos exist funcia predefinit z.test, cu
prototipul:

z.test(x, mu = 0, stdev, alternative = c("two.sided", "less",
"greater"), sd = stdev, conf.level = 0.95)
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, ...)
126
care calculeaz valoarea teoretic a statisticii t cu pragul de semnificaie al testului p.
n cazul nostru:
> qnorm(0.975) #Z_(1-alpha/2)
[1] 1.959964
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 (H
0
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 H
0
, iar dac este mai mic dect 0.05 atunci se respinge
ipoteza nul H
0
n favoarea ipotezei alternative H
1
. n cazul nostru, p-valoarea este
0.5044 > 0.05 i deci se accept ipoteza nul H
0
.


7.1.1.2 Testul t pentru un singur eantion

Testul t (sau testul Student) pentru un singur eantion se folosete pentru a
verifica o ipotez referitoare la media unei populaii repartizate normal, cu
dispersia de data aceasta necunoscut.
Se consider tot o selecie X
1
, X
2
, ..., X
n
de variabile aleatoare independente i
identic repartizate, de repartiie N (m,
2
), cu ns necunoscut.
Ipoteza nul este
H
0
: m = m
0
,
iar ipoteza alternativ
H
a
: m m
0
.
Dispersia populaiei din care provine selecia poate fi estimat prin estimatorul
deplasat S
2
=
2
1
1
) (

=

n
i
i
n
x x sau prin estimatorul nedeplasat s
2
=
2
1 1
1
) (

=

n
i
i
n
x x ,
unde x reprezint media de selecie a eantionului,

=
=
n
i
i
n
x x
1
1
.
Dac volumul seleciei este mare (n30) atunci s
2
S
2
i se poate folosi
statistica Z. Dac ns volumul seleciei este mic (n<30), se poate folosi testul Student
n care se calculeaz statistica testului urmtoare:

n s
m x
t
/
0

=
Aceast statistica a testului t este repartizat Student cu n-1 grade de libertate. n rest
se procedeaz ca la testul Z prezentat anterior.

n pachetul de funcii R stats exist funcia predefinit t.test, cu
prototipul:

t.test(x, y = NULL, alternative = c("two.sided", "less",
"greater"), mu = 0, paired = FALSE, var.equal = FALSE,
conf.level = 0.95)
127
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
Acum, o secven de cod R care rezolv aplicaia considerat este urmtoarea:
> x = c(65, 78, 88, 55, 48, 95, 66, 57, 79, 81)
> t.test (x, mu=75)
One Sample t-test
data: x
t = -0.783, df = 9, p-value = 0.4537
alternative hypothesis: true mean is not equal to 75
95 percent confidence interval:
60.22187 82.17813
sample estimates:
mean of x
71.2
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, ...)
care calculeaz valoarea teoretic a statisticii t cu pragul de semnificaie al testului p
i numrul gradelor de libertate df. n cazul nostru:
> qt(0.975, 9)
[1] 2.262157
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 H
0
, iar dac este mai mic dect 0.05 atunci respingem
ipoteza nul H
0
n favoarea ipotezei alternative H
1
. n cazul nostru, p-valoarea este
0.4537 > 0.05 i deci se accept ipoteza H
0
.

128

7.1.1.3 Testul binomial

Testul neparametric binomial poate fi folosit cnd avem o variabil cu dou
valori. Acesta se bazeaz pe urmtoarea formul:
P(k succese n n ncercri) =
k n k k
n
q p C


Adic, probabilitatea de a obine k evenimente din n ncercri se calculeaz ca produs
al combinaiilor de n luate cte k multiplicat cu probabilitatea teoretic a succesului
ridicat la numrul de succese nmulit cu probabilitatea teoretic a eecului ridicat la
puterea numrului de eecuri.
Testul se realizeaz cu ajutorul statisticii Z:
Z =
n pq
p x
/

~ N(0,1)
n R, n pachetul de programe standard stats exist funcia predefinit

binom.test(x, n, p = 0.5, alternative = c("two.sided",
"less", "greater"), conf.level = 0.95)
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.

129
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
(n
i
) , se scade numrul ateptat (
i
n' ) 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:

=
k
i
i
i i
n
n n
1
2
2
'
) ' (
_
Ca n majoritatea testelor statistice, cu ct mai mare este diferena dintre valoarea
observat i cea ateptat, cu att mai mare devine valoarea testului statistic.
Distribuia testului statistic sub ipoteza nul se potrivete cu distribuia
2
_ .
K. Pearson a artat c, n cazul n care probabiliti p
i
=
i
n' / n
i
nu sunt apropiate de 0
sau 1, iar produsele
i i i
p n n = ' , unde ) (
i i
x f p = , dup estimarea parametrilor, nu
sunt prea mici (practic nu sunt mai mici dect 5), funcia considerat are repartiia
2
_
cu (s1)k grade de libertate, s fiind numrul de valori observate, iar k numrul
parametrilor estimai. Dac ntre repartiia de selecie i repartiia teoretic exist
concordan, atunci statistica
2
_ definit n relaia

=
k
i
i
i i
n
n n
1
2
2
'
) ' (
_ trebuie s fie
mai mic i nu va depi o valoare determinat
2
; ) 1 ( o
_
k s
corespunztoare
numrului gradelor de libertate (s1)k i pragului de semnificaie dat. Regiunea
critic a testului va fi dat de inegalitatea
2
; ) 1 (
2
o
_ _
k s
>
i deci, dac
2
; ) 1 (
2
o
_ _
k s
s
acceptm ipoteza H
0
, n caz contrar o respingem.

n pachetul standard stats exist funcia R predefinit

chisq.test(x, y = NULL, correct = TRUE,
p = rep(1/length(x), length(x)), rescale.p = FALSE,
simulate.p.value = FALSE, B = 2000)
unde
130
- x = vectorul valorilor din primul eantion
- y = vector (opional) de valori din al doilea eantion
- correct = indicator logic referitor la faptul c se aplic sau nu corecie de
continuitate cnd se aplic testul pentru tabele 2 pe 2 o jumtate se scade din
celelalte
- p = vectorul probabilitilor de aceeai lungime ca vectorul x cu valoari implicite
egale
- rescale.p = indicator logic cu valoarea TRUE n cazul n care este necesar
rescalarea la suma 1, FALSE n cazul n care suma valorilor lui p nu este 1
- simulate.p.value = indicator logic ce specific dac se calculeaz valorile p
cu simulare Monte-Carlo
- B = ntreg ce specific numrul de duplicate folosite n testul Monte-Carlo.


Aplicaie: Considerm c la o facultate din capital 70% dintre studeni sunt
din Bucureti, 10% din Piteti, 10% din Ploieti i 10% din alte judee. Vrem s
testm dac proporiile observate n eantionul considerat difer semnificativ de cele
din ipoteza statistic.
Soluie: Presupunem c frecvenele observaiilor sunt urmtoarele: 145 studeni din
Bucureti, 24 din Piteti, 20 din Ploieti i 11 din alte judee.

Urmtoarea secven de cod R aplic testul
2
_ pentru aplicaia considerat
> frecvente = c(145,24,20,11)
> proportii = c(0.7,0.1,0.1,0.1)
> chisq.test(frecvente,p=proportii)

Chi-squared test for given probabilities

data: frecvente
X-squared = 5.0286, df = 3, p-value = 0.1697
Cuantila
2
_ cu 4-1=3 grade de libertate se pot determina fi din tabele (Tabelul 3 de la
anexa 1), fie n R astfel:
> qchisq(0.95,3)
[1] 7.814728
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.

131

7.1.2 Teste statistice pentru dou eantioane


7.1.2.1 Testul t pentru dou eantioane nepereche

Multe cazuri de analiz statistic implic o comparaie ntre mediile a dou
colectiviti generale. Spre exemplu, un patron al unui restaurant dorete s vad dac
exist diferene ntre vnzrile realizate nainte i dup o campanie de publicitate, un
grup de consumatori dorete s vad dac exist o diferen semnificativ ntre
consumul electric pentru dou tipuri de cuptoare cu microunde etc.
Testul t pentru dou eantioane independente (nepereche) este probabil cel mai
folosit test statistic i cu siguran cel mai cunoscut. Utilitatea testului const n faptul
c statisticienii examineaz cel foarte des natura a dou variabile pentru a afla dac
variabilele sunt asociate sau nu. Testul este folosit ca o metod de evaluare a
diferenelor mediilor a dou grupuri, care pot fi independente (ca de exemplu, [7]
tensiunea arterial a pacienilor sub tratament cu un anumit medicament i tensiunea
arterial a unui grup de pacieni care primesc placebo) sau dependente (ca de
exemplu, tensiunea arteril a unui grup de pacieni nainte i dup ce primesc un
anumit medicament). Testul poate fi folosit i pentru eantioane de dimensiune mic,
dar care sunt distribuite aproximativ normal.
n general, testul t este utilizat n urmtoarele trei situaii, difereniate de
situaia existent ntre dispersiile populaiilor i independena eantioanelor:
- eantioane independente, dispersii egale;
- eantioane independente, dispersii diferite;
- eantioane dependente (perechi, corelate).
Cel mai des ntlnit caz este acel al unui test t pentru dou eantioane
independente, unde componentele din cele dou eantioane nu sunt asociate.
Presupunnd c se cunosc dou eantioane (x
1
, ..., x
n
) i (y
1
, ..., y
m
), n>30, m>30, cu
mediile m
1
, respectiv m
2
i c diferena dintre cele dou este distribuit normal,
ipotezele statistice sunt urmtoarele:
H
0
: m
1
=m
2

H
a
: m
1
m
2

Statistica testului care se calculeaz este urmtoarea:
t =
2
) ( ) (
1 1 1
2
1
2
+
+
|
.
|

\
|
+


= =
m n
y y x x
m n
y x
m
j
i
n
i
i

Aceasta este repartizat Student cu n+m-2 grade de libertate.
Regiunea critic este dat de:
|t| > t
2 , 2 / +m n o


Reamintim c n pachetul standard stats se gsete funcia R t.test pe care
am folosit-o pentru a aplica testul t pentru un singur eantion. Prototipul acesteia era

t.test(x, y = NULL, alternative = c("two.sided", "less", "greater"),
mu = 0, paired = FALSE, var.equal = FALSE, conf.level = 0.95)
132
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
- conf.level = intervalul de ncredere
De data aceasta o s aplicm funcia t.test pentru dou grupuri.

Exemplu: Considerm doi vectori independeni (nepereche) cu cte 13,
respectiv 8 componente. Aplicm testul t pentru a vedea dac mediile lor sunt egale
statistic. Dac nu specificm n prealabil, se consider c dispersiile celor dou
eantioane nu sunt egale.
Soluie: Urmtoarea secven de cod R aplic testul t pentru aplicaia considerat
> x <- c(79.98, 80.04, 80.02, 80.04, 80.03, 80.03,
+ 80.04, 79.97, 80.05, 80.03, 80.02, 80.00, 80.02)
> y <- c(80.02, 79.94, 79.98, 79.97, 79.97, 80.03,
+ 79.95, 79.97)
> 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:
> x <- c(79.98, 80.04, 80.02, 80.04, 80.03, 80.03,
+ 80.04, 79.97, 80.05, 80.03, 80.02, 80.00, 80.02)
> y <- c(80.02, 79.94, 79.98, 79.97, 79.97, 80.03,
+ 79.95, 79.97)
> t.test(x, y, var.equal=TRUE)
Two Sample t-test
data: x and y
t = 3.4722, df = 19, p-value = 0.002551
alternative hypothesis: true difference in means is
not equal to 0
95 percent confidence interval:
0.01669058 0.06734788
sample estimates:
mean of x mean of y
133
80.02077 79.97875
Rezultatele indic faptul c i de data aceasta (valoarea probabilitii p este 0.002551
< 0.05) exist o diferen semnificativ statistic ntre mediile celor dou grupuri. Cu
alte cuvinte, cum media primului grup este 80.02077 i media celui de-al doilea grup
este 79.97875, primul grup este mai semnificativ statistic dect al doilea grup.

Exist i modalitatea grafic pentru compararea celor dou grupuri de date:
>plot(ecdf(x),do.points=FALSE,verticals=TRUE,xlim=range(x, y))
>plot(ecdf(y),do.points=FALSE,verticals=TRUE,add=TRUE)
care conduce la urmtorul grafic al funciilor de repartiie empirice


7.1.2.2 Testul Wilcoxon pentru dou eantioane nepereche

Testul Wilcoxon (al rangurilor cu semn) pentru dou eantioane nepereche
este o variant neparametric a testului t prezentat anterior aplicat pentru dou
eantioane independente (nepereche). Doar c testul Wilcoxon nu face presupunerea
c diferena dintre cele dou variabile este distribuit normal.
Presupunerea care se face este aceea c mediana diferenelor ntre perechi de
observaii este zero. La testul t se fcea presupunerea c media diferenelor perechilor
de observaii este zero.
Ideea acestui test este urmtoarea. n primul rnd, valorile perechi pentru care
diferena este zero se ignor. Apoi, fiecare valoare absolut a diferenelor dintre
observaii primete un rang: cea mai mic diferen primete valoarea 1, urmtoarea
rangul 2, etc. Dac avem diferene egale, ambele vor primi ca rang media rangurilor.
Rangurile tuturor diferenelor dintr-o direcie (pozitiv/negativ) se nsumeaz i
rangurile din direcia opus de asemenea i se obin valorile W
-
i W
+
. Cea mai mic
dintre aceste valori este valoarea testului, W. Spre deosebire de alte teste, valori mici
pentru W sunt puin probabile n cazul ipotezei nule.

n pachetul de funcii R stats exist funcia predefinit wilcox.test, cu
prototipul:

wilcox.test(x, y = NULL, alternative = c("two.sided", "less",
"greater"), mu = 0, paired = FALSE, exact = NULL, correct = TRUE,
conf.int = FALSE, conf.level = 0.95)
134
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:
H
0
: durata de via a bateriilor modificate este aceeai cu cea a celor scumpe
H
a
: 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.

135
7.1.2.3 Testul t pentru dou eantioane pereche

Testul t pentru dou eantioane dependente (pereche) este folosit, n general,
cnd msurtorile provin de la acelai subiect nainte i dup o anumit aciune.
Ipoteza nul pe care o testm este aceea c diferena medie ntre perechile observate
este zero. Pentru a aplica acest test mai trebuie ca cele dou eantioane s aib aceeai
lungime.
Presupunem c se cunosc dou eantioane dependente de lungime egal:
(x
1
,..., x
n
) i (y
1
,..., y
n
). n acest caz, statistica testului este urmtoarea:
t =
d
y x
,
unde x , respectiv y reprezint media de selecie celor dou eantioane, iar d
reprezint eroarea standard a diferenei dintre componentele celor dou eantioane
care se poate calcula astfel
d =
1
) ( ) (
2
1
1
1
2

|
.
|

\
|


= =
n
y x y x
n
i
i i
n
n
i
i i

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
136
> 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

Testul F (testul Snedecor) pentru dou eantioane independente este un test de
comparare folosit pentru a determina dac dispersiile acestora sunt egale sau nu
statistic. Testarea ipotezei privind dispersia poate fi utilizat pentru a trage concluzii
privitoare la consistena unor procese economice ori privitoare la riscurile asociate.
Situaia cnd se poate aplica testul F poate fi recunoscut prin:
- dou populaii caracterizate de variabilele X
1
respectiv X
2
;
- variabilele sunt repartizate normal, X
1
~ N(m
1
,
2
1
o ) i X
2
~ N(m
2
,
2
2
o );
- dou eantioane, unul din fiecare populaie: (x
1
,...., x
1
n
), respectiv (y
1
,...., y
2
n
).
Ipotezele testului pot fi de tip att de tip lateral ct i de tip bilateral.
Testul bilateral:
H
0
:
2
1
o /
2
2
o = 1 (egalitatea dispersiilor celor dou populaii)
H
a
:
2
1
o /
2
2
o 1
Testul unilateral:
H
0
:
2
1
o /
2
2
o = 1
H
a
:
2
1
o /
2
2
o < 1 sau
2
1
o /
2
2
o > 1
Cnd ipoteza nul este adevrat, statistica
F* =
2
2
2
1
S
S
,
este repartizat Snedecor
1 , 1 ,
2 1
n n
F
o
pentru un prag de semnificaie , unde

=
1
1
2
1
2
1
) (
1
1
n
i
i
x x
n
S estimaie nedeplasat pentru
2
1
o

=
1
1
2
2
2
2
) (
1
1
n
i
i
y y
n
S estimaie nedeplasat pentru
2
2
o

=
=
1
1
1
1
n
i
i
x
n
x media de selecie a primului eantion

=
=
1
1
2
1
n
i
i
y
n
y media de selecie a celui de-al doilea eantion
Repartiia F (Snedecor) cu
1
, respectiv
2
grade de libertate are funcia de
densitate de forma:
137
f(x) =
2
2
1
2
2 1
2 1
2 /
2
1
2 1
1
1
1
2 2
2
v v
v
v
v v v
v v
v
v
+

|
|
.
|

\
|
+
|
.
|

\
|
I |
.
|

\
|
I
|
.
|

\
| +
I
|
|
.
|

\
| x
x , x0
Decizia, la pragul de semnificaie , pentru testul bilateral este urmtoarea: se
respinge ipoteza nul H
0
n favoarea ipotezei alternative H
a
dac:
F* >
1 , 1 , 2 / 1
2 1
n n
F
o
sau F* <
1 , 1 , 2 /
2 1
n n
F
o

Decizia, la pragul de semnificaie , pentru testul unilateral este urmtoarea:
se respinge ipoteza nul H
0
n favoarea ipotezei alternative H
a
dac:
F* >
1 , 1 , 1
2 1
n n
F
o


n pachetul de funcii R stats exist funcia predefinit wilcox.test, cu
prototipul:

var.test(x, y, ratio = 1, alternative = c("two.sided", "less",
"greater"), conf.level = 0.95, ...)
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)
> y <- rnorm(30, mean = 1, sd = 1)
> var.test(x, y) # x i y au aceeai dispersie?
F test to compare two variances
data: x and y
F = 5.4473, num df = 49, denom df = 29, p-value =
6.182e-06
138
alternative hypothesis: true ratio of variances is not
equal to 1
95 percent confidence interval:
2.736839 10.248600
sample estimates:
ratio of variances
5.447279
> qf(0.975,49,29) #quantila F(1-alpha/2,n1-1,n2-1)
[1] 1.990354
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 log-
normal. 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 F
n
ctre funcia
teoretic de repartiie F, Kolmogorov a demonstrat urmtoarea teorem:

=


= =
|
|
.
|

\
|
<
k
k k
n
n
e K
n
d P
2 2
2
) 1 ( ) ( lim

,
unde .> 0 i ) ( ) ( max x F x F d
n n
= .
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 H
0
c
repartiia empiric urmeaz o anumit lege de repartiie.
Dac ipoteza H
0
este adevrat, atunci diferenele ) ( ) ( x F x F
n
nu vor depi o
anumit valoare
n
d
; o
pe care o fixm astfel nct: o
o
= > ) / (
0 ;
H d d P
n n
, unde
este riscul de gradul nti. Dar ) ( 1 ) (
; ; n n n n
d d P d d P
o o
s = > .
Lund
n
d
n
o
o

=
;
, nseamn c atunci cnd H
0
este adevrat i n suficient de
mare avem: o

o
o o
= = |
.
|

\
|
s = |
.
|

\
|
> ) ( 1 1 K
n
d P
n
d P
n n
.
Unui prag de semnificaie dat i corespunde prin relaia o
o
= 1 ) ( K o
valoare
o
astfel nct, pentru un volum n dat al seleciei gsim valoarea
n
d
n
o
o

=
;
.
139
Regiunea critic pentru ipoteza H
0
este dat de relaia
n
d
n
o

> . Deci:
dac
n
d
n
o

< , exist concordan ntre F


n
i F i se accept ipoteza H
0

dac
n
d
n
o

> , nu exist concordan i respingem ipoteza H


0
.

n pachetul standard stats din R exist funcia ks.test

ks.test(x, y, alternative = c("two.sided",
"less", "greater"), exact = NULL)
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.


7.1.2.6 Testul Sign

Testul Sign (al semnelor) este unul dintre cele mai simple teste statistice.
Acesta se aplic cnd nu putem msura diferena dintre cele dou eantioane, dar
putem observa c exist o diferen ntre eantioanele n discuie. Se utilizeaz
semnul diferenei i nu valoarea acesteia, atunci cnd ambele valori sunt msurate
pentru aceiai subieci. Dac nu ar exista nicio diferen ntre valorile perechi, atunci
numrul diferenelor pozitive ar trebui sa fie egal cu cel al diferenelor negative. Cu
ct numrul diferenelor de un anumit semn este mai mare comparativ cu cel al
diferenelor de semn opus, cu att crete posibilitatea ca diferena dintre variabile s
fie statistic semnificativ. Putem formula ipoteza testului astfel: p = P(X>Y) i ipoteza
nul este n acest caz
H
0
: p=0.5
140
Acest ipotez implic faptul c dndu-se o pereche aleatoare de msurtori (x
i
, y
i
)
i

atunci x
i
i y
i
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

Conf.Level L.E.pt U.E.pt
Lower Achieved CI 0.9297 -2 -1.000
Interpolated CI 0.9500 -2 -0.675
Upper Achieved CI 0.9922 -2 0.000

Cum p-valoarea este 0.01563 este foarte mic, atunci se respinge ipoteza nul in
favoarea ipotezei alternative.

141

7.1.2.7 Testul de independen
2
_

Testul de independen
2
_ se folosete pentru a verifica dac dou variabile
aleatore sunt independente sau nu. Se consider un tabel sk n care cele s linii
corespund la s selecii independente, iar cele k coloane se refer la k evenimente E
1
,
E
k
. Se noteaz cu n
ij
frecvena observat a evenimentului E
j
n selecia de ordin i
(numerele n
ij
se numesc celule de frecven). Teoria statistic spune c dac
(n
i.
)
i=1,2,,s
sunt cunoscute apriori, dac sunt obinute s selecii independente, dac
parametrii
1
,
2
,,
l
sunt estimai cu ajutorul celulelor de frecven observate i
metodei minimului
2
_ , substituind parametrii
1
,
2
,,
l
n p
j
= P(E
j
) i acetia n
formula
X
2
=

= =

s
i
k
j
j i
j i ij
p n
p n n
1 1
2
) (
,
cu

=
=
k
j
ij i
n n
1
, i = 1, 2,, s,
atunci varibila aleatoare X
2
, pentru n mare, are aproximativ o repartiie
2
_ cu
numrul gradelor de libertate egal cu numrul celulelor de frecven micorat cu
numrul de parametri estimai. n cazul unei selecii de volum n, avem s = 1 i
cantitatea X
2
rezultat are pentru un numr n mare aproximativ o repartiie
2
_ cu
numrul gradelor de libertate egal cu numrul de celule micorat cu numrul
parametrilor estimai i cu o unitate.
Fie p
ij
probabilitatea ca un individ luat la ntmplare din populaia considerat
s aparin liniei j i coloanei j. Dac
i
p este probabilitatea ca un individ s aparin
liniei i i
j
p

este probabilitatea ca un individ s aparin coloanei j, atunci ipoteza c


cele dou variabile sunt independente poate fi scris sub forma
H
0
:
j i ij
p p p

= , i = 1, 2,, s i j = 1, 2,, k.
Dac avem o selecie de volum n i n
ij
sunt frecvenele observate, atunci
X
2
=

= =

s
i
k
j
j i i
j i ij
p p n
p np n
1 1
2
) (



Deoarece
i
p i
j
p

sunt necunoscute, conform metodei verosimilitii maxime,


acestea se pot estima cu n n
i
/

, respectiv n n
j
/

, unde

=
=
k
j
ij i
n n
1

, respectiv

=
=
s
i
ij j
n n
1

.
Atunci varibila
X
2
=

= =

s
i
k
j
j i
j i ij
n n n
n n n n
1 1
2
/
) / (



142
urmeaz repartiia
2
_ [sk(s+k2) = (s1)(k1)].

Testul este valid dac cel puin 80% dintre frecvenele probabile depesc
valoarea 5 i toate frecventele probabile depesc valoarea 1. Aceast condiie este
necesar pentru ca repartiia multinomial s poat fi aproximat cu o repartiie
normal, dar limiteaz semnificativ utilizarea testului
2
_ . n cazul n care o frecven
probabil este sub valoarea 2 sau dac mai mult de 20% din frecvenele probabile sunt
sub valoarea 5, se recomand utilizarea testului exact al lui Fisher. Atenie c
frecvenele probabile calculate n cadrul testului nu sunt frecvente observate.

Aplicaie: S considerm baza de date survey, n care coloana smoke
conine rspunsurile referitoare la fumat a 237 de studeni, cu variantele heavy,
regul (regulary), ocass (ocassionally) sau never, iar coloana exer se refer la
ct de mult micare fac studenii, cu variantele acceptate freq (frecvent), some
sau none. Aceste date se pot pune ntr-un tabel de contingen astfel:
> library(MASS)
> t = table(survey$Smoke, survey$Exer)
> t
Freq None Some
Heavy 7 1 3
Never 87 18 84
Occas 12 3 4
Regul 9 1 7
S testm acum ipoteza c obiceiul fumatului studenilor chestionai este independent
de micarea fizic fcut de acetia la nivelul de semnificaie de 0,05.
Soluie: Putem aplica testul
2
_ de independen prin utilizarea funciei predefinite
chisq.test astfel
> chisq.test(t)
Pearsons Chi-squared test
data: t
X-squared = 5.4885, df = 6, p-value = 0.4828

Warning message:
In chisq.test(t) :
Chi-squared approximation may be incorrect
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
143
> 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

Testul exact al lui Fisher reprezint o alternativ a testului
2
_ n examinarea
asociaiilor n cadrul unui tabel de contingen 22, atunci cnd frecvenele probabile
sunt mici. Condiia de aplicare a acestui test este ca totalurile pe rnduri i pe coloane
s fie fixe, cunoscute dinainte.
Pentru a ti dac ntre cele dou variabile aleatoare componente ale vectorului
aleator (X, Y) exist o legtur semnificativ, se poate emite ipoteza H
0
c cele dou
variabile aleatoare sunt independente i c deci repartiiile unitilor n cele patru
rubrici ale tabelei vor fi urmtoarele

x
1
x
2
Total
y
1

n
n n
1
1

n
n n
1 2

1
n
y
2

n
n n
2 1

n
n n
2 2

1
n

1
n
2
n

Pentru a vedea dac ntre cele dou variabiel aleatoare exist sau nu o conexiune,
trebuie s calculm nu numai probabilitatea P(n
11
, n
12
, n
21
, n
11
/
1
n
2
n ), dar i
probabilitile de a se obine repartiii care fa de cea observat se ndeprteaz mai
mult de repartiia din cazul independenei.
Dac n
11
< n n n /
1
1

, tabelele ce se ndeprteaz mai mult sunt acelea care au
prima celul egal respectiv cu (n
11
-1), (n
11
-2),, 1, 0 uniti.
Dac n
11
> n n n /
1
1

, tabelele extreme sunt acelea care au n prima celul
respectiv (n
11
+1), (n
11
+2),, min{
1
n ,
1
n }.
Compararea sumelor
P(n
11
) =

=
11
0
) (
n
i
i p , dac n
11
< n n n /
1
1


P(n
11
) =

=
} , min{
1 1
11
) (

n n
n i
i p , dac n
11
> n n n /
1
1




n pachetul de programe stats exist funcia R predefinit

fisher.test (x, y = NULL, workspace = 200000, hybrid = FALSE,
control = list(), or = 1, alternative = "two.sided",
conf.int = TRUE, conf.level = 0.95,
simulate.p.value = FALSE, B = 2000)
144
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 H
0
c cele dou
variabile aleatoare sunt independente i deci c repartiiile unitilor n cele patru
rubrici ale tabelei vor fi urmtoarele:

x
1
x
2
total
y
1

n n n /
1
1

n n n /
1
2


1
n
y
2

n n n /
2
1

n n n /
2
2


2
n

1

n
2

n


Pentru a vedea dac ntre cele dou variabile aleatoare exist sau nu o
conexiune, trebuie s calculm nu numai probabilitatea P(n
11
, n
12
, n
21
, n
11
/
1
n
2
n ),
dar i probabilitile de a se obine repartiii care fa de cea observat se ndeprteaz
mai mult de repartiia din cazul independenei.
Dac n
11
< n n n /
1
1

, tabelele ce se ndeprteaz mai mult sunt acelea care au
prima celul egal respectiv cu (n
11
-1), (n
11
-2),, 1, 0 uniti.
Dac n
11
> n n n /
1
1

, tabelele extreme sunt acelea care au n prima celul
respectiv (n
11
+1), (n
11
+2),, min{
1
n ,
1
n }.
Compararea sumelor
P(n
11
) =

=
11
0
) (
n
i
i p , dac n
11
< n n n /
1
1


145
P(n
11
) =

=
} , min{
1 1
11
) (

n n
n i
i p , dac n
11
> n n n /
1
1


probabilitilor relative tabelei observate i cu probabilitile care se ndeprteaz tot
mai mult de repartiia n cazul independenei comparat cu nivelul de semnificaie ,
permite s decidem asupra concordanei sau neconcordanei rezultatelor
experimentale cu ipoteza de H
0
de independen.
ntr-o asemenea comparaie trebuie s inem seama dac alternativa ipotezei
H
0
este uni- sau bilateral. n primul caz vom compara pe
P(n
11
,

n
12
, n
21
, n
22
|

2 1
,

n n
) =
! ! ! ! !
! ! ! !
22 21 12 11
2 1 2 1
n n n n n
n n n n


cu , ntr-un al doilea cu /2.
Trebuind s recurgem la factoriale, vom lua n ntotdeauna n consideraie
rubrica n care apare cea mai mic frecven observat. Aceasta este posibil, deoarece
toate tabelele se alctuiesc cu aceeai repartiie marginal i pe de alt parte fiind vorba
de tabele dictonice, au un singur grad de libertate, care odat fixat valoarea pentru o
celul, automat rmn fixate i valorile pentru celelalte.

Aplicaie: Cluster i Galii n 2002 cu zburat cu un avion pentru a urmri
speciile strcul mare albastru i marele egrete de la locul de odihn la primul loc de
hrnire de pe lacul Peltier, Minnesota i au notat tipul pmnt pe care au aterizat,
obinndu-se urmtorul tabel

Strc Egret
Vegetaie 15 8
rm 20 5
Ap 14 7
Structuri 6 1
S testm ipoteza conform creia cele dou specii de psri folosesc locurile de
aterizare n proporii egale.
Soluie:
t = matrix (c(15,8,20,5,14,7,6,1), nrow=4, ncol=2,
dimnames = list( Loc = c("vegetatie", "tarm", "apa",
"structuri"), Pasari = c("starc","egreta")) )
> t
Pasari
Loc starc egreta
vegetatie 15 14
tarm 8 7
apa 20 6
structuri 5 1
> fisher.test(t)
Fisher's Exact Test for Count Data
data: t
p-value = 0.1587
alternative hypothesis: two.sided

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.
146

7.1.3 Teste statistice pentru 3 sau mai multe eantioane


7.1.3.1 Testul de analiz dispersional ANOVA

Analiza dispersional (ANOVA, Analysis of variance) este cea mai folosit
metod pentru compararea mediilor grupurilor pentru variabilele cantitative. ANOVA
combin i extinde testele t i
2
_ , prin testarea egalitii dintre trei sau mai multe
medii (pentru trei sau mai multe grupuri). De subliniat este faptul c ANOVA se poate
folosi cu rezultate foarte bune i la comparaia dintre dou medii, ns testul i
arat adevrata valoare la trei sau mai multe medii.
Se testeaz aadar legtura dintre o variabil metric (pentru care se
calculeaz media) i o variabil calitativ (a crei valori sau categorii sunt considerate
grupuri independente). De asemenea, ANOVA face o introducere clar n analiza
cauzal: variabila cauz (independent) este cea calitativ, iar variabila efect
(dependent) este cea metric.
Sunt foarte multe modele experimentale care pot fi analizate cu diferite tipuri
de analize dispersionale, ns n aceast seciune vom vorbi despre analiza
dispersional simpl (ntr-un singur sens).

Aplicaie: Se considerm urmtoarele dou variabile: vrsta = vrsta la
angajare a unei persoane (variabl cantitativ) i stratin = strategia de atragere a
tinerilor (variabil calitativ). n cazul nostru, ne raportm doar la strategia de
atragere a tinerilor; este important ns de tiut c vrsta la angajare a tinerilor poate fi
influenat de diveri factori i c exist variante ale analizei de varian care iau n
calcul mai muli asemenea factori. De pild, varianta care ia n calcul doi factori se
numete ANOVA bi-factorial (n engl. two-way ANOVA), iar varianta care ia n
calcul mai muli factori se numete ANOVA multi-factorial (n engl. multi-way
ANOVA).
S presupunem c studiem oportunitile de acces a tinerilor pe piaa forei de
munc i analizm diferite strategii folosite pentru a atrage tinerii s se angajeze.
Ipoteza pe care dorim s o testm este urmtoarea: media de vrst a persoanelor
nou angajate este influenat de strategia de atragere utilizat. Setul de ipoteze
sttistice pentru ANOVA este:
H
0
: m
1
= m
2
= = m
k

H
a
: cel puin dou medii sunt diferite
n cuvinte, ipoteza nul susine c nu este nici o diferen ntre rezultatele diferitelor
strategii (fie sunt toate strategiile foarte bune i atrag muli tineri, fie sunt toate foarte
slabe i nu atrag tineri), iar ipoteza alternativ susine cel puin o strategie d rezultate
mai bune dect cel puin una dintre celelalte (este posibil ca o strategie s aib un
rezultat de mijloc, care nu este semnificativ diferit nici fa de strategia de succes
maxim, nici fa de strategia care atrage cei mai puini tineri; diferena semnificativ n
acest caz exist doar ntre prima i ultima strategie).
Dup cum se poate vedea n tabelul urmtor, primul grup (cel de control, din
localitatea unde nu s-a aplicat nici o strategie) are o medie a vrstei la angajare de
27,8 ani cu o abatere standard de 3,65 ani; al doilea grup (din localitatea unde s-a
aplicat prima strategie) are o medie de 23,6 ani cu o abatere standard de 3,34 ani, iar
al treilea grup o medie de 26,3 ani cu o abatere standard de 3,59 ani. La o prim
147
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 Localitate 2 Localitate 3
1
2
3
4
5
6
7
8
9
10
22
27
32
30
29
27
33
24
24
30
28
22
24
18
21
26
25
20
24
28
20
28
31
26
26
30
21
25
29
27
x
s
27,8
3,65
23,6
3,34
26,3
3,59

Analiznd tabelul, putem extrage cteva informaii interesante, care ne vor
ajuta n cele ce vor urma. Avem un eantion total format din 30 de persoane, deci
n=30. Acest eantion este format din trei grupuri independente de cte 10 persoane
fiecare (subeantioane din trei localiti diferite); avem deci: n
1
=10, n
2
=10 i n
3
=10.
Pentru fiecare dintre cele trei localiti / grupuri putem calcula cte o medie i cte o
abatere standard; mai avem aadar:
1
x = 27,8 cu s
1
= 3,65,
2
x = 23,6 cu s
2
= 3,34 i
3
x = 26,3 cu s3 = 3,59. n acelai timp, putem calcula o medie general pentru
eantionul total (pentru toate cele 30 de observaii) x = 25,9 precum i o abatere
standard total s = 14,714.
Poate fi determinat variaia mediilor de grupuri n jurul mediei generale:

=
k
j
j x
x x
k
s
1
2
) (
1
1

Aceasta indic o estimare a erorii standard din populaie, de unde putem extrage
foarte simplu varian din populaie ES = n / o .
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
148
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 p-
valoarea 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, ...)
149
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)
> grup = factor(v)
#inainte de functia "aov" trebuie convertit vectorul
#calitativ intr-un factor
> analiza = aov(localitati~grup) #analiza dispersiei
> summary(analiza)
Df Sum Sq Mean Sq F value Pr(>F)
grup 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

> TestulTukey = TukeyHSD(analiza,"grup")
> TestulTukey
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = localitati ~ grup)
$grup
diff lwr upr p adj
2-1 -4.2 -8.112164 -0.2878359 0.0335040
3-1 -1.5 -5.412164 2.4121641 0.6136386
3-2 2.7 -1.212164 6.6121641 0.2194422
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%.





150
7.1.3.2 Testul Kruskal-Wallis

Acesta este o variant neparametric pentru a testa egalitatea mediilor
ntre grupuri, identic cu Anova unidirecional, datele fiind nlocuite de ranguri. n
plus, testul Kruskal-Wallis nu presupune populaii distribuite normal.
Pe baza celor k eantioane independente din k populaii, paii de calcul ai
testului sunt urmtorii:
- se ordoneaz valorile din cele k eantioane ca i cum ele ar fi fost obinute din
aceeai populaie;
- se atribuie cte un rang observaiilor aezate n ordine, de la 1 la n (pentru
observaii cu acelai rang, fiecruia i se va atribui media rangurilor pe care le-ar fi
primit dac nu ar fi avut acelai rang).
- se calculeaz statistica H
KW
= ) 1 ( 3
) 1 (
12
1
2
+
+

=
n
n
R
n n
k
i
i
i
, unde R
i
reprezint suma
rangurilor din eantionul i, n
i
reprezint numrul observaiilor eantionului i,
i=1,2,, k, iar n este volumul seleciei totale;
- se compar H
KW
cu valoarea teoretic
2
) 1 )( 1 ( k o
_ i dac H
KW

2
) 1 )( 1 ( k o
_
atunci ipoteza nul se respinge, respectiv dac H
KW
<
2
) 1 )( 1 ( k o
_ atunci ipoteza
nul se accept.

n pachetul standard de funcii R stats exist funcia predefinit
kruskal.test, cu urmtoarele variante de prototip:
kruskal.test(x,...)
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
151
Min. 1st Qu. Median Mean 3rd Qu. Max.
22.00 24.75 28.00 27.80 30.00 33.00
------------------------------------------------
grup: 2
Min. 1st Qu. Median Mean 3rd Qu. Max.
18.00 21.25 24.00 23.60 25.75 28.00
------------------------------------------------
grup: 3
Min. 1st Qu. Median Mean 3rd Qu. Max.
20.00 25.25 26.50 26.30 28.75 31.00

> kruskal.test(localitati,grup)
Kruskal-Wallis rank sum test
data: localitati and grup
Kruskal-Wallis chi-squared = 5.8546, df = 2, p-value
= 0.05354
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.




152

7.2 Serii de timp


O serie de timp reprezint o mulime de date msurate la intervale egale de
timp. Datele sunt numerice i reprezint valoarea unei mrimi fizice (serie
unidimensional) sau a mai multor mrimi msurate simultan (serie
multidimensional sau vectorial). In cele ce urmeaz o s exemplificm o parte din
teoria seriilor de timp pe date reale. Utilizm ca date concentraia de CO n centrul
oraului Bucureti. Datele msurate la interval de o or provin de la staia Cercul
militar, Calea Victoriei, ntre 1/1/2007 01:00 i 12/30/2008 24:00. Ca date de lucru
am utilizat esantionul dintre 1/3/2008 01:00 - 31/5/2008 24:00 i am ncercat s
prezicem poluarea pentru urmtoarele cteva zile.
Datele sunt citite iniial dintr-un fiier text i reprezentate grafic:

co=read.table(file.choose())
vco=as.matrix(co)
tsco<-ts(vco,frequency=168)
plot(tsco,main="Concentratia de CO intre 1/3/2008 01:00 -
31/5/200824:00")

Concentratia de CO intre 1/3/2008 01:00 - 31/5/2008 24:00
Time
V
1
2 4 6 8 10 12 14
0
1
2
3
4
5

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
153
numrul de observaii pe unitatea de timp, x este un obiect R. Noi am luat frecvena
168=numrul de ore dintr-o sptmn (bnuind c exist o periodicitate
sptmnal). Ca urmare unitatea de timp este sptmna.

7.2.1 Analiza statistic a seriilor de timp

Analiza statistic a seriilor de timp conform cu modelul Box-Jenkins
18

cuprinde urmtoarele stagii:

a. Identificarea modelului
b. Estimarea parametrilor
c. Validarea modelului (diagnosticul veridicitii modelului ales)
d. Utilizarea modelelor pentru predicii

Ca i resurs de baz pentru analiza seriilor de timp utilizm cartea [4] unde se
gsesc elementele de teorie ca i modul de utilizare a sistemului R pentru analiza
seriilor de timp. Exemplele sunt n general luate din baze de date din realitate care se
instaleaz odat cu R. Cartea lui Brockwell i Davis
19
conine pas cu pas etapele
analizei seriilor de timp cu concentrare pe modelele ARIMA cu explicaiile teoretice
necesare i demonstraii pentru teoremele mai uoare. Exemplele sunt realizate ntr-
un program de calcul elaborat de autori, ITSM2000, care n varianta gratuit este
disponibil pe internet (dar este limitat la serii ce nu depesc 200 de nregistrri).
Pentru cei ce urmresc teoria matematic a seriilor de timp o alt carte a acelorai
autori
20
, aprut n 1991, pune la dispoziie demonstraii riguroase pentru teoreme
dificile din domeniu.

a. Identificarea modelului

Pentru identificarea modelului de serie temporal este nevoie de:
a1. Identificarea tendinei, adic a unei componente ca variaz n timp dup o
formul cunoscut i care poate fi extrapolat pentru a prezice valori pentru momente
viitoare. Uneori unele transformri ale seriei iniiale permit identificarea mai uoar a
tendinei. Identificarea unor componente cu variaie periodic exprimabile de
asemenea ntr-o form care s permit determinarea valorilor lor pentru momente
viitoare face ca evoluia determinist a seriei s fie exprimat prin
t t
s m + unde
t
m
este tendina neperiodic iar
t
s este partea periodic. In anumite determinri ale
tendinei partea periodic este inclus n formula pentru
t
m astfel c tendina i partea
periodic nu se disting.
a2. Dup extragerea din serie a tendinei i a componentelor sezoniere
urmeaz analiza resturilor. Dac aceste resturi se comport ca nite valori ale unor v.
a. independente atunci ele nu mai pot fi prognozate. Dac ns exist o anume
corelaie ntre ele atunci exist posibilitatea de a stabili modele stochastice pentru ele

18
G. E. P. Box, G. M. Jenkins. Time Series Analysis, Forecasting and Control. (1976).
San Francisco: Holden-Day.
19
P. J. Brockwell, R. A. Davis. Introduction to Time Series and Forecasting. Springer-Verlag New
York Berlin Heidelberg, 2002
20
P.J. Brockwell, R.A. Davis, (1991), Time Series: Theory and Methods, 2nd Edition, Springer-Verlag,
New York.
154
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 ( )
Z t t
X
e
sau ( )
N t t
X
e
. Descompunerea n tendin plus componenta
periodic plus partea rezidual se poate scrie
t t t t
Y s m X + + = (7.2.1)
In formula de mai sus
t
m este tendin iar
t
s este componenta periodic. Pentru
tendin se utilizeaz n general metoda celor mai mici ptrate. Se specific modelul
de exemplu bt a m
t
+ = 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 Explicaii
y ~ x sau y~1+x y~a+bx
y ~ 0 + x sau y ~ -1 + x sau y ~ x - 1 y~bx
log(y) ~ x1 + x2 log(y) ~a+b*x1+c*x2
y ~ 1+x+I(x^2) y ~ a+b*x+c*x^2
y~1+x+I(sin(2*x)) 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)
155
lines(x,y2,lwd=3,lty=4)
grid(5,5)

Rezultatul este n figura urmtoare:
1 2 3 4
2
4
6
8
Modelele y~1+x si y~1+x+I(sin(2*x))
x
y

Fig 7.2

Coeficienii celor dau modele sunt:

> m1

Call:
lm(formula = y ~ 1 + x)

Coefficients:
(Intercept) x
0.02623 2.01722
> m2

Call:
lm(formula = y ~ 1 + x + I(sin(2 * x)))

Coefficients:
(Intercept) x I(sin(2 * x))
-0.06758 2.04058 0.26963

Pe figur vedem c modelul y~1+x+I(sin(2*x)) aproximeaz mai bine
graficul (x,y) fa de modelul y~1+x.

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)
156

Parametrii obligatorii sunt:
i. f=funcia de minimizat sub forma unei expresii de parametrii cutai i
ii. p=valori iniiale pentru aceti parametri.

De exemplu pentru a modela
x p
3 2 1
4
e p x p p ~ y + + unde parametrii
4 3 2 1
p , p , p , p se vor determina prin metoda celor mai mici ptrate trebuie s utilizm
funcia ( ) ( )

+ + =
i
2
x p
3 2 1 i
4
e p x p p y ) p ( f , adic
f(p)= sum((y-p[1]-p[2]*x-p[3]*exp(p[4]*x))^2)

Datele x i y trebuie s fie disponibile la momentul apelrii funciei f. Dei nu
sunt parametri de intrare pentru f, x i y se vd n contextul n care este funcia f
apelat. Scriptul urmtor face o estimare a parametrilor p.

x=1:20/5
y=rnorm(20)/5+2*x+0.2*sin(2*x)
f<-function(p){sum((y-p[1]-p[2]*x-p[3]*exp(p[4]*x))^2)}
m3<-nlm(f,c(1,2,3,0))
p=m3$estimate
y1=p[1]+p[2]*x+p[3]*exp(p[4]*x)
plot(x,y,main="Estimare neliniara")
lines(x,y1)
grid(5,5)

Graficul punctelor date i al estimrii (regresiei) neliniare este:

1 2 3 4
0
2
4
6
8
Estimare neliniara
x
y

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

157
$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 ( )
t
x sunt calculate succesiv prin
( )
1 t t t
m 1 x m

o + o = (7.2.2)
cu ) 1 , 0 ( e o . Alegerea lui o este subiectiv. Dac datele ncep cu
1
x atunci avem :
( ) ( ) ( )
t 1 t 2
2 t
1
1 t
t
x x 1 ... x 1 x 1 m o + o o + + o o + o =


.
In acest fel tendina este pstrat sub forma unui vector de valori ( )
T t 1 t
m
s s
.
Estimarea dup timpul maxim de msurare, T, se face prin
T k T
m m =
+
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
t
m ct i a pantei
t
P sub forma:

( )
( )( )
( ) ( )
1 t 1 t t t
1 t 1 t t t
1 n
1
1 1
P 1 m m P
P m 1 x m
2 n exemplu de , n un pentru
1 n
x x
P
x m


| + | =
+ o + o =
=

=
=
(7.2.3)

Parametrii | o, sunt subiectiv alei n intervalul (0,1). Extrapolarea tendinei
pentru t>T se face linear prin
k P m m
T T k T
+ =
+
(7.2.4)
O procedur mai general este Holt-Winters aditiv care mediaz exponenial
tendina
t
m , componenta sezonier
t
s ct i panta tendinei
t
P . Pentru aceasta este
nevoie de trei parametri | o , , alei subiectiv n intervalul (0,1). De asemenea este
nevoie apriori de lungimea L a prii periodice i de valorile iniiale pentru partea
periodic : ( )
L .. 1 t t
s
=
.

( ) ( )( )
1 t 1 t L t t t
P m 1 s x m

+ o + o =
( ) ( )
1 t 1 t t t
P 1 m m P

| + | = (7.2.5)
( ) ( )
L t t t t
s 1 m x s

+ =

158
Predicia valorilor dincolo de pragul t=T se face dup formula:

( ) L mod 1 h 1 T T T k T
s P * k m x
+ + +
+ + = (7.2.6)

Exist i un preocedeu Holt-Winters multiplicativ.

Procedura Holt-Winters implementat n R este apelabil prin:

HoltWinters(x, alpha = NULL, beta = NULL, gamma = NULL,
seasonal = c("additive", "multiplicative"), start.periods
= 2, l.start = NULL, b.start = NULL, s.start = NULL,
optim.start = c(alpha = 0.3, beta = 0.1, gamma =
0.1),optim.control = list())

Dintre parametrii funciei doar x de tip ts este obligatoriu. Rezultatul funciei
este un obiect HoltWinters adic o list cu componentele fitted, x, alpha,
beta, gamma, coefficients, seasonal, SSE, call. Lungimea L a
perioadei este luat egal cu frecvena (frequency) utilizat la definirea seriei
temporale. Dintre elementele listei rezultat, fitted este o list ce conine timpul t,
valoarea estimat
t
x

,
t
m numit level,
t
P numit tendin i
t
s . Prin comanda
help(HoltWinters) se poate afla i semnificaia celorlali parametri.
Predicia valorilor ce urmeaz n serie dup timpul maxim T de msurare se
poate face prin funcia predict. In scriptul ce urmeaz dup determinarea tendinei i a
prii sezoniere (perioada=168) pentru datele CO dinainte, se face o predicie pentru o
sptmn (=168 ore) pentru nivelul de CO. Mai jos avem graficul concentraiei de
CO cu negru (seria de timp tsco a fost creat mai nainte) mpreun cu valorile
netezite prin metoda Holt-Winters cu verde i predicia Holt-Winters pentru 168 de
ore cu albastru.


plot(tsco,main="Co masurat + CO prezis Holt-
Winters",cex=2)
m4<- HoltWinters(tsco)
lines(fitted(m4)[,1], col = 3)
pr <- predict(m4, 168, prediction.interval = FALSE)
lines(pr, main="Predictie Holt-Winters",col=4)



159
Co masurat + CO prezis Holt-Winters
Time
V
1
2 4 6 8 10 12 14
0
1
2
3
4
5

Fig. 7.4

Funcia predict are forma:

predict(object, n.ahead=1, prediction.interval = FALSE,
level = 0.95, ...)

unde object este un model (de exemplu Holt-Winters) ce conine elementele de
predicie dup ultima valoare msurat (conform formulelor Holt-Winters de mai sus).
Rezultatul funciei predict este o serie de timp cu valorile prezise n continuarea celor
ale seriei iniiale.

O alt modalitate de eliminare a tendinei este procedura de difereniere.
Astfel de la o serie ( )
t
x se obine o nou serie ( )
t
y cu
t 1 t t
x x y =
+
. O nou
difereniere conduce la seria ( )
t
z cu
t 1 t 2 t t 1 t t
x x 2 x y y z + = =
+ + +
care se numete
diferena de ordin doi s.a.m.d. Funcia diff din R realizeaz aceste diferene finite la
dreapta:

diff(x, lag = 1, differences = 1, ...)

Parametrii sunt x=vector sau matrice de numere, differences este ordinul
diferenei finite, lag este pasul de timp (de exemplu la lag=2 prima diferen se
calculeaz dup formula
t 2 t t
x x y =
+
). Dac notm B operatorul de ntrziere
( )
1 t t
X BX

= atunci seria obinut prin prima diferen la lag=1 este ( )X B 1 Y = , iar
la lag=2 este ( )X B 1 Y
2
= . Dac y=diff(x) atunci x poate fi restaurat prin
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:
( )

=
=

=

0 pour x ln
0 pour
1 x
y
t
t
t
(7.2.7)
160

In pachetul TeachingDemos exist funcia vis.boxcox care permite
vizualizarea interactiv a graficului seriei temporale dup o transformare Box-
Cox. De asemenea funcia bct(y, lambda) din acelai pachet calculeaz transformarea
Box-Cox de mai sus.


a2. Determinarea modelului pentru reziduali

Analiza rezidualilor (diferenele dintre valorile msurate i cele date de
tendin i componenta sezonier) are scopul de a detremina dac partea care rmne
dup extragerea tendinei i a periodicitii este format din valori fr legtur ntre
ele, caz n care aceste valori reziduale nu mai pot fi prezise, sau au o anumit corelaie
i atunci se poate ncerca o previziune a lor bazat pe un model statistic. Se pot
ncerca testele Box.test (din pachetul stats) sau runs.test (din pachetul tseries).
In cele ce urmeaz ne vom ocupa de serii de timp staionare. Un ir de variabile
aleatoare ( )
Z t t
X
e
se numete temporal staionar slab (staionar de ordinul 2) dac
media ( ) ( )
t X
X E t = este constant (nu depinde de t) i funcia de autocovarian

( ) ( ) ( ) ( ) ( ) | | s X r X E s , r
X s X r X
= (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 t X h t X
X X E h =
+
, independent de
t. Avem:
( ) 0 ) X var( 0
t X
> =
( ) ( ) h h
X X
=
( ) ) 0 ( | h |
X X
s
( ) 0 a j i a a ,.. a , a , 1 k
k
1 j , i
j i k 2 1
> >

=

In general vom scrie ( ) h sau
h
n loc de ( ) h
X
dac nu este pericol de
confuzie asupra seriei temporale X. Numim funcia de autocorelaie funcia:

( )
( )
( ) 0
h
h

= (7.2.9)
In general vom scrie
h
n loc de ( ) h Estimatori numerici pentru medie,
funcia de autocovarian i autocorelaie sunt:
n
X ... X X
X
n 2 1
n
+ +
= (7.2.10)
( )( )

=
+
=
| h | n
1 t
n t n | h | t h
X X X X
n
1
(7.2.11)
0
h
h

= (7.2.12)
Box i Jenkins recomand 50 n > et 4 / n h s pentru estimrile de mai sus.

161
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 t
Z
e
n care fiecare v.a. este de
medie zero i varian
2
o , iar covariana este

( )

=
= o
=
0 h , 0
0 h ,
h
2
Z
(7.2.13)
Variabilele aleatoare
t
Z nu sunt neaprat independente.

Seria temporal i.i.t. este la fel ca zgomotul alb dar toate variabilele
t
Z sunt
independente identic distribuite.

Modelul general linear este o serie temporal ( )
Z t t
X
e
n care

=

=
j
j t j t
Z X ,
( )
Z t t
Z
e
este un zgomot alb i <

= j
j
| | . Se verific fapietul c n acest caz avem
( )

=
+
o =
j
j h j
2
X
h .

Serii staionare MA(q) (medii mobile) sunt serii de forma

=

u + =
q
1 i
i t i t t
Z Z X
unde ( )
Z t t
Z
e
este un zgomot alb . Notm 1
0
= u . Avem ( ) 0 X E
t
= i
( )

>
s u u o
= =

=
+
+
q | h | , 0
q | h | ,
) X , X ( Cov h
| h | q
0 i
| h | i i
2
t h t X
(7.2.14)
Seriile staionare de tip MA(q) sunt singurele serii staionare care au
( ) 0 h
X
= pentru h>q.

Seria staionar autoregersiv AR(p) este o serie de tipul (n general cerem i
ca media s fie zero)
t p t p 2 t 2 1 t 1 t
Z X ... X X X + | + | + | =

unde ( )
Z t t
Z
e
este un
zgomot alb i
t
Z este independent de
k t
X

, k>0. Dac polinomul
( )
p
p
2
2 1
z ... z z 1 z | | | = | are toate rdcinile mai mari ca 1 n modul (serie
cauzal) atunci

=

+ =
1 j
j t j t t
Z Z X cu <

=1 j
j
| | . Inmulind relaia de definiie a
lui
t
X cu
k t
X

gsim sistemul i lund mediile obinem pentru k=1,2,..p:

| + + | + | + | =
| + + | + | + | =
| + + | + | + | =

p 3 p 3 2 p 2 1 p 1 p
2 p p 1 3 2 1 1 2
1 p p 2 3 1 2 1 1
...
.....
...
...
(7.2.15)
162
care prin rezolvare ne d
p 2 1
,... , . Avem de asemenea 1
0
= . Pentru k>p avem
analog
p k p 3 k 3 2 k 2 1 k 1 k
...

| + + | + | + | = . Funcia de autocorelaie se poate
astfel determina complet i nu se anuleaz n principiu nicieri.
Se definete funcia de autocorelaie parial
k , k
| n felul urmtor: Pentru
t
X
i
k t
X
+
se consider componentele perpendiculare pe spaiul vectorial generat de
1 k t 2 t 1 t
X ,... X , X
+ + +
, fie ele
0 , t
X respectiv
k , t
X . Funcia de autocorelaie parial se
definete acum ca i ) X , X ( Corr
k , t 0 , t k , k
= | . Deoarece proieciile depind doar de
produsele scalare reciproce (corelaii ntre
i
X ,
j
X ) i seria este staionar rezult c
k , k
| nu depinde de t ci doar de
i
pentru i=0,1,2,..k. Pentru seriile autoregresive
k , k
|
este zero dac k>p i aceasta este o modalitate de a detecta dac o serie este de tip
AR(p) estimnd pe
k , k
| prin
k , k
|

ce se calculeaz cu ajutorul estimatorilor


i

pentru
corelaiile
i
.

Serii staionare autoregresive medie mobil ARMA(p,q) sunt serii care verific
o relaie de forma:
t q t q 2 t 2 1 t 1 p t p 2 t 2 1 t 1 t
Z Z ... Z Z X ... X X X + u + + u + u + | + | + | =


unde
t
Z este un zgomot alb independent de
k t
X

pentru k>0. Dac seria este cauzal
adic polinomul ( )
p
p
2
2 1
z ... z z 1 z | | | = | are rdcinile mai mari ca 1 n modul
atunci

=

+ =
1 j
j t j t t
Z Z X cu <

=1 j
j
| | . Dac i polinomul
( )
q
q
2
2 1
z ... z z 1 z u + + u + u + = u are toate rdcinile n modul mai mari ca 1
seria se numete invertibil. Funcia de autocovarian se poate determina exact
pentru seriile cauzale dac se dau coeficienii
2
, , o u | , unde
2
o este variana lui
t
Z .
Funcia ARMAacf din pachetul stats face acest lucru n R. Apelul se face prin:

ARMAacf(ar = numeric(0), ma = numeric(0), lag.max = r, pacf =
FALSE)

Se vede din apelul funciei c prin opiunea pacf putem obine funcia de
autocorelaie parial.

Serii nestaionare ARIMA(p,d,q) sunt serile care prin diferena de ordin d la
dreapta devine staionar de tip ARMA(p,q).

Am vzut n modelele de serii temporale staionare c tipurile MA(q), AR(p)
sunt determinate de corelaiile
k
. Estimatorii pentru Proprietile estimatorilor
pentru medie i corelaie pentru seriile staionare pot fi enumate astfel:

i. Dac ( ) <

= h
X
h i ( )

=
=
h
X
h v atunci )
n
v
, 0 ( AN este X
n

(AN=asimptotic normal). In particular acest lucru se ntmpl dac

=

+ =
j
j t j t
Z X cu <

= j
j
| | i ( )
Z t t
Z
e
este un zgomot alb.
163

ii. Dac

=

+ =
j
j t j t
Z X cu <

= j
j
| | , ( )
Z t t
Z
e
este un zgomot alb i n plus
<

= j
2
j
| j | , atunci
( ) <
|
|
.
|

\
|
o =


=

=
2
j
j
2
h
X
| | | h |
i

( )
( )
( )
( )
( )
( )
|
|
|
|
|
|
.
|

\
|
|
|
|
|
|
|
.
|

\
|

|
|
|
|
|
|
.
|

\
|

W
n
1
,
m
.
.
2
1
AN est
m
.
.
2
1


unde matricea
m m
R W

e are componentele

( ) ( ) ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )

=
+ + + + =
=
(

+ +
+ + + + +
=
1 k
k
2
j , i
k j 2 j k j k k i 2 i k i k
i k k j 2 j k k i 2
k j i 2 j k i k j k i k
w
(7.2.16)

(formula lui Bartlett).
In particular ( ) ( )) h h ( n
2 / 1
are pentru n mare o distribuie normal de
medie 0 i varian
h , h
w .

In R funcia de autocorelaie empiric

este calculat cu funcia acf care are


forma:

acf(x, lag.max = NULL,
type = c("correlation", "covariance", "partial"),
plot = TRUE, na.action = na.fail, demean = TRUE, ...)

Rezultatul aplicrii funciei acf este o list ce conine lag=intervale unde este
estimat

, acf=estimrile pentru

, type=la fel ca n apelul funciei acf,


n.used=numrul de observaii din serie, series=numele seriei de timp,
snames=numele componentelor n o serie multivariat. Se vede din definiie c funcia
acf determin i corelaia parial dac alegem corespunztor parametrul type. Dac
alegem plot=TRUE atunci este tiprit funcia de autocorelaie mpreun cu intervalul
de ncredere de 95%.

Pentru determinarea tipului de serie temporal ntre tipurile MA(q), AR(p),
ARMA(p,q) procedm astfel:

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).
164
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")

Rezultatul este n figura urmtoare:
0 10 20 30 40
-
0
.
2
0
.
2
0
.
6
1
.
0
Lag
A
C
F
Series s1
0 10 20 30 40
-
0
.
4
-
0
.
3
-
0
.
2
-
0
.
1
0
.
0
Lag
P
a
r
t
i
a
l

A
C
F
Series s1

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:
0 10 20 30 40
-
0
.
2
0
.
2
0
.
6
1
.
0
Lag
A
C
F
Series s1
0 10 20 30 40
-
0
.
3
-
0
.
2
-
0
.
1
0
.
0
Lag
P
a
r
t
i
a
l

A
C
F
Series s1

Fig. 7.6

Graficele sugereaz un model MA(2).
165
ARMA. Pentru modelele ARMA(p,q) un indiciu asupra valorilor potrivite
pentru p i q este funcia extins de autocorelaie
21
(vezi [4], pag. 116). Funcia
extins de autocorelaie EACF se calculeaz pentru parametrii x=serie temporal,
p,q=numere naturale n intervalele [0, pmax] respectiv [0, qmax]. Rezultatul funciei
este o mulime de coeficieni calculai dup un algoritm complicat dar care ar trebui s
formeze n octantul unde p i q sunt coordonate un triunghi de zerouri cu vrful n
valorile actuale pentru p i q ai seriei ARMA(p,q). Funcia eacf se gsete n pachetul
TSA i are forma:

eacf(z, ar.max = 7, ma.max = 13)

Apelat pe o serie ARMA(2,2) simulat ne d urmtorul rezultat:

s1<-arima.sim(model=list(ma=c(-.3,.5), ar=c(0.4,-0.2)),
n=10000)
par(mfrow=c(1,2))
acf(s1)
acf(s1, type="partial")
eacf(s1)
0 10 30
0
.
0
0
0
.
1
0
0
.
2
0
0
.
3
0
Lag
A
C
F
Series s1
0 10 30
-
0
.
1
0
.
1
0
.
3
Lag
P
a
r
t
i
a
l

A
C
F
Series s1

Fig. 7.7
> eacf(s1)
AR/MA
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 x x x x x o o o o o o o o o
1 x x x x o o o o o o o o o o
2 x x o x x o o o o o o o o o
3 x x x o o o o o o o o o o o
4 x x x x o o x o o o o o o o
5 x x x o x o x o o o o o o o
6 x x x o x x o x o o o o o o
7 x x o x x x x x o x o 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
Tsay, R. S. and Tiao, G. (1984). Consistent estimates of autoregressive parameters and
extended sample autocorrelation function for stationary and nonstationary ARMA
Models. Journal of the American Statistical Association, 79, 385, 8496.
166
eacf i de a determina coeficienii modelului (vezi mai departe). Valorile p i q optime
se determin prin criteriile AIC, BIC etc. (vezi mai departe).

b. Estimarea parametrilor

Dup determinarea tipului ARMA(p,q) urmeaz estimarea parametrilor.
Pentru modelele AR(p) metoda momentelor (Yule-Walker) este eficace. Aceast
metod const n rezolvarea sistemului (7.2.15) n necunoscutele
p 2 1
... , , | | | dac
p 2 1
... , , se nlocuiesc cu estimrile lor
p 2 1
... , ,

. Pentru modele ce conin i
parte medie mobil metoda este mult mai complicat.
Metoda celor mai mici ptrate const n a scrie:

q t q 2 t 2 1 t 1 p t p 2 t 2 1 t 1 t t
Z ... Z Z X .. X X X Z

u u u | | | = (7.2.17)

i a minimiza:
( ) ( )

+ =
= u |
T
1 p t
2
t
Z , S (7.2.18)
considernd
1 q p 1 p p
Z ,... Z , Z
+
egale cu 0. Metoda este aplicabil i pentru serii
multidimensionale.
Metoda cea mai utilizat este metoda verosimilitii maxime dei metoda celor
mai mici ptrate a lui Hannan i Rissanen poate fi mbuntit nct s aib aceeai
eficien asimptotic. Funcia de verosimilitate are o expresie complicat i poate fi
calculat cu ajutorul algoritmului inovaiilor. Detalii se pot gsi n crtile menionate
ale lui Brockwell i Davis de exemplu
22
, demonstraiile gsindu-se n cartea pentru
matematicieni
23
. Tot prin metoda verosimilitii maxime se poate stabili care sunt
valorile optime pentru parametrii p i q n modelul ARMA. Pentru aceasta se
estimeaz parametrii
p 2 1
,.. , | | | ,
q 1
,..u u i
2
o prin metoda verosimilitii maxime i
apoi se calculeaz criteriul AICC:

( ) ( ) ( ) ( ) 2 q p n / 1 q p 2 , ,.. , ,.. , L log 2 AICC
2
q 1 p 2 1
+ + + o u u | | | = (7.2.19)

In acest criteriu ( )
2
q 1 p 2 1
, ,.. , ,.. , L o u u | | | este funcia de verosimilitate a crei expresie
( )
( )
( )
( )

to
= o u |
=

T
1 j 1 j
2
j j
2
r
X

X
2
1
1 T 1 0
2 / n
2
2
e r ... r r
2
1
, , L (7.2.20)
depinde
T 2 1
X ,... X , X

i
1 T 1 0
r , r , r

calculai prin algoritmul inovaiilor (vezi citrile de
la subsol). Criteriul const n a alege parametrii p i q care minimizeaz AICC.
Penalizarea ( ) ( ) 2 q p n / 1 q p 2 + + determin ca valorile optime pentru p i q s nu
fie foarte mari.
In sistemul R exist funcii care determin parametrii pentru modelele AR sau
ARIMA (deci i ARMA). Pentru modelul AR avem funcia:

22
P. J. Brockwell, R. A. Davis. Introduction to Time Series and Forecasting. Springer-Verlag New
York Berlin Heidelberg, 2002, pag. 156-162
23
P.J. Brockwell, R.A. Davis, (1991), Time Series: Theory and Methods, 2nd Edition, Springer-Verlag,
New York, cap. 8
167

ar(x, aic = TRUE, order.max = NULL,
method=c("yule-walker", "burg", "ols", "mle", "yw"),
na.action, series, ...)

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,
x.intercept, aic, n.used, partialacf, order.max, resid, method,series,
call, asy.var.coef. Cu comanda help(ar) se pot obine informaii asupra
smnificaiei acestor elemente. Avem de exemplu order=ordinul p al modelului AR
determinat, resid=diferenele
p t p 1 t 1 t
X ... X X

| | , ar=coeficienii
p 1
,...| |
estimai.
Iat un model de aplicare a funciei ar. Se simuleaz un model AR i apoi se
estimeaz parametrii si far a cunoate lungimea p a lor. Scriptul este mai jos:

s2<-arima.sim(model=list(ar=c(0.4,-0.2)), n=1000)
m1<-ar(s2,order.max=5,AIC=T,method='yw')
m2<-ar(s2,order.max=5,AIC=T,method='ols')
m3<-ar(s2,order.max=5,AIC=T,method='mle')

Rezultatele se vd mai jos n consola R:

> m1

Call:
ar(x = s2, order.max = 5, method = "yw", AIC = T)

Coefficients:
1 2
0.390 -0.209

Order selected 2 sigma^2 estimated as 1.029
> m2

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 sigma^2 estimated as 1.027
> m3

Call:
ar(x = s2, order.max = 5, method = "mle", AIC = T)

Coefficients:
1 2
168
0.3901 -0.2089

Order selected 2 sigma^2 estimated as 1.026

Vedem c a fost determinat corect ordinul p=2 i s-au determinat aproximativ
corect coeficienii.

Pentru estimarea modelelor ARMA(p,q) sau ARIMA(p,d,q) avem funcia
arima n pachetul stats, care are forma:

arima(x, order = c(0, 0, 0),
seasonal = list(order = c(0, 0, 0), period = NA),
xreg = NULL, include.mean = TRUE,
transform.pars = TRUE,
fixed = NULL, init = NULL,
method = c("CSS-ML", "ML", "CSS"),
n.cond, optim.method = "BFGS",
optim.control = list(), kappa = 1e6)

Parametrii sunt x: o serie temporal univariat sau un vector numeric, order:
specificare a tipului de modelare, seasonal: specificare a prii sezoniere, xreg:
variabile externe fa de care se face o regresie liniar i se modeleaz apoi ARIMA
rezidualii, method: metoda de determinare a parametrilor (implicit CSS=metoda
celor mai mici ptrate), optim: este metoda utilizat pentru minimizare
(implicit=BFGS, adic Broyden, Fletcher, Goldfarb and Shanno). Mai multe
detalii cu help(arima). Rezultatul funciei ARIMA este o list arima ce conine:

coef: o list cu coeficienii
sigma2: variana
2
o a variabilelor
t
Z din modelul ARMA(p,q)
residuals: valorile
t
Z aa cum rezult din estimare
arma: specificarea modelului
aic: coeficientul Akaike, valabil doar pentru metoda ML (ver. maxim)
code: codul de convergen ntors de funcia optim; dac code=0 atunci
optimizarea a decurs normal, iar pentru alte coduri se poate utiliza comanda
help(optim)
series: numele seriei x

Ceilali parametri de ieire pot fi consultai cu help(arima).

Urmtorul script genereaz o seria ARMA(2,2) i apoi se ncearc cu funcia
arima s se determine modelul.

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")

Rezultatul este:

> model1

Call:
169
arima(x = s1, order = c(2, 0, 2), method = "ML")

Coefficients:
ar1 ar2 ma1 ma2 intercept
0.4012 -0.2091 -0.3021 0.4996 -0.0040
s.e. 0.0310 0.0295 0.0279 0.0243 0.0147

sigma^2 estimated as 0.9877: log likelihood = -14127.79,
aic = 28265.57

Se vede c practic au fost determinai corect coeficienii ar i ma. Coeficientul
intercept din lista de coeficienii este media variabilelor
t
X ale seriei de timp
(probabil ar trebui s se schimbe denumirea n mean).
O extensie a funciei arima din pachetul stats se gsete n pachetul TSA cu
numele tot arima. Cititorul interesat poate gsi informaiile cu ajutorul comenzii help
din R.
Pn la versiunea 2.14.0 nu exist variante de modelare pentru serii de timp
ARIMA(p,d,q) multidimensionale. De asemenea trebuie menionat c modelul
ARMA trebuie s fie cauzal (modelele necauzale sunt echivalente cu modele cauzale
dar cu alt zgomot alb). De asemenea se poate considera modelul invertibil pentru c
pentru orice model neinvertibil exist unul invertibil cu aceeai funcie de
sutocorelaie (care determin n final coeficienii modelului). Detalii se gsesc n
criele menionate ale lui Brockwell i Davis.

c. Validarea modelului (diagnosticul veridicitii modelului ales)

Pentru validarea modelului trebuie verificat c rezidualii produi de modelele
statistice sunt variabile aleatoare independente de medie zero i aceeai varian
2
o .
De regul se fac teste pentru a verifica dac valorile reziduale
t
Z provin din v.a.
indepnedente identic distribuite. Pentru aceasta exist un numr de teste.

1. Funcia de autocorelaie
n

ar trebui s se anuleze pantru 1 n > . In R acest


lucru este cercetat prin funcia acf.

2. Testul rangului. Dac
n 2 1
y ,... y , y sunt realizri ale unei serii i.i.d. atunci fie
P numrul de perechi (i,j) astfel ca i>j i
j i
y y > . Pentru n mare P are o
repartiie aproximativ ( )
2
, m N o cu
( )
4
1 n n
m

= , ( )( ) 72 / 5 n 2 1 n n
2
+ = o

3. Testul LjungBox const n a calcula: ( ) ( )
( )

+ =
h
1 t
t n
t
2 n n h Q . Pentru n
mare i
i
y v.a. iid, Q(h) are o repartiie aproximativ
2
_ cu h grade de
libertate.

4. Testul semnului diferenelor. In acest test S este numrul de valori i pentru
care
1 i i
y y

> . Pentru n mare i valorile
i
y provenind de la v.a. iid, S are o
repartiie aproximativ ( )
2
, m N o cu
2
1 n
m

= ,
12
1 n
2
+
= o .
170

5. Testul punctelor de ntoarcere. La momentul i avem un punct de ntoarcere
dac
1 i i 1 i
y y y
+
> < sau
1 i i 1 i
y y y
+
< > . Fie T numrul punctelor de
ntoarcere. Dac n este mare i valorile
i
y provin de la v.a. iid atunci T are o
repartiie aproximativ
( )
|
.
|

\
|
90
29 n 16
,
3
2 n 2
N

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)

Obinem urmtoarele reprezentri grafice din tsdiag:
S
t
a
n
d
a
r
d
iz
e
d

R
e
s
id
u
a
ls
0 2000 4000 6000 8000 10000
-
4
-
2
0
2
4
0 10 20 30 40
-
0
.
0
2
0
.
0
0
0
.
0
2
A
C
F

o
f

R
e
s
id
u
a
ls
0 10 20 30 40
0
.
0
0
.
4
0
.
8
P
-
v
a
lu
e
s

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
171
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 ma1 ma2 intercept
0.3831 -0.1976 -0.2773 0.5047 0.0016
s.e. 0.0289 0.0288 0.0258 0.0239 0.0152

sigma^2 estimated as 1.018: log likelihood = -14276.47, aic =
28562.93

Vedem c au fost estimai destul de bine coeficienii cu care s-a simulat seria
ARMA.

d. Predicii

Dup validarea modelului de serie de timp acesta poate fi utilizat pentru
predicia valorilor viitoare. In general prntru prezicerea valorilor unei serii temporale
unde cunoatem ( )
T ,... 1 , 0 t t
X
=
pentru valori t>T definim predicia
h T
X
+

ca proiecia lui
h T
X
+
pe spaiul generat de ( )
T ,... 1 , 0 t t
X
=
. Aceast proiecie poate fi calculat innd
seama de produsele scalare coninute n funcia de autocorelaie. Pentru seriile
staionare calculul conduce la rezolvarea unui sistem asemntor cu (7.2.15) unde |
sunt necunoscute (sistemul Yule-Walker). Acest sistem poate fi rezolvat recursiv prin
algoritmul Durbin-Levinson. O alt metod de determinare a proieciei valabil i
pentru serii nestaionare este algoritmul inovaiilor. Detalii se pot gsi n crile citate
ale lui Brockwell i Davis. In sistemul R exist funcia predict care pe baza modelului
(n general ARIMA) face predicia valorilor pentru un numr de pai temporali dai.
Forma funciei este:

predict(object, n.ahead = 1, newxreg = NULL,
se.fit = TRUE, ...)

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)

Obinem urmtorul rezulatat la consol
172

$pred
Time Series:
Start = 1001
End = 1050
Frequency = 1
[1] 0.30741965 -0.01205071 -0.15271697 -0.10329277 -0.04444154 -0.03973509
[7] -0.05590263 -0.06270560 -0.06009920 -0.05718103 -0.05699457 -0.05781187
[13] -0.05814027 -0.05800335 -0.05785878 -0.05785189 -0.05789317 -0.05790899
[19] -0.05790182 -0.05789466 -0.05789444 -0.05789652 -0.05789728 -0.05789691
[25] -0.05789656 -0.05789655 -0.05789666 -0.05789669 -0.05789667 -0.05789666
[31] -0.05789666 -0.05789666 -0.05789666 -0.05789666 -0.05789666 -0.05789666
[37] -0.05789666 -0.05789666 -0.05789666 -0.05789666 -0.05789666 -0.05789666
[43] -0.05789666 -0.05789666 -0.05789666 -0.05789666 -0.05789666 -0.05789666
[49] -0.05789666 -0.05789666

$se
Time Series:
Start = 1001
End = 1050
Frequency = 1
[1] 0.9632667 0.9663791 1.0064598 1.0089120 1.0107742 1.0116303 1.0116409
[8] 1.0117388 1.0117442 1.0117491 1.0117511 1.0117512 1.0117514 1.0117514
[15] 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514
[22] 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514
[29] 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514
[36] 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514
[43] 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514 1.0117514
[50] 1.0117514

Obinem urmtorul grafic cu valorile seriei i valorile prezise:
Seria s1 de 1000 masuratori si predictia pentru 50 pasi
Timpul
s
1
0 200 400 600 800 1000
-
3
-
2
-
1
0
1
2
3

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")

173
Graficul seriei este n figura urmtoare:
CO intre 1 ian.2008 si 30. iun. 2008
Timpul in saptamani
V
1
0 20 40 60 80
0
5
1
0
1
5

Fig. 7.10

Facem graficul pentru ACF i PACF pentru a vedea ce model ar fi potrivit.

> acf(tsco)
0.00 0.05 0.10 0.15 0.20 0.25
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
Lag
A
C
F
V1

Fig. 7.11
Constatm c ACF nu se anuleaz deci nu poate fi un model MA

Calculm PACF:

> acf(tsco, type="partial")

Obinem:
0.00 0.05 0.10 0.15 0.20 0.25
-
0
.
2
0
.
0
0
.
2
0
.
4
0
.
6
0
.
8
Lag
P
a
r
t
i
a
l

A
C
F
Series tsco

Fig. 7.12
Figura sugereaz un model AR
174
Incercm i cu EACF:

> eacf(tsco, ar.max = 20, ma.max = 20)

Obinem:

AR/MA
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 x x x x x x x x x x x x x x x x x x x x x
1 x x x o x x x x x x x x x x o x x x x x o
2 x o x o x x x x x x o x o x o o o o x x o
3 x o o x x x o o x x o x o o o o o o o o o
4 x x x x x x o x x o o o o o o o o o o o o
5 x x x x o o o o x x o o x o o o o o o o o
6 x x x x x o o o x x o o o o o o o o o o o
7 x x x x x o o x x o x o x o o o o o o o o
8 x x x x x o o x x o o o o o o o o o o o o
9 x x x x x x x x x o o o x o o o o o o o o
10 x x x x x x x x x o o o x o o o o o o o o
11 x x x x x x x x x o o o x x o o o o o o o
12 x x x x o x x x x x o o o o o o o o o o o
13 x x x x o x x x x x o x o o o o o o o o o
14 x x x x x x x x x x x x o o o o o o o o o
15 x x o x x o x x x x x x x x o o o o o o o
16 x x x x x x x x x x o o x x x o o o o o o
17 x x o x x o x x o x x o o x x x o o o o o
18 x x o x o o x x x x o o o x x o o o o o x
19 x o x x o x o o o x x o o x x x x x o o o
20 x x x x x x o o o o x x o x x x x x x o o
>
Tabloul obinut ar sugera un model ARMA(p,q) cu p n jur de 7-11 i q 9 sau 10.
Dac nu suntem prea pretenioi ar merge parc p i q n jur de 5. Incercnd am
obinut mesajul c sunt probleme de convergen. Incercm cu valori mai mici.

> m1<-arima(tsco,order=c(3,0,2),method="ML")
> tsdiag(m1)

Obinem:
S
ta
n
d
a
r
d
iz
e
d

R
e
s
id
u
a
ls
0 20 40 60 80
-
2
0
0
0 10 20 30 40
-
0
.0
5
0
.1
0
A
C
F

o
f
R
e
s
id
u
a
ls
0 10 20 30 40
0
.
0
0
.6
P
-
v
a
lu
e
s

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:

175

p1=predict(m1,n.ahead=168)
plot(p1$pred, col=5,lwd=3, main="Predictii CO")

Predictii CO
Time
p
1
$
p
r
e
d
79.2 79.4 79.6 79.8 80.0
0
.
2
0
.
4
0
.
6
0
.
8

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).
176

7.2.2 Serii temporale deterministe i haos

Metoda sistemelor haotice, aa cum este descris n lucrarea,
24
permite ntr-o
anumit msur descrierea i predicia evoluiei unor serii de timp. O implementare
practic a acestor metode se gsete n pachetul gratuit de programe TISEAN
disponibil publicului pe http://www.mpipks-dresden.mpg.de/ ~ tisean (Institutul Max
Planck pentru Fizic, Dresda). Autorii pachetului l descriu ntr-o lucrare
25
disponibil
liber pe internet.
Ideea de baz a metodei este c datele urmeaz o evoluie determinist
( ) x X x = ' (7.2.21)
cu x ntr-un anumit spaiu normat finit sau infinit dimensional E, dupa o anumit
perioada de timp traiectoria sistemului dinamic (7.2.21) evolueaz n jurul unui
atractor A. Dinamica n A poate fi surprins efectiv de aproape orice funcie
R E s : .
Fie ( ) x t, u fluxul lui (7.2.21) pentru o valoare fixat a lui t=t
. Fie
( ) ( ) x x F , t u = , ( ) ( ) x x F
1
, t u =

, i fie R U s : definit ntr-o vecinatate a lui A.


Atunci, conform unei teoreme a lui F. Takens
26
n condiii generale pentru s i A i
pentru un N me suficient de mare, aplicaia
( ) ( ) ( )
( )
( ) ( ) ( ) ( ) ( ) x x F s x F s x F s x S
R A S
1 2 m 1 m
m
, ,.... ,
:
) (
=

(7.2.22)
este o scufundare a lui A n
m
R .
Pe imaginea atractorului
m
R A S c ) ( avem
( ) ( )
( ) ( )
( )
n 1 n 2 m n 1 m n n 0
s s s s s x n S , ... , ,

= = t u (7.2.23)
Dinamica lui F de pe atractorul A este exprimat pe imaginea sa S(A) prin
( )
1 n n n
s s G s
+
=

ca n figura urmtoare:


Fig. 7.15

O uoar modificare a lui (7.2.233) introducnd o anumit ntrziere
este
*
N d e conduce la
( ) ( )
( )
n d n d 2 m n d 1 m n n
s s s s s , ... ,

= (7.2.24)

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.

177
Intrzierea optima sugerat de Fraser i Swinney pentru (7.2.24) este recomandat ca
fiind primul minim local al informaiei mutuale empirice:
( )
( )

|
|
.
|

\
|
=
j i j i
j i
j i
p p
d p
d p H
,
,
,
ln (7.2.25)
Probabilitatile
i
p i ( ) d p
j i,
n (7.2.25) sunt obinute prin partiionarea datelor
( )
T n 1 n
s
s s
ntr-un numar de subintervale al valorilor datelor msurate:
i
p este
probabilitatea ca funcia s s ia valori n subintervalul i iar ) (
,
d p
j i
este
probabilitatea de tranziie de la subintervalul i la subintervalul j dup d uniti.
Pentru a determina m, dimensiunea de scufundare, folosim metoda celui mai
apropiat vecin fals (vezi referinele n subsolul paginii precedente). Ideea este c
dac
j
s este cel mai apropiat vecin al lui
i
s n
m
R atunci ( )
i 1 i
s G s =
+
i ( )
j 1 j
s G s =
+

sunt de asemenea apropiai i raportul || || / || ||
j i 1 j 1 i i
s s s s R =
+ +
este mai mic
dect un prag euristic Rt. In caz contrar punctul
j
s este marcat ca vecin fals. Dac
procentul de puncte cu un cel mai apropiat vecin fals este prea mare, consideram ca m
este prea mic.

Metode de predicie

Predicia de ordin zero este data de

e
+ +
=
n j
U s
k j
n
k n
s
U card
1
s
) (
(7.2.26)

unde
n
U este o mic vecintate a lui
n
s n
m
R . Predicia este fcut pentru T k n > + ,
ultima msuratoare.
Predicia local liniar este dat de formula

n n n 1 n
b s a s + =
+
(7.2.27)

unde coeficienii
m
n
R a e , R b
n
e sunt determinai astfel nct
( )

e
+
=
n j
U s
2
n j n 1 j
2
b s a s o (7.2.28)
s fie minim. Suma este efectuat dup toi
j
s dintr- o mic vecintate
n
U a lui
n
s
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
178
particular pentru concentraia de CO al crei grafic este n Fig. 7.1. Reproducem
27

cteva rezultate obinute n predicia polurii utiliznd tehnici din aceast seciune.
Calculele au fost fcute cu rutinele TISEAN apelate direct (nu din R, dar o examinare
a fiierului de help din RTisean arat c apelul din R se face cu aceeai parametri ca i
apelul direct din consola windows). Rezultatele au fost salvate n fiiere text de unde
au fost trecute n Excel pentru examinare i pentru reprezentare grafic. Utiliznd
RTisean nu mai este nevoie de acest ir de operaii care ncetinete mult analiza de
variante. Mai jos reproducem cteva grafice unde sunt reprezentate valorile msurate
i cele prezise pe baza msurtorilor anterioare. Prediciile sunt pentru o sptmn
(168 ore).


a)

b)

c)

d)

CO
m=48, d=1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0 24 48 72 96 120 144 168
Time
C
O
COmeasured COpredicted
CO
m=48, d=8
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0 24 48 72 96 120 144 168
Time
C
O
COmeasured COpredicted
CO
m=100, d=1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0 24 48 72 96 120 144 168
Time
C
O
COmeasured COpredicted
CO
m=100, d=8
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0 24 48 72 96 120 144 168
Time
C
O
COmeasured COpredicted

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).

Nu au fost la fel de bune prediciile pentru ali poluani. Pentru particulele PM
2.5 se vede din graficele de mai jos.

PM 2.5
m=48, d=1
0
5
10
15
20
25
30
35
0 24 48 72 96 120 144 168
Ti me
C
O
PM 2.5 meas ured P M 2. 5 predicted

a)
PM 2.5
m=100, d=1
0
5
10
15
20
25
30
35
40
0 24 48 72 96 120 144 168
Ti me
C
O
P M 2. 5 meas ured P M 2. 5 predicted

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
179

In momentul cnd s-au fcut predicii simultane (funcia s din (7.2.22) are
valori n
p
R , deci S are valori n
mp
R , 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.


a)

b)

CO
m=48, d=1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0 24 48 72 96 120 144 168
Time
C
O
CO measured COpredicted
PM 2.5
m=48, d=1
0
5
10
15
20
25
30
35
0 24 48 72 96 120 144 168
Time
PM
PM2.5 measured PM 2.5 predicted

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

Din experimentele numerice am ajuns la urmtoarele concluzii:
1. ntrzierea d = 1 este o alegere bun, uneori mai bun ca ntrzierea la care
informaia mutual empiric ajunge la un minim local.
2. O alegere bun pentru vecintatea
n
U , care determin cte puncte intr n
calcul n formula (7.2.26) se afl experimental. Pentru predicia local liniar o alegere
bun a numrului de puncte n formula (7.2.28) este de cel puin patru ori numrul de
parametri de estimat.
3. Alegerea dimensiunii de scufundare astfel nct fraciunea de puncte avnd
cel mai apropiat vecin fals este mai mica de 5% , d rezultate bune. De asemenea, este
indicat s alegem m, astfel ca vectorul
n
s s cuprind datele unei perioade n cazul
n care se suspecteaz c datele au o anumit periodicitate.
4. Este posibil ca datele s nu respecte o lege determinist. n acest caz, orice
alegere a lui m i d nu este o alegere bun.
5. Previziunile pe termen scurt sunt n general mai bune ca cele pe termen
lung.
6. Prin experimentare numeric ajungem la un moment dat s gsim o
dimensiune m de scufundare i o ntrziere d care utilizate pentru anumite date dintr-
un anumit loc duc la previziuni acceptabile. Este de ateptat ca acestea s reflecte
particulariti ale sistemului dinamic (7.2.21) din acel loc i s fie valabile i pentru alt
set de msurtori. Acest fenomen, determinarea parametrilor de scufundare m i d, ar
fi analogul determinrii parametrilor ntr-un model statistic (de exemplu ARMA(p,q)).


180


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 Example-
Based 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.



.