Sunteți pe pagina 1din 181

INIIERE n R

Pentru persoane cu pregtire matematic

Maria Miroiu
Viorel Petrehu
Gheorghi Zbganu

Introducere
Mediul de programare R face parte dintr-un proiect mai mare de a
produce software gratuit. Se poate spune c el este un dialect al altui limbaj, numit
S, creat n 1976 la laboratoarele Bell pentru a se uura calculele statistice. La
nceput s-a folosit o sintax similar Fortran-ului, dar n 1988 a fost rescris n C. Spre
deosebire de R, S nu este un software gratuit. Prima variant de R a fost creat
n Noua Zeeland, 1991, de Ross Ihaka i Robert Gentleman 1. n 1993 s-a fcut
lansarea oficial a proiectului, conceput la nceput ca un software statistic non
gratuit, aa cum mai erau i altele - SAS, SPSS, STATISTICA. n 1995 autorii s-au
hotrt s l fac un software gratuit. Pentru a controla nucleul de baz al limbajului,
s-a creat n 1997 aa numitul R Core Group, care controleaz codul surs. n 2000
s-a lansat versiunea R.1.0.0 iar n 2008 s-a ajuns la versiunea R.2.7.2. Noi am folosit
versiunea R.2.12.2, aprut pe 25 februarie 2011. Exist zeci de site-uri de unde se
poate descrca sistemul R i pachete adiionale..
Printele limbajului , Ross Ihaka scria n 1998 2:
n august 1993 Robert Gentleman i cu mine am plasat copii ale R-ului la
Statlib i am fcut un mic grup pe s-news. Unii ne-au descrcat copiile i s-au oferit
s colaboreze. Cel mai de ndejde a fost Martin Maehler de la ETH Zurich care ne-a
convins s lansm codul surs ca un software gratuit. La nceput am avut ezitri, dar
n iunie 1995 am convenit s punem la dispoziia tuturor codul surs n condiiile
fundaiei FRF 3 .
S-a creat astfel o impresionant comunitate a utilizatorilor i dezvoltatorilor
limbajului. Toi voluntari.
Decizia de a face R un software gratuit, continu Ihaka ne-a fcut s ne
propunem eluri mai mari dect un simplu soft statistic cu care s ne putem preda
cursurile mai bine. Ne-a dat acces la o mas de indivizi foarte talentai doritori s se
implice n proiect. Poate unul din cele mai bune lucruri care ni s-a ntmplat a fost
ansa de lucra cu asemenea oameni strlucitori . i i exprima optimismul : Se
pare c R a ajuns la punctul n care este destul de stabil pentru a fi folosit de
utilizatori cel puin sub Unix. Sperm ca n 1999 s putem lansa varianta complet
R.1.0 n cadrul fundaiei Free Software
De ce software gratuit? Ce avantaje avem?
n primul rnd, firete, nu dm bani pe el. Dar mai sunt i alte avantaje, cum
arat un entuziast al R-ului, Roger. D. Peng 4 Un software gratuit v garanteaz
libertatea de a folosi programele lui n orice scop (libertatea 0); libertatea de a studia
cum funcioneaz programele i de a le adapta la nevoile voastre. Accesul la codul
1

http://www.biostat.jhsph.edu/~rpeng/biostat776/lecture1.pdf
http://cran.r-project.org/doc/html/interface98-paper/paper.html
3
http://www.fsf.org/
2

http://www.biostat.jhsph.edu/~rpeng/

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.html6.
Cunosctorii apreciaz R-ul pentru facilitile sale grafice7.
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.

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-nvareevaluare 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 ClujNapoca, 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.

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.

CUPRINS
Introducere

Cap.1 Preliminarii

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
179

Bibliografie

/R

Capitolul 1
Preliminarii
R este un mediu integrat de faciliti software destinat n special analizei
statistice i reprezentrii grafice a datelor. Acesta include un limbaj simplu de
programare, limbajul S, care permite utilizarea pachetelor existente i construirea de
pachete noi de programe destinate analizei statistice i reprezentrii grafice a datelor.
R este un mediu de dezvolare gratuit distribuit sub licen public general
GNU. A fost iniial scris de Ross Ihaka i Robert Gentleman de la departmentul de
statistic de la Universittea din Auckland, New Zealand. Din 1997 s-a format un grup
principal (R Core Team) care poate modifica variante ale R-ului. R-ul s-a dezvoltat
rapid i s-a extins la o mare colecie de pachete de programe.
Site-ul oficial de unde se pot obine gratuit versiuni compilate de R pentru OS
X, Linux i Windows este http://www.r-project.org. Tot aici se pot gsi i resurse
pentru instalarea i utilizarea R-ului. Cea mai recent versiune este 2.13.2 disponibil
din 30.09.2011. Odat cu R se descarc i o serie de pachete de programe (numite i
pachete standard), dar sunt disponibile i alte pachete de programe R prin intermediul
CRAN (Comprehensive R Archive Network http://CRAN.R-project.org) care
conine diferite variante ale sistemului R i ale pachetelor de programe R.
Kitul de instalare R vine cu manuale n care este descris n detaliu modul de
funcionare al programului. De asemenea se gsesc cri specializate pe diverse
domenii unde se utilizeaz statistica i unde se arat cum se poate utiliza R pentru
calculele necesare.
La lansarea n execuie a R-ului apare o
fereastr ca cea alturat i se poate
lucra direct cu R n fereastra consol
interioar.
n meniul Packages
se gsesc
opiuni de instalare separat a unor
pachete suplimentare de programe
specializate pe diverse domenii prin
care posibilitile lui R se pot extinde
foarte mult.
Lucrul cu R se poate face
- fie n regim interactiv: n fereastra Rconsole, dup prompter-ul >, se scrie o
comand acceptat de R, apoi se apas tasta Enter i rezultatul apare imediat mai
jos n aceeai ferestr,
- fie prin script-uri, n regim de programare: comenzile de calcul sunt grupate
ntr-un fiier cu extensia .r care poate fi apelat n mai multe moduri. Un fiier
script poate fi scris n orice editor de text, dar R are un editor ce se apeleaz din
meniul File prin Open script... sau New script. Fiierul script poate fi
executat dup ce se ncarc n mediul R prin File Open script... sau se poate
folosi direct funcia source(), de exemplu, presupunnd c fiierul script se
numete test.r i se afl n directorul de lucru curent, comanda scris la prompt:
>source("test.r") va avea ca efect ncrcarea n spaiul de lucru a fiierului
i executarea comenzilor coninute n fiierul test.r.
6

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
poisson using fuzzy matching:
boot::poisons
stats::family
stats::Poisson
stats::poisson.test

or

title

Animal Survival Times


Family Objects for Models
The Poisson Distribution
Exact Poisson tests

matching

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
boot
class
cluster
codetools
compiler
datasets
foreign

The R Base Package


Bootstrap R (S-Plus) Functions (Canty)
Functions for Classification
Cluster Analysis Extended Rousseeuw et al.
Code Analysis Tools for R
The R Compiler Package
The R Datasets Package
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

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

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

10

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
> typeof(x)
[1] "numeric"

> s="unu"
> typeof(x)
[1] "character"

> x=1+2i
> typeof(x)
[1] "complex"

> e=1<3
> typeof(e)
[1] "logical"

> s="sir"
> b=charToRaw(s);b
[1] 73 69 72
> typeof(b)
[1] "raw"

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

11

> x
[1] 1.3
> y=1/3; y
[1] 0.33333

2.1. Numere
R lucrez cu numere ntregi, reale sau complexe. Numerele reale se scriu cu
punct zecimal sau cu exponent: 0.001 = 1.e-3.
Pentru a calcula o expresie numeric, se poate edita n RConsole de la
prompter expresia corespunztoare, apoi se tasteaz <Enter>. De exemplu,
>> 2*6
[1] 12

#rezultat

Cea de-a doua linie reprezint rspunsul sistemului R, iar [1] indic numrul de ordine
al primei valori afiate pe acest rnd. Alt exemplu:
>> sqrt(2)
[1] 1.414214

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
Adunarea x+y
Scderea xy
nmulirea xy
mprirea x / y
Exponeniala xy
Ctul ntreg al mpririi lui x la y: [x/y]
Restul mpririi lui x la y = x - y * [x / y]

Simbolul R

Expresia R

*
/
^
%/%
%%

x+y
x-y
x*y
x/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
2
3
4

Paranteza
Exponeniala
nmulirea, mprirea, ctul, restul
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

12

n R exist constante speciale precum: Inf (ce ine locul lui infinit ), NaN (not-anumber, ce indic un rezultat numeric nedefinit ca 0/0, () /( ) , sau
0 () ), NULL (indic un obiect gol) i NA (not available). De exemplu:
> 1/0
[1] Inf
> 5^987
[1] Inf
> 0/0
[1] NaN
> Inf/Inf
[1] NaN
>u=c(1,2,NA,4);u #valoare lipsa reprezentata prin NA
[1] 1 2 NA 4
> A = matrix(data=NA,nrow=2,ncol=3); A
[,1] [,2] [,3]
[1,] NA
NA
NA
[2,] NA
NA
NA

2.2. Vectori
Vectorii sunt structuri de date cu una sau mai multe valori de acelai tip:
ntreg, real, complex, logic, caracter sau raw (iruri de bii). Vectorii cu o singur
component se numesc scalari.
n R, nu sunt permii indici negativi, iar indicele 0 este ignorat. Aadar, indicii
acceptai sunt 1, 2, ...
Vectorii pot fi creai interactiv sau se pot importa din fiiere. Crearea
interactiv a vectorilor se poate face utiliznd funcia de concatenare c. De
exemplu:
> u = c(1,2,3)
> p = c(1.25, 0.75)
> v = c(1+1i,1-2i)

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, x1, un vector x2 cu elementele de tip ir
de caractere i s-au combinat cei doi vectori n unul singur, x3. Vectorul x3 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

13

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)
[1] 3 4 5

#sau v1=seq(from=3,to=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
[1] 1 2 3 1 2 3

#x se repeta de 2 ori

> 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

14

ori, a doua de 4 ori etc

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

15

> nume="Popescu"
> prenume="Ion"
> numeintreg=paste(nume,prenume)
> numeintreg
[1] "Popescu Ion"
> n=c(nume,prenume)
> n
[1] "Popescu" "Ion"
> n[1]
[1] "Popescu"
> n[2]
[1] "Ion"

Funcia 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.
16

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

17

Se observ c din elementele vectorului y3 se formeaz coloanele matricii m3.


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

#x este vector
6 7 8 9 10 11 12

> dim(x)=c(4,3); x
[,1] [,2] [,3]
[1,]
1
5
9
[2,]
2
6
10
[3,]
3
7
11
[4,]
4
8
12

#x este matrice

Accesul la elementele din vector, matrice sau array se face punnd indicii de
poziie ai elementului ntre paranteze drepte, i eventual separndu-i prin virgul:
> m=matrix(1:6, nrow=2, ncol=3)
> m
# sau m[,]
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
> m[1,3]
[1] 5
> m[2,] #sau m[2,1:3] (linia a doua)
[1] 2 4 6
> m[2,1:2] #linia a doua, primele doua elemente
[1] 2 4

18

> 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


4 6
2 4

A= 1 10 i B= 8 5 :
1 2
6 0

> A=matrix(c(2,4,1,10,6,0),ncol=2,byrow=TRUE)
> A
[,1] [,2]
[1,]
2
4
[2,]
1
10
[3,]
6
0
> B=matrix(c(4,6,8,5,1,2),ncol=2,byrow=TRUE)
> B
[,1] [,2]
[1,]
4
6
[2,]
8
5
[3,]
1
2

Apoi
> A+B
[1,]
[2,]
[3,]
> A-B

[,1] [,2]
6
10
9
15
7
2

[,1] [,2]
[1,]
-2
-2
[2,]
-7
5
[3,]
5
-2
> A*B
> # (aij*bij)i,j = inmultirea element cu element
[,1] [,2]
[1,]
8
24
[2,]
8
50
[3,]
6
0
> A/B
# (aij/bij)i,j
> # (aij/bij)i,j = impartirea element cu element
[,1]
[,2]
[1,] 0.500 0.6666667
[2,] 0.125 2.0000000
[3,] 6.000 0.0000000
> A^B
# (aij^bij)i,j
> #(aij^bij)i,j=ridicarea la putere element cu elem.
[,1]
[,2]
[1,]
16
4096
[2,]
1 100000
[3,]
6
0

19

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 aij / bij,
respectiv aij ^ bij.
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
[1] 1 2
> A=matrix(1:4,c(2,2)); A
[,1] [,2]
[1,]
1
3
[2,]
2
4
> x%*%A
[,1] [,2]
[1,]
5
11
> A%*%x
[,1]
[1,]
7
[2,]
10

#vector
#matrice

1 3
(5 11)
(1 2)
2 4

1 3 1 7


2 4 2 10

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
6
0
[3,]
> 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

20

> solve(M)
# M^(-1)
[,1] [,2]
[1,] -2.0 1.0
[2,] 1.5 -0.5
> A=matrix(c(1,2,1,2),c(2,2)); A
#det(A)=0
[,1] [,2]
[1,]
1
1
[2,]
2
2
> solve(A)
Error in solve.default(A) :
Lapack routine dgesv: system is exactly singular

2.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,]

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


1
3
5
2
4
6

, , 2
[1,]
[2,]

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


7
9
11
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] [,2]
5
7
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:

21

>
>
>
>
>
,

x=1:4
y=5:8
t1=array(x,c(2,2,2))
t2=array(y,c(2,2,2))
t1
, 1
[,1] [,2]
[1,]
1
3
[2,]
2
4
, , 2
[1,]
[2,]

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

> t2
, , 1
[1,]
[2,]

[,1] [,2]
5
7
6
8

, , 2
[1,]
[2,]

[,1] [,2]
5
7
6
8

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

[,1] [,2]
5
21
12
32

> t1%*%t2

#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

22

celui de-al doilea argument. Astfel, funcia aperm poate fi o transpus generalizat ca
n exemplul urmtor:
A=array(1:12, dim=c(2,3,2))
> A
, , 1
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
, , 2
[1,]
[2,]

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


7
9
11
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,]
[3,]

[,1] [,2]
7
8
9
10
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"

23

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
Popescu Nicolae
Stan Ion
Vasile Anca

Analiz
8
7
9

Algebr
6
7
8

O variabil data frame se creeaz prin alipirea unor vectori de aceeai dimensiune,
ca n exemplele de mai jos:
>
>
>
>

c1=c("a","b","c")
c2=c(1,2,3)
df1=data.frame(c1,c2)
df1

24

#creare data frame

1
2
3

c1 c2
a 1
b 2
c 3

sau
> clasa=c("9A","9B","9C","9D","9E","9F","9G","9H")
> media=(8.82,9.01,8.45,8/23,8.14,8.01,7.76,9.08)
> catalog=data.frame(clasa,media); catalog
clasa
media
1
9A 8.8200000
2
9B 9.0100000
3
9C 8.4500000
4
9D 0.3478261
5
9E 8.1400000
6
9F 8.0100000
7
9G 7.7600000
8
9H 9.0800000

Numele coloanelor 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
coloanelor
valorile

liniilor,
ca
i
din
data.frame
(sau
din alt obiect precum
matricea sau vectorul)
pot fi editate cu
ajutorul unui editor
propriu R care se
apeleaz
prin
comenzile fix sau
edit, ca mai jos:
> fix(df1)
> df1
unu doi
lin.1
a
1
lin.2
b
2
lin.3
c
3

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.


25

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.

26

De exemplu, s presupunem c
s-au creat nite date n Excel ca
n figura alturat, se selecteaz
i se copiaz n clipboard.
Datele se citesc n R astfel:

> t=read.table("clipboard")
> t
Analiza Algebra Fizica
Ion
8
7
7
Nicu
6
5
8
Vasile
8
9
7

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

27

> 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,]
speed dist
1
4
2
2
4
10
3
7
4
4
7
22
5
8
16

#primele 5 rnduri ale bazei de date


#coloanele bazei de date

28

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

29

clasa
media
1
9A 8.8200000
2
9B 9.0100000
3
9C 8.4500000
4
9D 9.3478261
5
9E 8.1400000
6
9F 8.0100000
7
9G 7.7600000
8
9H 9.0800000
> lista[[1]][2]
[1] "9B"

2.8. Raw-uri

irurile de bii se obin prin declararea unei variabile ca vector de tip raw i
atribuirea fiecrui element din vector a unei valori ntregi ntre 0 i 255 convertit la
tipul raw prin instruciunea as.raw. Dac nu reuete conversia atunci valoarea este
luat implicit 0. Exemplu:
> x=raw(2) #creeaza un vector raw gol de dim. 2
> x[1]=as.raw(100)
#codul ASCII 100 (caract. d)
> x[2]=charToRaw("Z") #codul ASCII al caract. Z
> x #afisare a cate o pereche de cifre hexazecimale
[1] 64 5a
> rawToChar(x) #conversie raw in sir de caractere
[1] "dZ"
> rawToBits(x) #conversie la biti
[1] 00 00 01 00 00 01 01 00 00 01 00 01 01 00 01 00

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

30

Capitolul 3
Funcii predefinite n R
Practic totul n R se obine prin funcii. S urmrim comenzile de mai jos:
> "+"(2,3)
[1] 5
> 2+3
[1] 5

Se vede c operaia de adunare este implementat ca o funcie. La fel alte operaii x-y,
x/y, x*y, x^y sunt funcii pentru care utilizm forma operatorial de notaie, mai
comod.
R vine cu un mare numr de funcii predefinite pentru prelucrarea datelor, iar
diversele pachete adiionale vin cu funcii suplimentare. n cele ce urmeaz descriem
un numr de funcii curent utilizate. n manualele ce nsoesc distribuiile de R, n
carile din bibliografie sau n diverse locaii de pe internet (de exemplu la adresa
http://www.statmethods.net/ sau pur i simplu cutnd cu Google documentaie pentru
R) se pot gsi informaii pentru multe alte funcii disponibile. Pe lng funciile
predefinite putem defini funcii noi care se pot utiliza exact ca cele predefinite.
Un lucru este important de menionat. Argumentele funciilor au n general
nume i dac se specific numele lor atunci nu este important ordinea n care se pun,
ca n exemplul urmtor n care se creaz un ir de numere cu funcia seq.
> seq(from=1, by=2, to=5)
[1] 1 3 5
> seq(by=2, to=5, from=1)
[1] 1 3 5

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

31

pune n eviden c n funcia seq primul argument este from, al doilea este to i al
treilea este by. Pentru foarte multe funcii din R apelul se face cu primele 1, 2, 3
argumente nedenumite, dar n ordinea i cu semnificaia specificat n documentaie,
pe cnd restul argumentelor sunt parametri opionali din care unii se introduc prin
numele lor iar ceilali se utilizeaz prin valorile lor implicite.
3.1. Funcii numerice

Aceste funcii aplicate unui numr dau ca rezultat un alt numr, iar aplicate
unui vector sau unei matrice se aplic fiecrui element al vectorului sau matricei
respective (sunt vectorizate).
Funcia

Explicaii

abs(x)

|x|

sqrt(x)

x
Dac x (n-1,n] valoarea returnat este n
Partea ntreag a lui x
Rotunjire la n zecimale
Rotunjire la cele mai semnificative n cifre
Funcii trigonometrice directe i inverse
precum i funcii hiperbolice directe i inverse

ceiling(x)
floor(x), trunc(x)
round(x, digits=n)
signif(x, digits=n)
cos(x), sin(x), tan(x),
acos(x), asin(x), tan(x),
cosh(x), acosh(x), etc.
log(x)
log10(x)
exp(x)
besselI(x, nu)
besselK(x, nu)
besselJ(x, nu)
besselY(x, nu)
gamma(x), lgamma(x)
beta(a,b), lbeta(a,b)
digamma(x)
psigamma(x, deriv)

Logaritmul natural, ln x
Logaritmul n baza 10, lg x
ex
Funcii Bessel. Parametru nu este ordinul
funciei. Parametru x este un vector numeric
cu valori pozitive.
Funcia gamma i logaritm natural din gamma
Funcia beta i logaritm natural din beta
Calculeaz derivata lui log(gamma(x))
Calculeaz derivata de ordin deriv a lui
digamma(x)

choose(n,k), lchoose(n,k)

factorial(x)

Combinri de n cte k (n poate fi real);


lchoose calculeaz logaritm natural din
choose.
Calculeaz gamma(x+1)

32

F<-splinefun(x, y, method)

spline(x, y , n, method,
xmin, xmax, xout)

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
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 J2 pentru x [0,20] .


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 :

BesselJ(x,2)

-0.2

0.0

0.2

0.4

O functie Bessel

10

15

20

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)

33

Graficul este:

0.0
-1.0

-0.5

y, Spline(x)

0.5

1.0

O functie spline

10

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
A * B
A %*% B
outer(a,b,f)
a %o% b

crossprod(A,B)
crossprod(A)
cbind(A,B,...)
rbind(A,B,...)
rowMeans(A)
rowSums(A)
colMeans(A)
colSums(A)
min(A), max(A),
range(A)
solve(A)
ginv(A)
x<-eigen(A)

Explicaii
nmulirea element cu element
nmulirea matriceal
Dac a i b sunt vectori genereaz o matrice x cu
xi,j = f(ai, bj). Dac a i b sunt matrice genereaz un array
x cu xi,j,k,l = f(ai,j, bk,l) .
Forma a %o% b este asemntoare fa de funcia produs.
AtB, respectiv AtA
Combin orizontal (rezultatul va avea liniile din A, B,...)
Combin vertical (rezultatul este o matrice cu coloanele din
A, B,...)
Se obine un vector cu mediile liniilor
Se obine un vector cu sumele elementelor liniilor
Se obine un vector cu mediile coloanelor
Se obine un vector cu sumele elementelor coloanelor
Minimul, maximu, respectiv un vector cu minimul si
maximul
Inversa matricei A
Inversa generalizat Moore-Penrouse (se gsete n pachetul
MASS)
x$values conine valorile proprii ale lui A
x$vectors conine vectorii proprii ai lui A

34

t(A), det(A)
x<-svd(A)

Transpusa, respectiv determinantul unei matrice


Descompunerea singular a matricei A, A=UDVt, 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=RtR, 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), Creaz dintr-un obiect x de tip qr generat de funcia qr
qr.X(x)
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.1015411
0.4941975
0.8037851
0.2050783

[,2]
0.79721628
0.70852984
0.28829965
0.04331768
0.22855288

[,3]
0.1265954
0.7379991
0.2681115
0.5082257
0.3172556

35

[,4]
0.04369927
0.03374915
0.92383512
0.62702404
0.75981321

[,5]
0.2061009
0.4783938
0.3105410
0.3799365
0.1595518

> b
[1] 0.4920966 0.5553061 0.3207777 0.2010808 0.5628473
> x
[1] 0.1839354 0.9262001 1.2986354 0.3486333 -2.2779749

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
0.69

system elapsed
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]
[,2]
[,3]
[,4]
[,5]
0.3264044 0.73432693 -0.67659694 0.3795791 0.3029054
0.4377868 0.04995971 0.68624453 -0.3881873 -0.1576330
0.5506698 -0.64362770 0.21134194 0.6398041 0.3044435
0.4216151 0.14932348 -0.14367175 -0.5354580 -0.8120513
0.4699004 -0.14735628 -0.07731778 -0.0957380 0.3623354

Se vede c trei valori proprii sunt aproape zero. n fapt ele sunt zero, matricea avnd
rangul 1 i doar erorile de rotunjire fac rezultatele de ordinul 10-16. Descompunerea
singular este:
> ds
$d
[1] 6.870905e+00 1.077193e-01 1.869400e-16 2.686574e-17 3.540473e-18

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

[,1]
[,2]
[,3]
[,4]
[,5]
-0.3262407 0.77055695 -0.5096937 -0.1995559 0.014098365
-0.4377668 0.09392287 0.3454248 0.1386439 -0.813017974
-0.5507955 -0.59182723 -0.3600220 -0.4655446 -0.004147016
-0.4215743 0.19216386 0.6827627 -0.2779026 0.491887645
-0.4699219 -0.10116352 -0.1584718 0.8043592 0.311178980

36

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

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

Putem verifica faptul c A=UDVt, unde U i V sunt matrici ortogonale (date de ds$u,
ds$v), iar D este matricea diagonal cu ds$d pe diagonal. Verificarea este fcut prin
comanda urmtoare:
> a-ds$u%*%diag(ds$d)%*%t(ds$v)
[1,]
[2,]
[3,]
[4,]
[5,]

[,1]
-1.110223e-16
0.000000e+00
-2.220446e-16
-2.220446e-16
-2.220446e-16

[,2]
-8.881784e-16
-4.440892e-16
-4.440892e-16
-4.440892e-16
-6.661338e-16

[,3]
-8.881784e-16
-2.220446e-16
-2.220446e-16
-2.220446e-16
-4.440892e-16

[,4]
-6.661338e-16
-2.220446e-16
-2.220446e-16
-2.220446e-16
-4.440892e-16

[,5]
-8.881784e-16
-2.220446e-16
-4.440892e-16
-2.220446e-16
-4.440892e-16

Din nou erorile de rotunjire duc la un rezultat doar foarte apropiat de zero, nu exact
zero.
3.3. Funcii pentru iruri de caractere

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) nlocuiete ir1 cu ir2 n x. Dac
gsub(sir1,sir2,x,fixed=TRUE) fixed=FALSE atunci ir1 este o expresie
regulat. Parametrul ignore.case=TRUE, FALSE
controleaz dac se ine seama de caractere
majuscule i minuscule. Funcia sub nlocuiete
doar prima apariie a lui ir1 iar funcia gsub
nlocuiete toate apariiile irului ir1.
37

strsplit(x, split)

paste(..., sep=" ",


colapse=NULL)

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.
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)
tolower(x)
LETTERS, letters

Convertete la majuscule
Convertete la minuscule
Sunt vectori cu caracterele majuscule
(minuscule) ale alfabetului latin.

Exemplul 3.6 Urmrind comenzile de mai jos se pot vedea unele variante de
aplicare a operaiilor cu iruri.
> x="avxfdrwyudbcbdgfjavsjhdhgderwrwy"
> nchar(x)
[1] 32
> x1=strsplit(x,split=NULL)
> x1
[[1]]
[1] "a" "v" "x" "f" "d" "r" "w" "y" "u" "d" "b" "c" "b"
[14] "d" "g" "f" "j" "a" "v" "s" "j" "h" "d" "h" "g" "d"
[27] "e" "r" "w" "r" "w" "y"
> x2=unlist(x1)
> x2
[1] "a" "v" "x" "f" "d" "r" "w" "y" "u" "d" "b" "c" "b"
[14] "d" "g" "f" "j" "a" "v" "s" "j" "h" "d" "h" "g" "d"
[27] "e" "r" "w" "r" "w" "y"
> x3=rev(x2)
> x3
[1] "y" "w" "r" "w" "r" "e" "d" "g" "h" "d" "h" "j" "s"
[14] "v" "a" "j" "f" "g" "d" "b" "c" "b" "d" "u" "y" "w"
[27] "r" "d" "f" "x" "v" "a"
> x4=paste(x3,collapse="")

38

> x4
[1] "ywrwredghdhjsvajfgdbcbduywrdfxva"
> x5=substr(x4,3,7)
> x5
[1] "rwred"
> x6=sub("d","D",x)
> x7=gsub("d","D",x)
> x
[1] "avxfdrwyudbcbdgfjavsjhdhgderwrwy"
> x6
[1] "avxfDrwyudbcbdgfjavsjhdhgderwrwy"
> x7
[1] "avxfDrwyuDbcbDgfjavsjhDhgDerwrwy"
> x8=unlist(strsplit(x,split="w"))
> x8
[1] "avxfdr"
"yudbcbdgfjavsjhdhgder"
[4] "y"
> i=grep("r",x8)
> i
[1] 1 2 3
> x8[i]
[1] "avxfdr"
"yudbcbdgfjavsjhdhgder"

"r"

"r"

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
Normal

1
2

x m 2
2 2

Modul de apelare
dnorm(x,mean=0,sd=1,log=FALSE)
pnorm(x,mean=0,sd=1,lower.tail=TRUE,
log.p=FALSE)
qnorm(q,mean=0,sd=1,lower.tail=TRUE,
log.p=FALSE)
rnorm(n,mean,sd), n este numrul de valori

aleatoare

39

Log-normal
1

2 x

log x 2
2 2

Binomial

P(X=x) = C nx p x 1 p n x
x = 0, 1, 2, ..., n

mean = m, sd=
dlnorm(x,meanlog=0,sdlog=1,log=FALSE)
plnorm(q, meanlog=0, sdlog=1,
lower.tail=TRUE, log.p=FALSE)
qlnorm(p, meanlog=0, sdlog=1,
lower.tail=TRUE, log.p=FALSE)
rlnorm(n, meanlog = 0, sdlog = 1)
meanlog = , sdlog =
dbinom(x, size, prob, log=FALSE)
pbinom(q,size,prob, lower.tail=TRUE,
log.p = FALSE)
qbinom(p,size,prob,lower.tail=TRUE,
log.p = FALSE)
rbinom(nr, size, prob), nr este numrul de

valori aleatoare
Binomial negativ
x n n
P(X=x) =
p 1 p x

n x!
xN , n>0
Student
1
1


2 2
x
2
x
1



2

Hi ptrat
1

/2

/ 2

x / 2 1e x / 2 ,

x>0

size=n, prob=p
dnbinom(x, size, prob, log = FALSE)
pnbinom(q,size,prob,lower.tail=TRUE,
log.p = FALSE)
qnbinom(p,size,prob,lower.tail=TRUE,
log.p = FALSE)
rnbinom(n, size, prob)
size=n, prob=p
dt(x, df,ncp=0, log=FALSE)
pt(q, df,ncp=0, lower.tail = TRUE,
log.p = FALSE)
qt(p, df, ncp=0, lower.tail = TRUE,
log.p = FALSE)
rt(n, df, ncp=0), n este numrul de valori

aleatoare

df = , ncp nu este de obicei utilizat


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 =

ncp nu se utilizeaz de obicei, implicit e zero.


Cauchy

1
x x 2
0
1

Exponenial

x e x , x>0, >0

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 = x0, scale =
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=

40

Gamma

x k 1
k a k

x
a

, x0, k>0, a>0

Beta

a b a 1
1 x b 1
x
a b
>0, >0, x (0, 1)

F
1
a
x

a bb
,
2 2

a / 2 a 1

x 2 1

a
x
b

a b
2

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


Geometric
P(X=x) = p(1-x)x-1, x N, p [0,1]

Hipergeometric
P(X=x) =

C mx C nk x
k
Cm
n

Poisson
P(X=x) =

x e
k!

, >0, x N

Uniform
1
x
, x [a, b]
ba

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
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= , shape2=
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
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
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)
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 =
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

41

dweibull(x,shape,scale=1,log=FALSE)
pweibull(q, shape, scale = 1,
x
a 1
lower.tail = TRUE, log.p = FALSE)
a x
x e b , x>0, a>0, qweibull(p, shape, scale = 1,
bb
lower.tail = TRUE, log.p = FALSE)
rweibull(n, shape, scale = 1)
b>0
shape=a, scale=b
dlogis(x, location = 0, scale = 1,
Logistic
log = FALSE)
x m
plogis(q, location = 0, scale = 1,
1
e s
lower.tail = TRUE, log.p = FALSE)
x
s
qlogis(p, location = 0, scale = 1,
x m 2

lower.tail = TRUE, log.p = FALSE)


s
1 e

rlogis(n, location = 0, scale = 1)

location=m, scale=s

Weibull

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)

0.6
0.4
0.0

0.2

densit. si functia de repartitie

0.8

1.0

Repartitia logistica, m=0, s=1

-10

-5

10

3.5. Funcii statistice elementare


Funcia
mean(x, trim=0,
na.rm=FALSE)
sd(x,na.rm=FALSE)

Explicaii
Media obiectului x. trim indic ce fracie din valorile
dinspre capete se neglijeaz. Parametrul na.rm indic
dac se elimin NA i NaN din calcul.
Deviaia standard

42

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

median(x,na.rm=FALSE)
cov(x, y = NULL,
use = "everything",
method = "kendall")
cor(x, y = NULL, use
= "everything",method
= "kendall")
quantile(x,prob,
na.rm=FALSE,type=7)

range(x)
sum(x,y),
prod(x,y,...)
diff(x, lag=1)

min(x)
max(x)
summary(obiect,...)

scale(x, center=TRUE,
scale=TRUE)

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.
Valoarea median
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".
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".
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.
Intervalul [minim, maxim]
Suma elementelor vectorilor x, y,.. respectiv produsul.
Diferene finite xi+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.
Minimul
Maximul
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.
x center
. Dac center=TRUE
Se nlocuiete xi cu i
scale
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.

43

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.
-2.000
2.000
4.000
3.769
6.000

Max.
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.
La fel ca lapply doar c rezultatul se convertete
(simplific) la un 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.
Se aplic funcia FUN elementelor din vectorul x
grupate dup lista de factori INDEX. Dac
symplify=TRUE se ncearc convertirea la array a
rezultatului.
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.

sapply (x, FUN, ...,


simplify = TRUE,...)
replicate(n, expr,
simplify = "array")
tapply(x, INDEX, FUN
= NULL, ...,
simplify = TRUE)
mapply(FUN, ...,
MoreArgs = NULL,
simplify = TRUE,
use.names = TRUE)

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

44

> x1=apply(x,MARGIN=1,FUN=sum)
> x1
[1] 22 26 30
> x2=apply(x,MARGIN=2,FUN=sum)
> x2
[1] 6 15 24 33
> x3=lapply(x,FUN=sqrt)
> x3
[[1]]
[1] 1
[[2]]
[1] 1.414214
[[3]]
[1] 1.732051
[[4]]
[1] 2
[[5]]
[1] 2.236068
[[6]]
[1] 2.44949
[[7]]
[1] 2.645751
[[8]]
[1] 2.828427
[[9]]
[1] 3
[[10]]
[1] 3.162278
[[11]]
[1] 3.316625
[[12]]
[1] 3.464102
> x4=sapply(x,FUN=sqrt)
> x4
[1] 1.000000 1.414214 1.732051 2.000000 2.236068
[6] 2.449490 2.645751 2.828427 3.000000 3.162278
[12] 3.316625 3.464102
> y=matrix(seq(from=0,by=10,length=12),ncol=4);
> y
[,1] [,2] [,3] [,4]
[1,]
0
30
60
90
[2,]
10
40
70 100
[3,]
20
50
80 110
> z=mapply(sum,x,y)
> z

45

[1]

12

23

34

45

56

67

78

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 p k

xi y j . Indicii vectorului x apar n vectorul ix, ai vectorului y n

i j k

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
> ir
[1] -2 -1 0 1 2 -1 0 1 2 3

8 10

> fir=factor(ir)
> p=tapply(r,fir,sum)
> ip=as.numeric(unlist(dimnames(p)))
> p
-2 -1 0 1 2 3 4
1 4 9 14 19 18 10
> ip
[1] -2 -1 0 1 2 3 4
> dimnames(p)<-NULL
> p
[1] 1 4 9 14 19 18 10

46

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
print

Explicaii
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

read.csv,
read.table,
read.csv2
read.delim
read.delim2

cat(...,file="",sep="",fill=FALSE,append=FALSE)
Vectorii i numele din ... sunt scrise n fiierul file (dac nu

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.
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="#",)

readLines
write,
write.table,
write.csv,
write.csv2

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.
Se utilizeaz pentru a citi linii de la o conexiune (de exemplu
dintr-un fiier)
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.

47

format

save

save.image

load
ls()
rm(list)

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(...,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(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(file), unde file este fiierul de unde se restaureaz
datele salvate cu save sau save.image
Rezultatul este o list cu variabilele active n programul curent
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, rep(x,10); rep(x,times=10);
length.out, each (la each se repet rep(1:3,length=5);
rep(1:5,each=2)

fiecare element al lui x)

48

x<-c(2,3,4)
x=1:3; y=4:6; z<-cbind(x,y);
combina pe coloanele (liniile) unor vector, u=rbind(x,y)
cbind, rbind

ale unei unor matrice sau data.frame


matrix, array

x=matrix(1:10, ncol=2)
permit crearea de matrice sau blocuri y=array(1:24, dim<-c(2,3,4))

multidimensionale
Exemplul 3.12. Ilustrm cum apar rezultatele la unele modele de funcii din
tabelul de mai sus.
> rep(1:3,length=5)
[1] 1 2 3 1 2
> rep(1:5,each=2)
[1] 1 1 2 2 3 3 4 4 5 5
> x=1:3; y=4:6; z<-cbind(x,y);
> z
x y
[1,] 1 4
[2,] 2 5
[3,] 3 6
> t=array(1:24, dim<-c(2,3,4))
> t
, , 1
[1,]
[2,]

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


1
3
5
2
4
6

, , 2
[1,]
[2,]

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


7
9
11
8
10
12

, , 3
[1,]
[2,]

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


13
15
17
14
16
18

, , 4
[1,]
[2,]

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


19
21
23
20
22
24

49

3.9. Funcii de conversie


Conversia datelor dintr-un tip n altul se poate face prin comenzi ca
as.numeric
as.vector,

as.integer, as.character, as.factor, as.function,


(convertete un vector numeric ntr-un factor), strtoi
cut
(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.

50

Exemplul 3.14. Din 1000 aruncri cu o moned, faa a aprut de 490 ori. S se
testeze dac probabilitatea p=1/2 de apariie a feei este admisibil cu un prag de risc
de 0.05. Urmtoarea comand n R face acest test.
> rez=binom.test(490, 1000, p=0.5, conf.level=0.95)
> rez
Exact binomial test
data: 490 and 1000
number of successes = 490, number of trials = 1000,
p-value = 0.548
alternative hypothesis: true probability of success is not
equal to 0.5
95 percent confidence interval:
0.4585849 0.5214742
sample estimates:
probability of success
0.49

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

51

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
0.69

system elapsed
0.08
1.36

Numrul funciilor predefinite n R este mult mai mare dact am descris noi
aici i pot apare funcii noi n versiunile ulterioare. Funciile descrise n tabelele de
mai sus fac parte din pachetul base i din pachetul stats, i foarte probabil vor rmne
i n versiunile ulterioare de R. Pachetele adiionale conin multe funcii suplimentare
care sunt orientate spre rezolvarea unor probleme specifice. Vom mai decrie ulterior
unele funcii din pachetul tseries, funcii orientate spre lucrul cu serii temporale.

52

Capitolul 4
Funcii grafice n R
n R se pot executa grafice de calitate pentru datele admise. Aceste grafice
sunt trimise pe ecran sau n fiiere de diverse tipuri. Pentru a realiza acest lucru
trebuie deshis un device. Comanda windows() deschide ecranul ca dispozitiv grafic,
comanda jpeg() deschide ca dispozitiv grafic un fiier n care se va scrie informaia
grafic n format jpeg, postscript() deschide un fiier de tip postscript, pdf(), png(),
tiff(), bitmap(), win.metafile(), etc. Aceste comenzi au ca parametru file numele
fiierului unde se salveaz graficul, width=limea n pixeli, height=nlimea n
pixeli. Numai un dispozitiv este activ la un moment, trecerea de la unul la altul se face
dev.next(), dev.prev(), dev.set(which=k). Listarea dispozitivelor grafice se face cu
comanda dev.list(), nchiderea unui dispozitiv cu dev.off(k), iar nchiderea tuturor cu
graphics.off(). Cnd s-a nchis un dispozitiv diferit de ecran, imaginea din el este
salvat n fiierul specificat n parametrul file. Dup comanda graphics.off() trebuie
deschis un nou dispozitiv pentru a putea tipri grafic, de regul windows() pentru
ecran. Un clic dreapta pe fereastra cu reprezentarea grafic de pe ecran deschide un
meniu cu opiuni de salvare sau copiere a coninutului n clipboard.
Rutinele grafice sunt cuprinse n modulul de baz: base precum i n dou
pachete suplimentare grid i lattice. Rutinele de baz se mpart n trei categorii:
rutine de nivel nalt high level n urma crora se creaz o fereastr grafic nou n
care se pun graficele specificate prin argumentele rutinelor; rutine de nivel jos low
level prin care la graficul existent se adaug informaii suplimentare ca text, puncte,
linii; grafice interactive prin care utilizatorul poate interaciona cu graficul prin
intermediul mausului pentru a obine informaii despre valorile din diverse poziii de
pe grafic sau pentru a aduga informaii n diverse poziii de pe grafic.
Rutinele de nivel nalt din modulul de baz sunt:
Instruciunea
plot

pairs
coplot
hist

Explicaii
plot(x,y,...), plot(xy,...), tiprete punctele de coordonate (x[i],y[i])
utliznd opiunile grafice ... (vezi mai jos). plot(f,x) unde f este un
factor pentru x tiprete un boxplot pentru x grupat dup factorul f.
plot(x~y) face graficele coloanelor y i n funcie de x. plot(x)
pentru o variabil care are metoda plot produce un grafic specific
acelui tip de variabil.
pairs (x) unde x este o matrice face toate graficele x i , x j
unde x i i x j sunt coloane ale lui x
coplot(x~y,f) execut graficele lui y depinznd de x, pentru fiecare
nivel al factorului f
hist(x,...) tiprete histograma frecvenelor valorilor din vectorul x.
Opiunea frecvent utilizat este nclass=n pentru a specifica n cte
clase se mpart datele din x. Cu opiunea probability=TRUE
histograma va reprezenta probabilitile nu frecvenele.

53

boxplot

qqnorm, qqplot,
qqline
barplot
dotchart
image
contour,
filled.contour

persp

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(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(x,...), unde ... sunt opiuni, tiprete sub form de bare
verticale valorile lui x
dotchart(x,...) la fel ca barplot(x,...) face graficul valorilor lui x
sub form de puncte
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(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(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
points
lines

Explicaii
points(x,y,...) tiprete puncte n coordonatele specificate de x i y
lines(x,y) adaug linii ntre punctele de coordonate specificate n
vectorii x, y.

text

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

54

mtext

abline

axis
segments

arrows
rect

polygon

box
grid

legend

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(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(side,...) traseaz o ax n funcie de parametrul side (1=jos,
2=stnga, 3=sus i 4=dreapta). Exist mai muli parametri opionali.
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(xo,yo,xd,yd,...) este ca i rutina segments de mai sus doar c
traseaz sgei de la (xo,yo) la (xd,yd)
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(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(lty=tip, col=culoare) determin trasarea unui dreptunghi n
jurul graficului cu tipul de linie tip i culoarea culoare.
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(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)
55

title

title(main=text1,sub=text2,xlab=text3,ylab=text4,...) determin
scrierea unui titlu(main), subtitlu(sub), etichete pentru axe(xlab,
ylab) care sunt luate din text1, text2, etc.

Pentru diveri parametri grafici R menine o list numit par cu valorile acestora. Cu
comanda par() putem afla valorile acestor parametri. Cei mai utilizai parametri
grafici sunt n tabelul urmtor:
Parametrul grafic
xlog

Valoare
implicit
FALSE

ylog
pch

FALSE
1

col

black

col.axis
col.lab
col.main
col.sub
cex, cex.axis,
cex.lab, cex.main,
cex.sub
adj

"black"
"black"
"black"
"black"
1

font, font.axis,
font.lab, font.main
font.sub

fg, bg
lty

black,
white
solid

lwd

mai

1.02 0.82
0.82 0.42
5.1 4.1
4.1 2.1
1

mar
mex

-1

Explicaii
Dac este TRUE pe axa x se utilizeaz scara
logaritmica
Analog cu xlog dar pentru axa y
pch este un vector valori ntregi care specific tipul
de punct de pe grafic. Valorile ntregi sunt de regul
ntre 0 i 255. Dup epuizarea tipurilor din pch ele
se se repet.
col este un vector de ntregi care d indexul culorii
curente din paleta curent de culori. Culoarea se
poate exprima i prin cuvinte (exist 667 de culori
care au nume care se pot afla cu comanda colors()).
Culorile se repet ciclic atunci cnd se reprezint
diverse obiecte grafice.
Culoarea axelor
Culoarea pentru etichete pe axe
Culoarea pentru titlu
Culoarea pentru subtitlu
Un factor de amplificare pentru mrimea textului
fa de mrimea implicit. Doar cex.main are
valoarea implicit 1.2
Se controleaz cum apare textul justificat fa de
punctul de referin: 0 aliniat la stnga, 1 aliniat la
dreapta , 0.5 centrat orizontal
Un ntreg ce reprezint fontul pentru text, axe,
etichete, titlu, subtitlu.
Culorile pentru foreground respectiv background
Tipul de linie: 0=blank, 1=solid (default),
2=dashed, 3=dotted, 4=dotdash, 5=longdash,
6=twodash
Grosimea liniei. Depinde de tipul de dispozitiv
grafic pe care se tiprete
Un vector ce conine dimensiunile n inci ale
marginilor n ordinea: jos, stnga, sus, dreapta
La fel ca la mai dar dimensiunea este n linii
Factor de amplificare pentru mrimea fontului cu

56

mfcol

mfrow

mfg

1 1 1 1

fig
xaxs, yaxs
xaxp, yaxp

015

lab

5 5 7

las
xaxt, yaxt
usr

s
0101

tcl

-0.5

srt

care se scrie pe margine


Vector de tipul c(nr,nc). Ecranul va fi mprit n
nr nc regiuni. Figurile consecutive vor fi scrise pe
coloan.
Vector de tipul c(nr,nc). Ecranul va fi mprit n
nr nc regiuni. Figurile consecutive vor fi scrise pe
linie.
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)
Printr-un vector de patru numere ntre 0 i 1 se
controleaz poziia figurii n pagin fa de colul
stnga-jos.
Controleaz stilul marcajelor pe axe i pot fi "r", "i",
"e", "s", "d".
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
Vector de tipul c(n1,n2,n): n1, n2 reprezint
numerele dorite de marcaje pe axe, iar nu e
implementat.
Este un ntreg 0, 1, 2, sau 3, i controleaz felul n
care se traseaz marcajele pe axe.
Controleaz tipul axelor "n", "l" , "t", "s".
Vector de tipul c(x1,x2,y1,y2) pentru valorile
extreme pe coordonate
Lungimea marcajelor pe axe ca fracie din limea
unui rnd de text.
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"
[7] "yellow" "gray"

"green3"

57

"blue"

"cyan"

"magenta"

Pentru culorile care nu au nume se utilizeaz descrierea lor hexazecimal. Putem crea
palette
palete de culori prin palette(rainbow(n)), palette(heat.colors(n)),
(terrain.colors(n)), palette(topo.colors(n)),
palette(cm.colors(n)), unde n este
numrul culorilor pe care le vrem n palet. O alt modalitate de a obine palete este
prin interpolarea culorilor cu funcia colorRampPalette ca mai jos:
> culorile.mele=colorRampPalette(c("blue","yellow","red"))
> culorile.mele
function (n)
{
x <- ramp(seq.int(0, 1, length.out = n))
rgb(x[, 1], x[, 2], x[, 3], maxColorValue = 255)
}
<bytecode: 0x01aa3ae0>
<environment: 0x02c36ab8>
> paleta=palette(culorile.mele(20))
> paleta
[1] "blue"
"#1A1AE4" "#3535C9" "#5050AE" "#6B6B93"
[6] "#868678" "#A1A15D" "#BBBB43" "#D6D628" "#F1F10D"
[11]"#FFF100" "#FFD600" "#FFBB00" "#FFA100" "#FF8600"
[16]"#FF6B00" "#FF5000" "#FF3500" "#FF1A00" "red"

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

10
5

1:20

15

20

Puncte si culori

10

15

20

Index

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:

58

Parametrul

Explicaii
add
Dac este TRUE atunci noul grafic se suprapune peste cel
existent. Funcioneaz uneori.
axes
Dac este FALSE nu se traseaz axele
log=x, log=y, Se specific ce axe sunt gradate logaritmic. Acest lucru se
log=xy
poate face i prin parametrii grafici, xlog, ylog.
type
Poate lua lua valorile "p" pentru a tipri puncte, l pentru a
tipri linii, b pentru a tipri puncte i linii ntre ele, "o"
pentru a tipri puncte i linii peste ele, "s" sau "S" pentru a
tipri grafice sub form pas (step) n sus sau jos, "n" pentru a
se seta sistemul de coordonate, fr a trasa graficul
xlab, ylab
Sunt iruri de caractere pentru etichetarea axelor
main, sub
Sunt iruri de caractere pentru titlu i subtitlu
xlim, ylim, zlim
Sunt vectori numerici cu cte dou valori pentru a seta limitele
pe cele trei axe
n cele ce urmeaz exemplificm utilizarea n parte a rutinelor grafice, cu comentarii.
Exemplul 4.1. Facem graficele a trei funcii, conform scriptului urmtor:
x=seq(-pi,pi,length=20)
y1=sin(x); y2=cos(x); y3=2*x/(1+x^2)
plot(x,y1,type="b", pch="+", xlab="", ylab="", lwd=3)
lines(x,y2, type="o", pch=10, col="red", lty="dotted",
lwd=3)
lines(x,y3,type="l", lty="dashed", col="blue", lwd=3)
title(main="Un exemplu de grafic", sub="Graficele a trei
functii",xlab="axa X",ylab="axa Y", cex.main=2,
cex.lab=1.5, cex.sub=2)
grid(5,5,col="cyan")
legend("topleft", legend=c("sin","cos","alta")
,col=c("black","red","blue"),
lty=c("solid","dotted","dashed")
,bg="yellow1")

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
59

ale colului stnga sus, coordonate ce pot fi alese interactiv prin locator().
Instruciunea legend din exemplul precedent ar fi putut fi
legend(locator(),legend=c("sin","cos","alta"),
col=c("black","red","blue"),
lty=c("solid","dotted","dashed"),
bg="yellow1")

1.0

Un exemplu de grafic
sin
cos
alta

+
+

+
+

+
0.5

+
+
+

0.0

axa Y

+
+

+
+

-0.5

+
+
+
+

-1.0

+
+

-3

-2

+
+
-1

axa X

Graficele a trei functii

Fig 4.2

Exemplul 4.2. Graficul unei suprafee vzut din diverse direcii. Graficele sunt
grupate ntr-o singur figur divizat n 2x2 zone prin comanda par(mfrow(2,2)).
f<-function(x,y){z=x-sin(2*x)^2+2*y^2}
x=seq(-1,1,length=20); y=x;
z=outer(x,y,f);
f<-function(x,y){z=x-sin(2*x)^2+2*y^2}
x=seq(-1,1,length=20); y=x;
z=outer(x,y,f);
par(mfrow=c(2,2))
persp(x,y,z,col="lightblue", shade=0.5, theta=45, phi=30,
r=50,
xlim=1.1*range(x),ylim=1.1*range(y),zlim=1.1*range(z),
main="Primul
grafic",
sub="Graficul
functiei
z=xsin(2*x)^2+2*y^2",
xlab="axa X",ylab="axa Y", zlab="Z",
ticktype="detailed", cex.main=2, cex.sub=2)
paleta=palette(rainbow(32))
clase=cut(z,32)
par(mfg=c(1,2))
persp(x,y,z,col=paleta[clase],
shade=0.5,
theta=30,
phi=15, r=50,
xlim=1.1*range(x),ylim=1.1*range(y),zlim=1.1*range(z),

60

main="Al doilea grafic", sub="Graficul


sin(2*x)^2+2*y^2",
xlab="axa X",ylab="axa Y", zlab="Z",
ticktype="detailed",cex.main=2, cex.sub=2)

functiei

z=x-

paleta1=palette(cm.colors(32))
clase=cut(z,32)
persp(x,y,z,col=paleta1[clase],
shade=0.5,
theta=20,
phi=45, r=50,
xlim=1.1*range(x),ylim=1.1*range(y),zlim=1.1*range(z),
main="Al treilea grafic", sub="Graficul functiei z=xsin(2*x)^2+2*y^2",
xlab="axa X",ylab="axa Y", zlab="Z",
ticktype="detailed",cex.main=2, cex.sub=2)
paleta2=palette(colorRampPalette(c("maroon", "gold"))(32))
clase=cut(z,32)
persp(x,y,z,col=paleta2[clase], shade=1, theta=30, phi=45,
r=50,
xlim=1.1*range(x),ylim=1.1*range(y),zlim=1.1*range(z),
main="Al patrulea grafic", sub="Graficul functiei z=xsin(2*x)^2+2*y^2",
xlab="axa X",ylab="axa Y", zlab="Z",
ticktype="detailed",cex.main=2, cex.sub=2)
par(mfrow=c(1,1))

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.

Primul grafic

Al doilea grafic

2
2
1

0
Z

-1
-1

-2
-1.0

1.0
-0.5
ax a0.0
X 0.5

-0.5

0.5
0.0 Y
ax a

1.0

-2
-1.0

-0.5

1.0 -1.0

0.0
ax a X

0.5

1.0

-1.0

0.5
0.0
-0.5 ax a Y

Graficul functiei z=x-sin(2*x)^2+2*y^2

Graficul functiei z=x-sin(2*x)^2+2*y^2

Al treilea grafic

Al patrulea grafic

2
2
1
1
Z

-0.5

-0.5

-0.5
0.0
axa X

0.5

1.0

ax0.0
aX

-1.0

Graficul functiei z=x-sin(2*x)^2+2*y^2

0.0

ax a

-1.0

1.0
0.5

-2
-1.0

0.0

-2

0
-1

0.5

-1

Fig 4.3

61

-0.5
0.5

ax
a

1.0

1.0 -1.0

Graficul functiei z=x-sin(2*x)^2+2*y^2

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^21,x^2+1))%*%sin(x)))
ex=expression(paste(bgroup((,frac(x+y,xy)+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)

62

ex1=expression(paste(f(x)%==% bgroup("(",frac(x^21,x^2+1)+sin(x),")")^2))
text(locator(),ex1,cex=1.5)
ex2=expression(paste(g(x)%==%
bgroup("(",frac(log(2+sin(x))+1,2+cos(2*x)),")")))
text(locator(),ex2, cex=1.5)

Adnotari matematice pe grafice

1.0

0.0

f(x),g(x)

0.5

x2 1

fx 2
sinx
x

-0.5

log2 sinx 1
gx

2 cos2x

-1.0

-0.5

0.0

0.5

1.0

x
Graficul a doua functii

Fig 4.4
Exemplul 4.4. Histograma valorilor generate aleator dup o distribuie normal
este comparat cu graficul distribuiei.
media=2; devs=4;
y=rnorm(nr, mean=2, sd=4)
hist(y, probability=TRUE, col="lightgray",
main="Histograma valorilor y=rnorm(200, mean=2, sd=4)",
xlab="Valorile lui y",
ylab="Densitatea valorilor lui y", cex.axis=1.5,
cex.lab=1.5 )
x1=seq(-6,10,length=100)
y1=dnorm(x1,mean=2, sd=4)
lines(x1,y1, lwd=3)
ex=expression(paste(rho, "(", x, ")=",frac(1,
4*sqrt(2*pi)), " ",
plain(e)^{frac(-(x-2)^2, 2%*%4^2)}))
text(locator(),ex, cex=1.5)

63

0.02

0.04

0.06

0.08

x2
1
(x)=
e 242
4 2

0.00

Densitatea valorilor lui y

0.10

Histograma valorilor y=rnorm(200, mean=2, sd=4)

-5

10

Valorile lui y

Fig 4.5
Exemplul 4.5. Utilizm qqnorm pentru a detecta dac o selecie este normal
(graficul ar trebui s fie o dreapt) i qqplot pentru a detecta dac dou selecii
empirice au aceei distribuie (graficul ar terbui s fie prima bisectoare).

+
-3

-2

-1

+
+
+

4
3
2
1
0
-1

4
-1

+
+++++
+++++++
+++++
+++
+++++
+
+
++
++++
+++++
++++
+++
++
+
+
++++++
++++
++++
+++++
++++
+
+
+
+
++
+++++
++++
++++
+++++
+++
+
+
+
+
+++
++++
+++++
+++++
+
+++
++

Q-Q plot pentru doua selectii

-2

+
++

x2=rnorm(100, mean=1, sd=1)

Q-Q norm pentru o selectie normala

-2

x2=rnorm(100, mean=1, sd=1)

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

Cuantilele teoretice

+
++
+
+++
+++
++
+
+
+
+++
+++
++++++
+++++++++
++++++
+
+
+
+
+
+
+
++++
+++++++++++++
++++++++
+++++++++++++
+++++++++++++
++++++++++
+
+
+
+
+
+
+
+++++++
++++++++
+++++
+++++
++++++
+
+
+
+
++
+
++
+
+
+
+
+
+
+
+
+
0.0

0.2

0.4

0.6

0.8

x1=runif(100)

Fig 4.6

64

1.0

Capitolul 5
Programarea n R
n principiu, un limbaj de programare ne pune la dispoziie un anumit numr
de tipuri de date i un anumit numr de operaii predefinite asupra lor, modaliti de
introducere a datelor ntr-un program precum i de extragere a rezultatelor
(instruciuni read/write), instruciuni de control al fluxului de operaii executate (n
principal instruciuni de decizie i repetiie), instruciuni de creare de subprograme
(funcii). n funcie de limbaj exist i alte aspecte importante care pot interesa:
posibilitatea de a utiliza rutine scrise n alte limbaje, posibilitatea de utilizare recursiv
a funciilor, programarea pe obiecte, etc. n cele ce urmeaz descriem succint
elementele de baz ale programrii n limbajul R.
Codul scris n limbajul R este cod interpretat, deci instruciunile sunt
compilate la un stadiu intermediar (bytecode) de unde sunt transformate n cod
depenedent de main n momentul execuiei. Acest proces de interpretare face ca
timpul de execuie s fie mai lung dect pentru programele compilate de la nceput n
cod-main executabil.
Scrierea unui program R se poate face n orice editor text. Se poate utiliza
editorul propriu (apelabil cu opiunea New script din meniul File) care are avantajul
c din el se poate rula o poriune din program selectat n prealabil prinr-un clic
dreapta i alegerea opiunii Run line or selection din meniul de context. Dac
programul a fost salvat pe disc n fiierul prog.r atunci rularea lui se face cu comanda
source(prog.r) dac este n directorul curent, altfel trebuie indicat i calea.
Toate instruciunile care se scriu la consol ntr-o sesiune de lucru pot fi
salvate la final n fiierul text .Rhistory (Save history din meniul File) de unde se
pot rula din nou cu comanda Load history (din meniul File). n acest fel se poate
repeta prelucrarea unor date ntr-o sesiune nou sau se poate scrie un program dup ce
se execut pas cu pas instruciunile lui ca i comenzi la consol.

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.

65

Dup efectuare unui calcul dac vrem s pstrm rezultatele ele trebuie
atribuite unei variabile. Atribuirea se face prin (variabila care primete valoarea
atribuit este A):
A<-expresie
A<<-expresie
A=expresie
expresie->A
expresie->>A

Atribuirile <- sau -> sunt locale iar <<- i ->> sunt globale (vezi observaia f) de la
seciunea definirea funciilor proprii). Atribuirea prin = este echivalent cu
atribuirea -> (exist unele situaii cnd nu sunt echivalente dar nu le utilizm)

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.
ii.
iii.

conditie este o expresie care d o valoare logic (TRUE, FALSE)


instr_1 este o instruciune sau un grup de instruciuni i la fel instr_2
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

66

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

67

a=matrix(c(1:12),nrow=3)
s=rep(0,3)
i=1
repeat{
j=1
repeat {s[i]=s[i]+a[i,j];j=j+1; if(j==5) break}
i=i+1
if(i==4) break
}
> s
[1] 22 26 30

n toate aceste programe ciclul interior se poate nlocui cu funcia sum. Prin aceasta se
execut mai repede programul pentru c repetiia din funcia sum este compilat direct
n cod main. Programul ar arta astfel (n varianta cu for).
a=matrix(c(1:12),nrow=3)
for (i in 1:3)s[i]=sum(a[i,])
> s
[1] 22 26 30

Multe repetiii pot fi realizate cu funciile de mapare apply, lapply, sapply, tapply,
mapply, descrise n capitolul 3. Programul precedent poate fi scris de exemplu cu
funcia apply astfel:
a=matrix(c(1:12),nrow=3)
s=apply(a,MARGIN=1,sum)
> s
[1] 22 26 30

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,]

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


1
4
7
10
2
5
8
11
3
6
9
12

68

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,]

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


1
4
7
10
2
5
8
11
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 f x, y, z x 2 xyz 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

69

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)

70

c=matrix(rep(2,12), nrow=3)
rez1=a^2+a*b*c
rez2=matrix(mapply(function(x,y,z)x^2+x*y*z,a,b,c),nrow=3)
rez1
rez2

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

list(

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

deposit = function(amount) {

Prima funcie: deposit modific

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

71

if(amount <= 0)
stop("Deposits must be
positive!\n")
dataa=Sys.time()
durata=as.numeric(dataa) as.numeric(data)
durata=durata/86400
durata=durata/365
total <<- total*(1+dob)^durata +
amount
cat(amount, "deposited. Your
balance is", total, "\n\n")
data<<-dataa
},

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

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

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.

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

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

72

2011-12-19 01:23:47

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 ntrun 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
logical
integer
double
complex
character
raw

C type
int *
int *
double *
Rcomplex *
char **
unsigned char *

FORTRAN type
INTEGER
INTEGER
DOUBLE PRECISION
DOUBLE COMPLEX
CHARACTER*255
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.

73

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.
1 12 11 10

2 13 16 9
3 14 15 8

4 5 6 7

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

74

#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
/*
To use this exported function of dll, include this
header
* in your project. */
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void DLL_EXPORT SomeFunction(const LPCSTR sometext);
void DLL_EXPORT rot(int *nlin, double *a,double *b);
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__

Fiierul main.cpp
#include "main.h"
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0,
sometext,
"DLL
Message",
MB_OK
MB_ICONINFORMATION);
}

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)

75

{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}

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

76

Pentru apelul funciei rot care se gsete n lbrria pr1.dll putem scrie o funcie R care
s fac acest apel mai uor. In fiierul urmtor se face acest lucru. Din cei trei
parametri l lum ca parametru de ieire din funcia rot doar pe al treilea, b.
dyn.load("pr1.dll")
x=1:25
a=matrix(x,ncol=5)

rot<-function(a){
if(!is.matrix(a))stop("intrarea in rot trebuie sa
fie matrice")
if(!is.numeric(a)) stop("matricea trebuie sa fie
numerica")
if(!(ncol(a)==nrow(a))) stop("matricea trebuie sa
fie patratica")
b=rep(0,length(a));
rez<C("rot",as.integer(ncol(a)),as.double(a),as.double(b)
)
return(rez[[3]])
}

aa<-rot(a)
dyn.unload("pr1.dll")

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

77

Capitolul 6
Aplicaii diverse programate n R
Poate cel mai uor mod de a nva un limbaj este de a urmri cteva programe
simple scrise n el.

6.1. Rambursri de credite.


Un client face un credit n valoare de S0 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 t1,...,tn ; ar mai dori s tie i ce suma mai are de
pltit dup fiecare rat.
S presupunem c ratele pltite la momentele ti au valoarea ri. Partea efectiv
din datorie pltit atunci va fi egal cu ai = ri Di unde Di este dobnda pltit la suma
restant pe intervalul de timp (ti-1,ti). Fie Si suma restant la momentul ti, dup
achitarea ratei ri.
Axioma este c dac dobnda unitar pe intervalul (ti-1,ti) este di, atunci
dobnda pltit la momentul ti va fi egal cu Di = Si-1di. S notm qi = 1 + di .
Cum prima dobnd se aplic la suma total S0 obinem urmtoarea recuren
pentru sumele restante
a1 = S0 - S1 = r1 d1S0 S1 = (1 + d1)S0 r1 S1 = q1S0 r1
a2 = S1 S2 = r2 d2S1 S2 = (1 + d2)S2 r2 S2 = q2S1 r2
.....................
Sk = (1 + dk)Sk-1 - rk Sk = qkSk-1 - rk

(6.1.1)

Putem scrie relaia (6.1.1) i sub forma Sk +rk = qkSk-1 . S notm k = 1/qk .
Atunci relaia (6.1.1) devine
Sk-1 = kSk + krk
(6.1.2)
Se propun mai multe scenarii.

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 qj = 1 + dj = 1 + i(tj tj-1) pentru j 2, q1 = 1
+ it1. Scenariul presupune rate egale, adic r1 = ...= rn = r .
Rata se calculeaz punnd condiia ca Sn = 0.
Relaia (6.1.2) implic, din aproape n aproape Sn-1=rn Sn-2=r(n-1+n-1n)
Sn-3 = r( n-2 + n-2n-1 + n-2n-1n) ..... de unde gsim rata
r

S0
1 1 2 ... 1 2 ... n

(6.1.3)

Scriptul urmtor calculeaz rata r dup formula (6.1.3) i amortismentele


(ak)1kn. Atenie: comentariile scrise cu font Times New Roman nu fac parte din
script, ci sunt comentarii.

78

Se apeleaz prin instruciunea


a = ratadosi(s0,i,t)

Variabilele funciei sunt suma mprumutat s0, 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])}
## q1 = 1 + it1, k 2 qk = 1 + i(tk tk-1)
alfa=1/q;for (k in 1:n) {bet[k]=prod(alfa[1:k])}
##k = 1/qk,k=1...k
r=s0/sum(bet)
## r = s0/(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]}## ak=Sk-1 - Sk
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)13k 24. Deci succesiunea de
instruciuni este
>t=13:24/12
> a=ratadosi(1200,.12,t)
> rata=a[[1]];rata
[1] 119.2861
> amortismente=a[[2]];amortismente
[1] -36.7139 106.9190 107.9881 109.0680 110.1587 111.2603
112.3729 113.4966
[9] 114.6316 115.7779 116.9357 118.1050

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 q1 = 1 i t1 , k 1 qk 1 i tk tk 1 ,
#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

79

q[1]=(1+i)^t[1];for (k in 2:n) {q[k]=(1+i)^(t[k]-t[k-1])}

## qk 1 i tk tk 1 ,
alfa=1/q;for (k in 1:n) {bet[k]=prod(alfa[1:k])}
r=s0/sum(bet)
s[1]=s0*q[1]-r;for (k in 2:n){s[k]=s[k-1]*q[k]-r}
amo[1]=s0-s[1];for (k in 2:n){amo[k]=s[k-1]-s[k]}
rata=list(r,amo)
rata}

Exemplu de aplicare
Se face un credit de 1200 de lei, pltibil n 12 rate lunare egale,n regim de dobnd
compus cu termen de graie de 1 an i dobnd 12%. Care este rata i cum evolueaz
amortismentele?
Soluie.
> a=ratadoco(1200,.12,t);a
[[1]]
[1] 119.0274
[[2]]
[1] -37.72552 107.28290 108.30088 109.32853 110.36592
111.41316 112.47034
[8] 113.53755 114.61488 115.70244 116.80031 117.90861

Rata este putin mai mic, deoarece dac s-ar calcula corect rata lunar a
1
12

dobnzii, ea nu ar fi egal cu i/12, ci cu 1 i 1 . 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 rk = a + dkSk-1 cu amortismentul a = S0/n. Dobnzile unitare
sunt d1 = it1 i k 2 dk = i(tk tk-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)}
# dk = i(tk tk-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.

80

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

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
d1 = 1 i t1 1 i k 2 1 i tk tk 1 1 .
#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[k1])-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)

81

rez=data.frame(scenarii,sume)
rez}

Exemplu de aplicare
n cazul nostru suma cea mai mic este, dup cum rezult din tabelul de mai jos,
de 1419.38 lei, n regim de dobnd compus, dac s-ar accepta calculul normal al
dobnzii.
t=13:24/12; comprate(1200,0.12,t)
scenarii
sume
1 rate egale dob simpla 1431.433
2 rate egale dob compusa 1428.329
3 amo egale dob simpla
1422.000
4 amo egale dob compusa 1419.379

6.1.6. Rat fix de valoare determinat


Revenim la relaia de recuren a sumelor restante, Sk = qkSk-1 - rk 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 = minn Sn 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 t0 + nh. Este posibil ca rata s fie
prea mic pentru a putea achita rambursa creditul.
Dac q1 = 1 i t1 1 i k 2 qk = 1 i tk tk 1 1 = 1 i h 1 = q, avem
S1 = S0q1 r, S2 = S1q r = (S0q1 r)q r = S0q1q r(1 + q), S3 = S0q1q2 r(1 + q
2
+ q ),....i, n general, Sn+1 = S0q1qn r(1 + q +...+ qn).
Atunci Sn+1 0 S0q1qn r(1 + q +...+ qn) r( 1 + + ...+ n) S0q1 , cu
= 1/q.
Creditul se poate rambursa ntr-un numr finit de rate egale cu r dac exist un

n ca Sn+1 0 . Trebuie deci ca r

S 0 q1
1 2 ...

, adic deducem condiia

r S 0 q1 1

(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 q1 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}

82

rez=c(k-2,s[k-2])
rez=list(rez,s[1:k-1])
rez}

Exemplu de aplicare
n cazul nostru avem r = 100, S0 = 1200, t0 = 1, h = 1/12, i = 0.12
a=nrrate(100,1200,1,1/12,0.12);a
[[1]]
[1] 14.00000 29.85075

[[2]]
[1] 1244.00000 1155.80406 1066.77124
794.57178
[7] 702.11130 608.77349 514.55002
226.48118
[13] 128.63021
29.85075 -69.86600

976.89362

886.16316

419.43248

323.41238

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 (i0, i1). Pentru a nu risca o
bucl infinit, am ales un prag (n = 1000) peste care nu mai verificm evoluia
sumelor restante. Acum N = minn Sn 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)

83

#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, S0 = 1200, i0 = 0.05, i1 = 0.15.
a=nralrate(100,1200,.05,.15);a
[[1]]
[1] 19.000000 7.846417
[[2]]
[1] 1164.531376 1139.006774 1072.575349 1001.426395
963.953179
[7] 917.006879 848.128914 749.050657 714.409097
585.682507
[13] 504.665078 424.788245 355.531910 284.929749
106.591050
[19]
7.846417 -91.942226

993.777986
673.291059
199.222488

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,s0,i0,i1), 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, Sn-1) cu n numrul de rate i
Sn-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

84

> p
[1]
4
89 479 1165 1809 2106 1721 1128 731
97
48
18
10
[16]
6
1
1
> pp=p;for (k in 1:m) {pp[k]=sum(p[1:k])/sum(p)}
> b=rbind(x,pp);b

387

200

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 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, Sk = qkSk-1 - rk.
Presupunem, la fel ca n paragraful anterior, c ratele sunt egale ntre ele, rk = 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
(in)n. Atunci factorii de fructificare qn vor forma i ei un ir de variabile aleatoare
independente i identic repartizate, i la fel i coeficienii de actualizare n = 1/qn.
O rat este suficient dac S1 0 r q1S0 1 S0/r
Dou rate sunt suficiente dac S2 0 S0q1q2r(1+q2)0 1 + 12 S0/r
Trei rate sunt suficiente dac S3 0 1 + 12 + 123 S0 /r
n general, n rate sunt suficiente dac
Sn 0 1 + 12 +...+ 12...n S0 /r
(6.1.5)
Probabilitatea ca aa ceva s se ntmple este Fn(S0 / r) , unde Fn este funcia de
repartiie a variabilei aleatoare Xn = 1 + 12 +...+ 12...n.
Fie F = F1 funcia de repartiie a coeficientului de actualizare 1.
Observm c X2 = X1(1 + 2). Dac notm Y2 = 1 + 2, atunci Y2 este
independent de X1 , are funcia de repartiie G(x) = F(x 1) i X2 = X1Y2 .
Cum gsim repartiia lui X2 ?
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 = FG. Dac F i G sunt
repartiii discrete, atunci H se poate calcula astfel
x

...

... y

m
2
n
, G 1
FG
F 1 2
p
p
...
p
q
q
...
q
1
2
m
1
2
n

Scriptul convm face exact acest lucru.

85

x1 y1

p1q1

x1 y2
p1q2

... xm yn

... pm qn

##Calculeaza convolutia multiplicativa


(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}

intre

(x,p)

si

Variabilele sunt vectorii x =(xi)1im , p =(pi)1im , y = (yj)1jn, q = (qj)1jn .


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 xmyi,j = xiyj i pmqi,j = piqj . 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 = xiyj . 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 xiyj,
sortat n ordine cresctoare iar al doilea cu probabilitile pq

Exemplu
> a=convm(x,p,y,q);a

86

[[1]]
[1] -4 -2 -1

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

5 10 15 20

. Ratele se vd n
S presupunem acum c rata dobnzii este i
.2 .3 .3 .2
primul rnd, exprimate n procente iar probabilitile lor n al doilea rnd. Atunci qn
1
1
1
1

1.05 1.1 1.15 1.2


.3
.3
.2
.2
1
1
1
1
Vrem s gsim repartiia lui 1 + 12 = FG unde F = 1.05 1.1 1.15 1.2 i
.3
.3
.2
.2

1.05 1.1 1.15 1.2


iar coeficienii de actualizare n
.3
.3
.2
.2

G = 1 1.05 1 1.1 1 1.15 1 1.2 . Atunci instruciunile sunt

.2

.3

.3

.2

x=c(1/1.05,1/1.1,1/1.15,1/1.2);y=x+1;p=c(2,3,3,2)/10;q=p
convm(x,p,x+1,p)
$x1
[1] 1.527778 1.557971 1.590909 1.594203 1.625709 1.626984
1.660079 1.666667 1.697723 1.699605 1.735537
[12] 1.746032 1.774892 1.780538 1.818182 1.859410
$p1
[1] 0.04 0.06 0.06 0.06 0.09 0.04 0.09 0.06 0.06 0.09 0.09
0.04 0.06 0.06 0.06 0.04

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 xiyj 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 S0 = 1200 lei s
poat fi achitat n dou rate r = 700 lei, calculm
a=convm(x,p,y,q);prob=tailfrep(1200/700,a[[1]],a[[2]]);prob

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 X3 = 1 + 12 + 123 = 1(1 + 2(1 + 3))) Observm c, deoarece
variabilele i au fost presupuse independente i identic repartizate, 2(1 + 3) are
87

aceeai repartiie ca i X2 iar 1 are aceeai repartiie ca i 3. Ca atare X3 are aceeai


repartiie ca 3(1 + X2) .
Mai general, Xn = 1(1 + (2 + 23 + ....+ 2...n)) are aceeai repartiie cu n( 1 +
1 +...+1...n-1) , adic cu n(1 + Xn-1). Dac notm faptul c dou variabile
D

aleatoare au aceeai repartiie cu X Y, putem scrie


D

Xn n(1 + Xn-1)
Sau, n termeni de repartiii,
Fn = Fh(Fn-1)
unde h(Fn-1) este repartiia variabilei aleatoare Xn-1 + 1.
Scriptul convmrep calculeaz repartiia lui Xn

(6.1.6)
(6.1.7)

##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 X4 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 X4 este de 256; n principiu este de 4n
valori. De exemplu, la n = 10
a=convrep(10,x,p);x1=a[[1]];p1=a[[2]]

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.

88

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

0.0

0.2

0.4

frp

0.6

0.8

1.0

Funcia gfrep(n,x,p) face graficul funciei de repartiie a repartiiei (x,p)


n n puncte echidistante calculate ntre min x1 i max x1.Iat graficul funciei de
repartiie al lui X10

4.5

5.0

5.5

6.0

6.5

7.0

7.5

Fig 6.1

1.5
1.0
0.5
0.0

de

2.0

2.5

3.0

Pe axa Ox sunt valorile lui x, ntre minim i maxim. n graficul urmtor prezentm
diferenele [F(t+h) F(t)]/h pentru h = (max x1 min x1)/998 care, n ipoteza c
repartiia lui Fn ar avea o limit absolut continu, ar mima densitatea sa. Dar nu tim
dac exist o asemenea limit: este o problem nerezolvat de matematicieni

4.5

5.0

5.5

6.0
t

Fig 6.2

89

6.5

7.0

7.5

Pentru valori mai mari ale lui n nu este realist s aplicm acest algoritm: dac la n
= 10 Xn are 1048576 de componente, la n = 20 o s aib 1012 . Am putea mri
numrul de iteraii dac am modifica problema: dac rata dobnzii nu are dect dou
0.10 0.15
. Ratele se vd n primul rnd, exprimate n procente iar
.5

valori i
.5

1.10 1.15
iar coeficienii de
.5

probabilitile lor n al doilea rnd. Atunci qn


.5
1

.5

.5

0.0

0.2

0.4

frp

0.6

0.8

1.0

actualizare n 1.10 1.15 . Atunci am putea calcula repartiia chiar i pentru X20

Fig 6.3

1.5
0.0

0.5

1.0

de

2.0

2.5

3.0

i densitatea

Fig 6.4

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


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

90

6.1 9. Calculul mediei i varianei variabilelor Xn = 1+12+...+12...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 i (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
Ei = a, Ei2 = b, EXn = , Var(Xn) = v
(6.1.8)
Datorit faptului c variabilele (i)i au fost presupuse independente, avem
= E1 + E1E2 +....+ E1E2...En = a +a2 +...+ an , adic
=

a 1 an
1 a

(6.1.9)

Pe de alt parte v = Var 1... i = ci , j unde ci,j = cov1... i , 1... j =


n

i 1

i, j

E 1... i 1... j - a . Dac i < j avem ci,j = biaj-i ai+j, deci


i+j

ci,j = bmin(i,j)ai j
n concluzie, dup efectuarea calculelor ajungem la

2a b 1 b n 1 ab a n 1 b n 1
v=

1 a 1 b
a b

(6.1.10)

b1 b a1 a
n

1 b

(6.1.11)

1 a

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(,), E
E

1
U

1 ln ln
i

1
ln ln
1
avem, n cazul nostru, a =
,b=

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

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 X60 are media 10.04189 i variana 0.402313
ans=medvar(60,a,b);ans
$rate
[1] 60

91

$media
[1] 10.04189
$varianta
[1] 0.402312

Atunci abaterea medie ptratic este 0. 6342815 . Deci P( 10.02 k0.63 <
X20 < 10.02 + k0.63) > 1 1/k2. O aproximaie bun este c P( 10.02 k0.63 < X20)
>1-

1
2k 2

. Pentru k = 4, gsim c P(X20 >7.503) > 96.88%. Dac S0 = 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) Xn lei i ctig Yn lei. Pierderea sa zilnic este atunci
n = Xn Yn .
Pierderea dup n zile este
S0 = 0, n 1 Sn =1 + ...+ n
(6.2.1)
Dac admitem (o simplificare matematic!) c variabilele (Xn)n sunt i.i.d.,
variabilele (Yn)n sunt i ele i.i.d. i c Xn este independent de Yn pentru orice n, atunci
repartiia variabilei aleatoare Sn este convoluia repartiiilor variabilelor aleatoare n.
Iar repartiia lui n este convoluia dintre repartiia FX a variabilelor Xn i repartiia F-Y
a variabilelor -Yn. Convoluia se noteaz cu .
Vom considera repartiiile FX i FY ca fiind discrete altfel nu prea putem
x1
p1

folosi calculatorul . Atunci FX =

x2

...

p2 ...

xm
, FY =
pm

y1

p1

y2

...

p2 ...

ym
i rezult
pm

c
x y

FXFY = 1 1
p1q1

x1 y2 ... xm y m
. Fiind discrete, cele dou repartiii pot fi
p1q2 ...
pm qn

codificate prin (x,p) i (y,q). n cazul acesta putem scrie (x,p) (y,q) = (x1,p1)
Scriptul conva(x,p,y,q) calculeaz exact acest lucru: produce vectorii x1
i p1. Este o operaie mai obinuit dect convoluia multiplicativ prezentat n
capitolul anterior. Diferena este c vaorile xi i yj se adun, nu se nmulesc.
##convolutia aditiva obisnuita cu functia tapply
conva<-function(x,p,y,q)
{xay=outer(x,y,"+");pmq=outer(p,q,"*")
a=tapply(pmq,xay,sum)
x1=as.numeric(names(a))
p1=x1;m=length(x1)
for (i in 1:m) {p1[i]=a[[i]]}
a=list(x1=x1,p1=p1)
a}

3 10

.
S presupunem, ca s revenim la scenariul nostru, c Xn
.3 .4 .2 .1
Probabilitatea s avem o zi fr cheltuieli este 30%, s cheltuim 1 UM este 40%, s
cheltuim 3 UM este 20% i, n zile rele, putem cheltui chiar 10 UM, cu probabilitatea

92

1 2 3 4
. Am ales
.4 .3 .2 .1

10%. Ctigurile le presupunem a avea repartiia Yn

exemplul n aa fel nct EXn = EYn = 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 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 Sn 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
6
[20]
7
8
9 10 11 12 13 14 15 16 17 18
25 26 27

19

20

21

22

23

24

$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 Ln = max (S0,S1,...,Sn). Aceasta este pierderea maxim pe care o avem dup n
zile. Ruina apare dac Ln > u. Probabilitatea P(Ln > 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 Ln.
Fie F = FXF-Y repartiia pierderii n i Fn repartiia sumei Sn.
Observm c L1 = (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 F1 = F+
Avem apoi L2 = 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
L1 = (1)+ , deci L2 are aceeai repartiie ca (L1 + 2)+. n concluzie, repartiia sa va fi
F2 = (F1F)+ .

93

Analog avem L3 (L2+3)+ i, n general rezult recurena


D

Ln+1 (Ln+n+1)+ Fn+1 = (FnF)+


Scriptul care calculeaz partea pozitiv a unei repartiii este ppos

(6.2.2)

## 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 Fn din
(2.2) este convaprep
##convolutia pozitiva iterata pentru Fn+1=(F*Fn)+
# (x,p) este pierderea, (y,p) e cistigul
# se convoluteaza la inceput (x,p) cu (-y,q) si rezulta F
convaprep<-function(n,x,p,y,q)
{y=-y;z=conva(x,p,y,q)
x=z[[1]];p=z[[2]] #aici s-a facut F
y=0;q=1
for (i in 1:n) {z1=convap(x,p,y,q);y=z1[,1];q=z1[,2]}
z1}

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

94

Rezultatul este prezentat sub forma unei matrici N 2, unde N este numrul de valori
pe care le poate lua Sn. n cazul nostru, N = 91.
S presupunem c managerul companiei are la dispoziie un capital u = 20 UM
pentru a plti cheltuielile. Care este probabilitatea ca acest capital s nu fie suficient?
Este 10(20) = P(L10 > 20) . Pentru ea avem la dispoziie funcia tailfrep
prob=tailfrep(20,x1,p1);prob = 0.04675292

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
0

3 10

. Acum EX = 1.5, En = - 0.5, deci ruina nu mai este


Xn
.6 .2 .1 .1
sigur. Repartiia lui L100 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.
0
225
450
450
675
> tailfrep(20,x1,p1); prob = 0.135263

Max.
900

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) = limn n(u). Marginea lui Lundberg este (u) 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) e-20u = e-1.7102 = 0.1808296
Marginea Lundberg este una pesimista.

95

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 (Xn)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 (Xn)n .
Atunci suma pe care trebuie s o aib la dispoziie managerul va fi o variabil
aleatoare
SN = X1 + X2 + ...+ XN (dac N 1) sau SN = 0 (dac N = 0)
(6.3.1)
Asiguratorul i va alege un risc ( de exemplu = 5%, = 1% etc) i va
aloca portofoliului de tip F o suma n aa fel ca P(SN > ) 1 -
Ca s fie posibil acest lucru, va trebui s tie repartiia lui SN. De regul, acest
lucru este imposibil. O prim abordare ar fi s se foloseasc inegalitatea lui Cebev
P(SN ESN > k(SN)) < 1/k2
(6.3.2)
Sau, acelai lucru, dar pus n form afirmativ
P(ESN - k(SN) SN ESN + k(SN) >1 1/k2
(6.3.3)
9
pentru c exist formule pentru ESN i Var(SN) , numite formulele lui Wald
ESN = EX1EN, Var(SN) = Var(X1)EN + Var(N)E2X1
(6.3.4)
Exemplul 1. S spunem c Xn 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 EX1 = 10 = 5, Var(X1) = 10 (1 ) = 2.5, EN = 100, Var (N) = 100
Rspuns. ESN = 5100 = 500, Var(SN) = 2.5100 + 10052 = 2750 (SN) = 2750
52.44
Aplicnd (6.3.4) vedem c P(500 - k52.44 SN 500 + k52.44) >1 1/k2
Alegnd k = 10, avem P(SN 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 +(X).
S-a constatat empiric faptul c nu se greeete prea mult dac se ia Var+(X) = Var(X)/2
+ = / 2
Inegalitatea (3.3) devine
P( SN ESN + k(SN)/ 2 )>1 1/k2
(6.3.5)
n cazul exemplului de mai sus, ar rezulta P(SN 500 +370.8) > 0.99 P(SN 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 SN.
Uneori acest lucru este posibil. Dac acceptm c Xn au o repartiie discret,

Vezi, de exemplu Gheorghia Zbganu, Metode matematice n teoria riscului i actuariat, Editura
Universitii Bucureti, 2004

96

Xn

0
f 0

1 ... k
0

p0 p1 .... pk
1

f 1

f 2

2 ...
0 1
,
q0 q1 q2 ...

atunci

SN

...
i probabilitile f(n) se pot calcula.
...

ntr-adevr,
j

f(j) = P(SN = j) = PS n j q j
n 1

(6.3.6)

Pentru probabilitile PS n j 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 Xn.


Dificultatea n programare nu ar fi aa de mare; facem o matrice prj,i = P(Sj=
i)P(N = i) i calculm sumele de la (3.6)
Iat scriptul convarepN (convoluii aditive repetate de N ori) care calculeaz
probabilitile fj i funcia de repartiie F(j) = f0 + + fj
## 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 Xn 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. Xn Binom(10, ), N Uniform(0,1,...,40 EX = 5, Var(X)
= 2.5, EN = 20, Var(N) = 140, ESN = 520 = 100, Var(SN) = Var(X1)EN + Var(N)E2X1
= 2.520 + 14052 = 3550, aadar ESN = 100, (SN) 59.58. Formula (3.5) ne d P( SN
100 + k 42.13075)>1 1/k2 . Dac dorim un interval de predicie cu risc 1%
suntem forai s lum k = 10 i obinem predicia SN 521. Adic managerul de care

97

era vorba la nceput s aib pregtii 521 de lei pentru a avea doar riscul 1% ca suma
s fie insuficient.
Calculul exact reclam calculul cuantilei de 0.99 (sau, cum i se mai spune, valoarea la
risc, adic primul k cu proprietatea c F(k) 0.99
Instruciunea care face acest lucru este which(F<.99)i obinem 207 lei. ntradevr, F(207) = 0.990797, F(206) = 0.989250910. De altfel, marginea dat de
inegalitatea Cebev este absurd, cci SN nu ia dect 451 de valori.
Exist cazuri n care calculul repartiiei lui SN se poate face cu mult mai rapid,
i cu resurse mult mai puine, prin algoritmul lui Panjer.
0

...

se numete contor de tip


Definiie. Variabila aleatoare N
q0 q1 q2 ....

Panjer dac q0 > 0 i exist a,b n aa fel nct pn = pn-1 a b

Exist trei tipuri de contoare de tip Panjer

11

n 1
,b=
1
1

N Bin(n,) a =

N Poisson() a = 0, b =
N Negbin(n, ) a = 1 - , b = (1 - )(n-1)
0

p1 ...

Panjer a artat c dac Xn


p

...

k
atunci numerele fn = P(SN = n)
pk

satisfac recurena

f0 = g(p0), n 1 fn =

n
bj
1
a p j f n j
n
1 ap0 j 1

(6.3.7)

Aici g(x) = qn x n este funcia generatoare a contorului N.


n 0

Pe baza acestei recurene se poate face un algoritm de calcul rapid al


convoluiei Fn pe care l prezentm n scriptul convrap(x,p,N,epsilon).
2
...
k
1
0 1 ... k
p1
pk ,
i Yn = (Xn Xn > 0) p0
...

p0 p1 ... pk
1 p0
1 p0 1 p0

Ideea este c dac Xn


D

atunci X1 + ....+ Xn Y1 + ...+ YN unde N Binom(n,1 p0) este independent de (Xn).

12

n cuvinte, la adunare nu conteaz zerourile, iar numrul variabilelor aleatoare


Xk diferite de 0 este o variabil aleatoare N Binom(n, P(X1 > 0))= Binom(n, 1 p0).

10

Atragem atenia c F[k] nu calculeaz F(k), ci F(k-1), deoarece n R indicii vectorilor ncep cu 1,
nu cu 0 ca n alte medii de programare (de exemplu Basic).
11
Vezi de exemplu G. Zbganu, Metode Matematice n teoria riscului...., pg. 170
12
ntr-adevr, dac Y = (X X > 0), EetY = E(etX X > 0) = E(etX ; X > 0)/(1- p0) = (mX(t) p0) /(1- p0).
Fie S = X1 + ...+ Xn i T = Y1 + ...+ YN . Atunci, cum N este independent de X, EeT = gN(mY) = (p0 + (1
D

p0)mY)n = p0 mX p0 1 p0 = (mX)n = EeS . Adic S T.

1 p0

98

Deoarece gN(x) = (p0 + (1-p0)x)n , f0 = p0n , a =


recurena devine fk =

1 p0 n 1 iar
1 p0
,b=
p0
p0

k
1 k
( n 1) j
1
bj
a p Y j f k j =
1
p j fk j ,
1 ap Y 0 j 1
k
p0 j 1
k

deci

f0 = p0n, k 1 fk =

1 k
(n 1) j k p j f k j
kp0 j 1

(6.3.8)

Vom face un script care s calculeze fS i FS, 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 fk. Vom alege un i vom calcula fk pn la primul k
la care F(k) > 1 -
- 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 fj = f[j+1], pj:=p[j+1] i recurena devine

f[1] = g(p[1]), f[n+1] =


-

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

Totui, f i F trebuie iniializai ca vectori de o anumit lungime. Am ales


aceast lungime s fie egal cu nmax= ES + 15(S). Inegalitatea lui Cebiev
spune c P( S >nmax) < 1/52 = 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 Wald13 gsim
ES = EX EN, VarS = EN Var(X) + E2N Var(N)
(6.3.9)
Pe baza lor calculm dimensiunea lui f i F, anume nmax = ES + 15(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 f0, preferm s punem f[1] = 1
i s nmulim la sfrit cu
f0 = g(p0)
13

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

99

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)
Funcia furnizeaz o list a cu
a[[1]] = ES

100

(3.10)

a[[2]] = (S)
a[[3]]=n, unde n este primul n cu proprietatea c P(S n) > 1 -
a[[4]] = f, cu f[n] = P(S = n-1)
a[[5]] = F cu F[n] = P(S n 1)

Revenim acum la Exemplul 1: Xn 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 = .01 . Probabilitile pj se
calculeaz cu ajutorul funciei dbinom:
x=0:10; p=c(rep(0,11)); for (i in 1:11) {p[i]=dbinom(i1,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").

0.6
0.4
0.2
0.0

f/max(f)

0.8

1.0

Obinem graficul

100

200

300

400

500

x
Albastru: densitatea lui S, rosu: functia de repartitie

Fig 6.5

101

600

Se vede clar cum cele mai probabile valori sunt n jurul lui x=500. Dac am fi vrut s
ne asumm riscul de 0.1% n loc de 1%, atunci valoarea la risc ar fi fost 671. La riscul
de 0.01% valoarea ar fi fost VaR = 708 iar la = 10-6 ar fi fost 771 lei. Valoarea de
871 lei, gsit la riscul 1% cu inegalitatea lui Cebev ar fi suficient la un risc de =
10-10!!
> a=Panjer(x,p,"p",100,1/11,.0000000001);VaR_S=a[[3]];VaR_S
[1] 872

Exemplul 3. S zicem c Xn 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

0.6
0.4
0.0

0.2

f/max(f)

0.8

1.0

Dei media este aceai, acum abaterea medie ptratic este de trei ori mai mare ca
nainte: 166.58. Valoarea la risc e normal s fie mai mare: acum este 964 lei. Graficul
arat diferena

200

400

600

800

1000

x
Contor negativ binomial.Albastru: densitatea lui S, rosu: functia de repartitie

Fig 6.6

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


Putem acum compara algoritmul de convoluie convarep(n,x,p) (algoritmul de
x1
p1

bun sim) care calculeaz convoluia de n ori a repartiiei (x,p) =

102

x2

...

p2 ...

xk
cu
pk

algoritmul rapid convarap(x,p,N,) care calculeaz repartiia sumei S = Y1 + ...+ YN cu


N Bin(n, 1 P(Xn = 0) ), unde Yi = (Xi Xi > 0) pn valoarea la risc VaR1-(S)
( adic pn la primul n care are proprietatea c P(S > n) < .) 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 xi 0.
O a doua este c n nu poate fi prea mare i nici P(X = x1) nu poate fi prea mic
din urmtorul motiv: la iniializare, f0 = P(X = x1)n.
S lum cazul unui zar. x = (1,2,3,4,5,6), p = (1,1,1,1,1,1)/6. x1 = 1/6, deci P(S
= n) = 1/6n. Numerele n R sunt date n dubl precizie, adic sunt cuprinse ntre 1063
i 1063. Dac o s facem n = 1000, deja nu mai avem ncredere n f0, care devine 0.
irul (fn) 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")

103

0.008
0.006
0.004
0.000

0.002

f1

500

1000

1500

t1

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

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 lx este probabilitatea ca un individ nscut astzi s depeasc vrsta de x
ani, nmulit cu 100.000. Deci neaprat l0 = 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
ni este numrul total al populaiei cu vrst cuprins n intervalul [i,i+1) i di numrul
de decese ale populaiei cu vrste cuprinse ntre aceste limite.
De exemplu, n0 este numrul de copii cu vrste cuprinse ntre 0 i 1 an, calculat
la 1 ianuarie iar d0 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.

104

1994
barbati
total
decese

femei
total

decese

2008
barbati
total
decese

femei
total

decese
0
127308 3303
120921 2591
110665 1416
105025 1018
1
125979 282
119583 249
109056 93
103456 77
2
131763 197
125846 132
112199 65
105912 49
3
127804 158
122161 110
110315 52
104550 37
4
175284 192
167954 124
107839 34
101622 24
5
176293 255
170667 159
106203 40
100940 37
6
182212 179
173773 140
107077 42
100304 30
7
188160 118
181410 80
109577 46
104001 28
8
169580 95
163040 54
114464 35
108485 20
9
175287 103
167986 43
113859 30
108823 17
10
157988 91
151287 44
114695 31
108680 13
.....................................................................
...
80
29268
3576
48002
4847
40991
4087
65403
4968
81
28345
3743
46395
4975
35451
3848
58600
4947
82
24626
3490
40820
4789
31021
3585
52227
4992
83
20438
3179
33543
4396
26196
3498
45978
4981
84
17178
2930
28381
4250
21888
3082
39356
4833
85>
57985
13476
98009
21478
66841
13225
133181 25154

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 xp0. Normal ar trebui s punem xp0 =

total supravieuitori cu vrste x


total supravietuitori

dar acest lucru este imposibil, deoarece nu tim numrul supravieuitorilor: ar trebui
s tim vrsta decesului fiecrui individ....
Dac acceptm identificarea probabilitii cu frecvena, interpretm raportul p0
= d0/n0 cu probabilitatea P(T 1): probabilitatea ca un nou nscut s moar nainte de
a mplini un an. Atunci numrul q0 = 1 p0 este P(T > 1) , adic probabilitatea ca el s
supravieuiasc un an. Apoi, p1 = d1 / n1 este probabilitatea ca un supravieuitor de 1
an s moar n intervalul de timp (1,2] , adic nseamn P(T 2 T > 1). Deci q1 = 1
p1 nseamn probabilitatea ca un individ s supravieuiasc 2 ani tiind c el deja a
supravieuit 1 an, adic q1 = P(T > 2 T > 1) , adic avem q1 = P(T > 2)/P(T > 1)
P(T > 2) = q0q1. Din aproape n aproape gsim formula
P(T > x+1) = q1....qx
(6.4.1)
valabil pentru x numr natural. nmulim acest numr cu 100000 i obinem lx =
105qx, rotunjit la cel mai apropiat ntreg. Rezultatul este valabil, n cazul exemplului
nostru numai pn la x = 84, deoarece nu avem date mai multe.
105

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

106

1e+05
8e+04
6e+04
2e+04

4e+04

20

40

60

80

Index
tabel mortalitate pe sexe 1994-2008

Fig 6.8

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, FT(x) este de
forma

FT(x) = e 0 r y dy r x
x

FT ' x
FT x

(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+1p0 =xp0e(x)
de unde deducem expresia

rx = ln

lx
l
e rx x
l x 1
l x 1

(6.4.3)

0.10
0.05
0.00

ra1

0.15

n figura de mai jos prezentm riscurile de moarte la cele patru populaii: brbai
1994/2008 (curba neagr i cea roie) i femei 1994/2008 (curba albastr i verde)

20

40

60

Index
riscuri de moarte pe sexe, 1994 si 2008

107

80

Fig. 6.9
Figura sugereaz c ar fi acceptabil un model n care s se presupun c de la
85 de ani ncolo, riscul de moarte r crete liniar. Pe aceast ipotez este construit
scriptul tp0(t, tab) care calculeaz funcia de supravieuire tp0 pentru orice t
plecnd de la un table de mortalitate, tab. Din tabelul de mortalitate l reinem doar
deducem c
acele poziii x n care lx >10. Atunci , din formula (4.3)
t t 1
{t }
q
l[t ]1
dac t i tp0 = lqt- p

l[t ]

l
l
Am notat p 1 i q .
l 2
l1

tp0 = l[t]

dac t >

(6.4.4)

## 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 tp0 pentru orice numr pozitiv, nu neaprat
ntreg, este uor de calculat funcia de supravieuire la vrsta x, care se noteaz cu tpx
i se definete ca
tpx

= PT x t | T x

PT x t

P X x

xt p0
x p0

(6.4.5)

Scriptul este
## functia tpx (t,x,tabel de mortalitate) calculeaza probabilitatea
de ## supravietuire a unui individ de x ani in aceeasi ipoteza ca si
tp0

tpx<-function(x,t,tab)
{tpx=tp0(t+x,tab)/tp0(x,tab);tpx}

Variabila aleatoare cu repartiia (4.5) se noteaz cu Tx : timpul rezidual de


via la vrsta de x ani. Deci Tx = (T x T > x) . Media acestei variabile aleatoare

este notat cu ex. Aplicnd formula ETx = P Tx t dt t p x dt , pe care o aproximm


cu ex = t p x formm scriptul
x 0

## 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}

108

40
0

20

vid

60

n figura de mai jos este prezentat graficul funciei ex, respectnd culorile din
celelalte dou figure de mai sus: negru nseamn brbai 1994, rou nseamn
brbai 2008, albastru este femei 1994 iar verde este femei 2008

20

40

60

80

100

Index
speranta medie de viata la x ani

Fig 6.10

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 S0 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 Tx al decesului)
Ce sum s depun n aa fel nct probabilitatea ca suma s fie insuficient
s fie ?
Datele problemei sunt S0, x, n, i, . Formal, abordarea este urmtoarea: fie Tx
timpul rezidual de via al individului i = min(Tx, n). Dac suma depus este ,
atunci suma pe care o va avea el sau urmaii lui peste ani va fi S1 = (1 + i) .
Condiia pus este ca S1 > S0 i se cere cel mai mic cu proprietatea c P(S1 > S0)
1- .
Cum S1 > S0 1 i

S
ln 0
S0
S0
rezult c

ln(1+i) > ln
>

ln1 i

suma minim care trebuie depus, va avea valoarea


= S0(1 + i) y unde y este soluia ecuaiei P( > y) = 1 -

(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 a lui . n cazul nostru avem
P( > y) = 1- P(min(Tx , n) > y) = 1- P(Tx > y) = 1- , y < n ypx = 1 -
Deci y este cuantila F- 1 ()

109

##cuantilele lui tpx


cuant<-function(x,tab,p){p=1p;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 care trebuie depus n depozit pentru a garanta cu riscul


existena unei sume S0 la momentul = min(Tx, n) va fi
= S0/(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 S0 = 40.000 (asigurare de tip endowing adic
nzestrare) avem

110

PI=s0/1.1^cuant(5,tabmort(nrfm08,nrmm08),.01);PI = 2600.906

(la femei)
PI=s0/1.1^cuant(5,tabmort(nrbb08,nrbm08),.01);PI = 7456.137

(la brbai)
Dac doritorul de asigurare vrea s micoreze costul asigurrii i s pstreze
acelai risc ca suma s fie suficient, atunci ar trebui s se asocieze cu ali asigurai de
acelai tip, sau s apeleze la un asigurator.
Ideea (pe care o vom explica pe primul exemplu, al brbatului de 60 de ani)
este urmtoare : dac actualizm suma pe care o depune el ca la momentul min(n,TX)
s se obin suma S0 = 10.000 RON este o variabil aleatoare, anume X =
S0/ 1 i min(Tx ,n ) . Ar vrea s depun o sum, ct mai mic cu putin ca

P( 1 i min(Tx ,n ) < S0) , adic P (X > ) . Dac este singur, atunci va trebui s
aleag pe ca fiind cuantila de nivel 1 - a variabilei aleatoare X.
Dar dac se asociaz cu alii, n aceeai situaie i depun cu toii aceeai sum,
? S presupunem c s-a format o asociaie din N asemenea indivizi, dornici s
coopereze. S acceptm c timpii lor reziduali, notai cu Tj au toi aceeai repartiie ca
Tx. S mai presupunem c Tj sunt independeni i c toi indivizii notri fac un depozit
comun n care depun aceeai sum, . Fiecare i retrage bani de acolo atunci cnd
este nevoie. Acesta este numit n asigurri principiul solidaritii.
Fie Xj = S0/ 1 i min(T j ,n) . Variabilele aleatoare Xj vor fi de asemenea
independente. Probabilitatea ca depozitul s fie insuficient este P(X1 + + XN > N) .
Dac dorim ca aceast probabilitate s fie mai mic sau egal cu , va trebui s
alegem n aa fel nct n s fie cuantila la nivel 1 a repartiiei sumei SN = X1 +
+ XN , adic a convoluiei F N, unde F este repartiia lui Xj.
Este complicat de lucrat cu convoluiile, dac repartiia este continu. Dar se
poate aplica inegalitatea lui Cebev. S spunem c EXj = , (Xj) = . Aproximm
E(X-)+2 cu 2/2. Atunci putem aplica inegalitatea lui Cebev de la (3.5) sub forma
P( SN > ESN + k(SN)/

2 )< 1/k2, care n cazul nostru devine P( SN > N + k

N
)<
2

1/k2. Pentru un risc de = 4% , de exemplu, alegem k = 5 i avem P( SN > N +


5

N
N
)< .04 . Lum n aa fel nct N = + 5
, adic = +
2
2

5
2N

. Pentru

aceasta avem de calculat EX i (X).


min(T j ,n )
Dac scriem 1+i = e, atunci Xj = S0 e
, de unde EXj = S0Ln(), EXj2 =
S02Ln(2), unde
min(T j ,n )
Ln() = E e
(6.4.7)
este transformata Laplace a variabilei aleatoare min(Tj,n). Aceasta se poate calcula
foarte comod folosind formula de integrare prin pri

Eg(X) = g(0) + g ' t F X t dt

(6.4.8)

pentru funcia g(x) = e-min(x,n). Cum g(0) = 1 i g(x) = - e- x1(0,n)(x), formula de mai
sus devine
n

Ln() = 1 - e t F t dt , unde F este funcia de supravieuire a variabilei aleatoare Tx


0

(coada sa), care se noteaz cu

tpx

i se calculeaz cu ajutorul funciei

111

tpx(x,t,tab) cu care am fcut deja cunotin. n definitiv din (4.8) deducem


formulele
n

Ln() = 1 - e t t p x dt , EXj = S0Ln(), (Xj) = S0 Ln 2 Ln 2

(6.4.9)

Scriptul Laplace(x,n,,tab,nrint) calculeaz pe Ln() cu = ln(1+i) prin


metoda trapezelor, cu pasul diviziunii intervalului [0,n] egal cu n/nrint.
Amintim semnificaia parametrilor:
- x este vrsta asiguratului;
- = 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 = Xj = S0 e

min(T j ,n )

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

112

iar dac folosim tabela din 2008,


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

Marginea = +

, care garanteaz un risc de 4% de insuficien a

2N
6350

depozitului devine N = 5374+

Comparat cu valoarea exact, n cazul unei autoasigurri cu risc 4% care este


0 = 9238, ea devine deja mai mic dac numrul participanilor la asigurarea n grup
este mai mare ca 3. ntr-adevr, 2 = 9864, dar 3 =9040 < 9238, 4= 8549,.... ,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
5
ne d 0 = 9104, iar fomula N = +
ne d 3 = 8738 < 9104, 4 =8263,..., 100 =
2N
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 + (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
binomial
Cauchy
2
exponential
F
gamma
geometric
hipergeometric
log-normal
logistic

beta
binom
cauchy
chisQ
exp
f
gamma
geom
hyper
lnorm
logis

,
k,p
m,a
n

m,n
,
p
a, n, k14
,
, 15

14

Extragem k bile dintr-o urn cu a bile albe i n bile negre; X este numrul de bile albe.

15

Repartiia logistic are funcia de repartiie

1
1 e

113

. Este mai rar folosit..

negativ binomial
normal
Poisson
Student
uniform
Weibull
Wilcoxon

nbinom
norm
pois
t
unif
weibull
wilcox

k,p
,16

n
a,b
k,
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
x=rbinom(10,10,.4);x
[1] 3 5 1 5 4 6 4 5 6 3
# x este un vector cu 10
x=rnbinom(6,10,.4);x
[1] 19 8 9 25 8 19
# x este un vector cu 10
x=rhyper(10,4,6,6);x
[1] 3 2 3 3 2 2 2 2 1 3
# x este un vector cu 10

de componente repartizate N(10,42)


#componente repartizate Binomial(10,.4)
componente repartizate Negbin(10,.4)
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 (Tj)1jn 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 Xj
x1
p1

x2

....

p2

...

xk
, cu k = length(x).
pk

a b c d
.
Exemplu. S se simuleze un ir de 100 variabile aleatoare Xj
.1 .2 .3 .4

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

16

n codificarea R, x=rnorm(1,,) produce o variabila aleatoare X N(,2). Parametrul al doilea


reprezint abaterea medie ptratic i nu variana. Uneori se face confuzie.

114

[1]
"d"
[19]
"a"
[37]
"c"
[55]
"a"
[73]
"d"
[91]

"a" "b" "c" "d" "d" "a" "d" "d" "b" "a" "c" "a" "d" "b" "c" "d" "c"
"c" "d" "c" "d" "c" "c" "c" "b" "b" "d" "c" "d" "b" "c" "d" "c" "b"
"c" "d" "c" "a" "b" "b" "c" "a" "c" "b" "b" "a" "a" "b" "a" "c" "c"
"d" "d" "b" "d" "b" "c" "d" "d" "c" "d" "a" "d" "a" "d" "a" "c" "d"
"c" "b" "d" "d" "c" "c" "c" "c" "d" "c" "d" "a" "d" "a" "d" "b" "c"
"c" "d" "c" "a" "c" "d" "c" "b" "d" "b"

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 = (x1,,xk) din care scoatem, succesiv i fr
nlocuire, un numr de size bile. Dac parametrul size lipsete, se genereaz o
permutare aleatoare a lui x.
Exemple:
> x= c("a", "b", "c", "d");
nr=3;xsim=sample(x,nr,rep=FALSE); xsim
[1] "b" "c" "a"
xsim=sample(x,rep=FALSE); xsim
[1] "c" "b" "d" "a"
> xsim=sample.int(4,rep=FALSE); xsim
[1] 1 3 4 2

115

xsim=sample.int(4,2,rep=FALSE); xsim
[1] 3 1

Dac exist i parametrul p adic probabilitatea, atunci


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

genereaz un aranjament x(1),,x(size) n care probabilitile p se aplic succesiv. Mai


x1
p1

x2 ....
p2 ...

precis, dac X

xk
i size = d k, se genereaz un vector aleator V =
pk

(V1,,Vd) cu repartiia

P(V1 = x(1),V2= x(2),,Vd = x(d)) =


p 1
1
p1

Exemplu. X

p 2

p 3

1 p 1 1 p 1 p 2

2
p2

3
p3

......

p d
1 p 1 ... p d 1

p4

Dac d= 2, atunci V = (V1,V2) cu P(V1 = i,V2 = j) =

pi p j
1 pi

Dac d= 3, atunci V = (V1,V2,V3) cu P(V1 = i1,V2 = i2,V3 = i3) =

pi1 pi2 pi3

1 pi 1 pi
1

pi2

etc.

1 2 3 4
. Dac d= 2 avem 12 de aranjamente, cu
Un caz particular: X
.1 .2 .3 .4

urmtoarele probabiliti
12
2/90

13
3/90

14
4/90

21
2/80

23
6/80

24
8/80

31
3/70

32
6/70

34
12/70

41
4/60

42
8/60

43
12/60

0.0222

0.0333

0.044

0.025

0.75

0.1

0.042

0.0857

0.1714

0.0667

0.1333

0.2

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

116

(6.5.1)

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) p, F(x) 0

(6.5.2)

Metoda: gsim dou valori y1 i y2 cu proprietatea c F(x1) < p, F(x2) > p ,


destul de apropiate i aproximm funcia F cu o funcie de gradul I care trece prin
(x1,F(x1)) i (x2,F(x2)). Un algoritm simplu i eficient dac diferena dintre x1 i x2 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


c

1
, x 0. Cuantila se poate calcula i analitic, de data aceasta:
1 ax b

de F(x) =

b
1 p c 1
F(x) = p F(x) = 1 p x =
. Dup cum se vede n scriptul de mai
a

jos, dac se ia un pas de .01 pentru x, atunci valoarea exact x2 dat de formula de
mai sus coincide cu valoarea aproximativ, x1, dat de funcia cuantdec:
fz<-function(x,a,b,c) {y=1/(1+a*x^b)^c;y}
a=1;b=2;c=3
x=seq(0,10,by=.01);y=fz(x,a,b,c);p=.9
x1=cuantdec(x,y,p)
x2=(((1-p)^(-1/c)-1)/a)^(1/b)
x1 1.074484
x2 1.074446

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.

117

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 +k x1 + ... +xk = S. Este mulimea
vectorilor de probabilitate n dimensionali, care se mai numesc i portofolii.
Motivul este urmtorul: la burs exist mai multe active financiare (A1,...,Ak)
mprite n aciuni. Dup cum se tie, preul aciunilor este aleator.
S presupunem c dac se investete 1 leu n activul Aj rentabilitatea este o
sum de bani Rj. Mai precis: dac un juctor la burs cumpr aciuni de 1 leu din
activul Aj la momentul t0 , i vrea s le vnd la momentul t1, el nu le va vinde tot cu
1 leu, ci cu o sum Xj, depinznd de cotaia de pe piaa financiar a activului Aj .
Diferena Rj = Xj 1 se numete rentabilitatea operaiunii financiare. Sigur c ea
depinde de momentele t0 i t1. Din definiie, variabilele aleatoare Rjsunt ntotdeauna
mai mari sau egale cu 1.
Dac n loc s cumpere aciuni n valoare de 1 leu dintr-un singur activ
financiar Aj juctorul de burs cumpr de x1 lei aciuni din activul A1, de x2 lei
aciuni din activul A2,.... atunci rentabilitatea operaiunii va fi R(x) = x1R1 + x2R2
+.....+ xkRk . Putem ntotdeauna s considerm suma S = x1 + ...+ xk 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 =
(x1,...,xk) k,S al banilor alocai fiecrui activ i din vectorul rentabilitilor R =
(R1,...,Rk). Valoarea portofoliului este R(x) = x1R1 + x2R2 +.....+ xkRk, media ER(x) se
numete randamentul portofoliului iar variana Var(R(x)) este riscul portofoliului.
Fie j = ERj i ci,j = Cov(Ri,Rj) = EXiXj - ij. Atunci
ER(x) = x11 + x22 +.....+ xkk := x, Var(R(x)) = ci , j xi x j = xCx

(6.5.3)

i, j

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.

118

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 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 I x k,S . Atunci problema capt
un sens precis

S se gseasc x 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, x'Cx 2), Cum funcia generatoare de momente a unei
2

repartiii N(, ) este m(t) = e


problema (6.5.4) devine

t 22
2

S se gseasc x k,S astfel ca - e

avem c Eu(xR) = - e
rx '

r 2 x 'Cx
2

= max

x'

rx '

r
x' Cx
2

r 2 x 'Cx
2

. Aadar

= max (6.5.5)

Continum exemplul n care S= 100. Fie = (0, .1, .2, .2,.3) i C = AA, unde
alegem A o matrice aleatoare 55.
> a=floor(10*(runif(25)-.5));dim(a)=c(5,5);C=a%*%t(a);
C=C/10;C
[,1] [,2] [,3] [,4] [,5]
[1,] 3.9 0.2 -2.4 0.6 -1.8
17

Vezi, de exemplu Gheorghia Zbganu, Metode matematice n teoria riscului i actuariat, Editura
Universitii Bucureti, 2004

119

[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(Ri) 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 R4 . Activul R5 are i randament acceptabil i risc
acceptabil: ar trebui luat n calcul dac exist aversiune la risc.
r=0;xoptim=portopt(S,r,mu,C,N);xoptim
x = 70.61 26.60 0.66 1.17 0.96

120

Dac fceam calculul exact, ne ateptam ca toi cei 100 de lei s fie investii n A1 i
A2. Algoritmul Monte Carlo nea spus s punem 70.61 + 26.60 = 97.21 lei
n A1 i A2.
S lum acum un coeficient moderat de risc,
r=.1; xoptim =portopt(S,r,mu,C,N); xoptim
xoptim = 31.07 0.38 44.04 24.46 0.06

Deja se vede cum activul A2 este evitat: are acelai randament ca A1 dar este mai
riscant.
Mai experimentm
r=1
r=100

xoptim = 22.08
xoptim = 27.31

0.58 42.83 33.69


0.10 42.38 28.99

Dac r este mare, atunci maximul funciei

x'

r
x' Cx
2

0.82
1.21

se atinge cam n acelai

punct n care xCx este minim. Minimul lui xCx (1652.5)se atinge n
x = 24.8

41.82 33.39

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, x'Cx ). 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) = ( x 100)


atunci nu am mai fi putut aplica metoda de mai sus fiindc nu exist formule analitice
cu care s putem calcula E ( X 100) dac X N(,2). Atunci ar fi trebuit s
nlocuim media cu media aritmetic a unui eantion de un anumit volum dintr-o
populaie repartizat X N(,2). Se poate simula uor n R. Dar dac vrem s
simulm un vector nd 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(nd,0,1) este un vector cu nd componente independente repartizate
N(0,1).

121

## 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 xo nd,S
n aa fel nct E (x o 'R 10nd ) s fie maxim, va trebui s simulm un numr de N
valori ale vectorului rentabilitilor, R i un numr de NX valori de portofolii uniform
repartizate din care s l alegem cel pentru care media empiric este maxim.

122

Capitolul 7
Aplicaii rezolvate prin funcii predefinite n R
7.1 Teste statistice
Reamintim c orice presupunere privind repartiia necunoscut a unei variabile
aleatoare poart numele de ipotez statistic, iar metodele de verificare a ipotezelor
statistice poart numele de teste statistice.
Ipoteza care se verific se numete ipoteza nul (notat de obicei cu H0) i
orice alt ipotez admisibil se numete ipotez alternativ (notat de obicei cu Ha).
Verificarea ipotezei nule se face pe baza unei selecii (eantion) de volum n,
x1,..., xn, dintr-o populaie statistic.
Testele statistice, dup scopul lor, se pot clasifica n:
- teste de comparare a unor parametri ai populaiei, ce verific ipoteze precum
compararea mediilor a dou populaii, compararea mediilor mai multor populaii,
compararea dispersiilor, etc;
- teste de omogenitate sau de independen care verific ipoteze de tipul
dependenei sau independenei unor factori de clasificare;
- testele de concordan, care verific dac distribuia seleciei este conforma cu o
anumit distribuie teoretic aa cum ar fi distribuia normal.
Testele de comparare se mpart la rndul lor n dou categorii fundamentale:
- teste parametrice, pentru care se presupune c populaiile din care provin
eantioanele au distribuii cunoscute cu cel puin un parametru necunoscut;
- teste neparametrice, pentru care nu se face nicio presupunere despre distribuiile
populaiilor din care provin eantioanele.
Testele parametrice (fie un parametru al distribuiei populaiei) pot fi [7]:
- teste unilaterale (direcionale) n care H0: = 0 i H1: < 0 sau > 0.
- teste bilaterale (nedirecionale) n care H0: = 0 i H1: 0;
La testele parametrice, dac valoarea parametrului care apare n ipoteza
alternativ este unic, atunci ea se numete ipotez simpl, altfel se numete ipotez
compus.
Zona de acceptare a unei ipoteze, numit i interval de ncredere, este un
interval n care se accept, printr-un test statistic, ipoteza nul, creia i se asociaz
probabilitatea 1-. Zona de respingere este intervalul dintr-o distribuie de selecie a
unei statistici considerate, n care se respinge ipoteza nul, creia i se asociaz o
probabilitate . Probabilitatea este numit prag de semnificaie a testului.
Se pot produce erori de acceptare sau de respingere pe nedrept a unei ipoteze,
numite erori de prim spet sau erori de tipul I i de-a doua spe sau erori de tipul II.
Eroarea de tipul I este eroarea n care se respinge pe ipoteza nul cnd n realitate ea
este adevrat, probabilitatea asociat fiind . Valoarea se alege de obicei ca avnd
valoarea 0,05. Eroarea de tipul II este cea n care se accept ipoteza nul atunci cnd
ea este de fapt fals, probabilitatea asociat fiind . Regiunea critic (de respingere) a
testului reprezint valorile numerice ale testului statistic pentru care ipoteza nul va fi
respins. Nivelul de ncredere al unui test este 1, iar puterea testului este 1.
123

Un test statistic, n general, parcurge urmtorii pai [7]:


1. Se formulaz ipotezele statistice: o ipotez nul H0 i o ipotez alternativ H1.
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) X1, X2, ..., Xn 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
H0: m = m0,
iar ipoteza alternativ
Ha: m m0.
Statistica Z se calculeaz dup formula
x m0
,
Z
/ n
unde x reprezint media de selecie a eantionului:

1 n
Xi
n i 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:

124

H0
m = m0

Ha
m m0

Regiunea de respingere
|z| z

m = m0

m > m0

z z1

m = m0

m < m0

z z1

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

125

care calculeaz valoarea teoretic a statisticii t cu pragul de semnificaie al testului p.


n cazul nostru:
> qnorm(0.975)
[1] 1.959964

#Z_(1-alpha/2)

Valoarea calculat a statisticii Z este egal cu 0.6676 i n valoare absolut este mai
mic dect valoarea teoretic 1.959964 pentru = 0.05. Aadar, se accept ipoteza
nul a testului i astfel se decide c media eantionului este similar cu media ntregii
populaii.
Alternativ, se poate folosi p-valoarea calculat. p-valoarea unui test statistic
este cea mai mic valoare a nivelului de semnificaie pentru care informaia extras
din eantion este semnificativ (H0 adevrat se respinge). Cu un prag de semnificaie
al testului de 5%, se poate aplica regula: dac valorea p este mai mare dect 0.05
atunci se accept ipoteza nul H0, iar dac este mai mic dect 0.05 atunci se respinge
ipoteza nul H0 n favoarea ipotezei alternative H1. n cazul nostru, p-valoarea este
0.5044 > 0.05 i deci se accept ipoteza nul H0.
7.1.1.2 Testul t pentru un singur eantion

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 X1, X2, ..., Xn de variabile aleatoare independente i
identic repartizate, de repartiie N (m, 2), cu ns necunoscut.
Ipoteza nul este
H0: m = m0,
iar ipoteza alternativ
Ha: m m0.
Dispersia populaiei din care provine selecia poate fi estimat prin estimatorul
2
n
deplasat S2 = 1 i 1 ( xi x ) sau prin estimatorul nedeplasat s2 = 1

n 1

unde x reprezint media de selecie a eantionului, x 1


n

n
x
i 1 i

n
(x
i 1 i

x) ,

Dac volumul seleciei este mare (n30) atunci s S 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:
x m0
t
s/ n
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)

126

unde
- x = vectorul valorilor din primul eantion
- y = al doilea vector (opional) de valori folosit pentru teste cu dou eantioane
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral)
- mu = media teoretic populaiei
- paired = indicator logic pentru un t-test pereche
- var.equal = variabil logic ce indic dac cele dou variane sunt egale sau nu
- conf.level = intervalul de ncredere
Considernd din nou aplicaia de la testul anterior, de data aceasta cu dispersie
necunoscut, nti s calculm statisticele clasice:
> mean(x) #media datelor din vectorul x
[1] 71.2
> sd(x)
#deviatia stantard a datelor din vect. x
[1] 15.34637

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 H0, iar dac este mai mic dect 0.05 atunci respingem
ipoteza nul H0 n favoarea ipotezei alternative H1. n cazul nostru, p-valoarea este
0.4537 > 0.05 i deci se accept ipoteza H0.

127

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) = C nk p k q n k
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:
xp
~ N(0,1)
Z=
pq / n
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.

128

7.1.1.4 Testul 2

Unul dintre cele mai importante teste statistice pentru cea mai bun potrivire a
modelului n cazul unei variabile nominale cu dou sau mai multe valori. Ipoteza nul
n acest test este aceea c numrul observaiilor n fiecare categorie este egal cu cel
prezis de teorie, iar ipoteza alternativ este aceea c numrul observat este diferit de
cel ateptat. Statistica testului se calculeaz n felul urmtor: se ia numrul observat
(ni) , se scade numrul ateptat ( n'i ) i se ridic diferena la ptrat. Cu ct deviatia fa
de ipoteza nul este mai mare, cu att mai mare ne ateptm ca diferena dintre
numrul observat i cel ateptat. Prin ridicarea la ptrat, toate aceste diferene devin
pozitive. Apoi, fiecare dintre aceste diferene se mparte la numrul ateptat i aceste
diferente standardizate:
( ni n ' i ) 2
n 'i
i 1
k

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 pi = n'i / ni nu sunt apropiate de 0
sau 1, iar produsele n'i ni pi , unde pi f ( xi ) , 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
(ni n'i ) 2
trebuie s fie
n 'i
i 1
k

concordan, atunci statistica 2 definit n relaia 2


mai mic i nu va depi o valoare determinat

(2s 1) k ;

corespunztoare

numrului gradelor de libertate (s1)k i pragului de semnificaie dat. Regiunea


2
2
critic a testului va fi dat de inegalitatea ( s 1) k ; i deci, dac

2 (2s 1) k ;

acceptm ipoteza H0, 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

129

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.

130

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 (x1, ..., xn) i (y1, ..., ym), n>30, m>30, cu
mediile m1, respectiv m2 i c diferena dintre cele dou este distribuit normal,
ipotezele statistice sunt urmtoarele:
H0: m1=m2
Ha: m1m2
Statistica testului care se calculeaz este urmtoarea:
xy
t=
n
m
( x x ) 2 j 1 ( yi y ) 2
1 1 i 1 i

nm2
n m
Aceasta este repartizat Student cu n+m-2 grade de libertate.
Regiunea critic este dat de:
|t| > t / 2, n m 2
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)

131

unde
- x = vectorul valorilor din primul eantion
- y = al doilea vector (opional) de valori din al doilea eantion
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided

(bilateral)
mu = media teoretic populaiei
paired = indicator logic pentru un t-test pereche
var.equal = variabil logic ce indic dac cele dou variane sunt egale sau nu

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

132

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)

133

sau
wilcox.test(formula, data, subset, na.action)

unde
- x = vectorul valorilor din primul eantion
- y = al doilea vector (opional) de valori folosit pentru teste cu dou eantioane
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral)
- mu = media teoretic populaiei cu valoarea implicit 0
- paired = indicator logic pentru un test pereche, implicit cu valoarea FALSE
- exact = indicator logic ce specific dac ar trebui calculat o p-valoare exact
- correct = indicator logic ce specific dac ar trebui aplicat corecie de
continuitate la aproximarea normal a valorii lui p
- conf.int = indicator logic ce specific dac ar trebui clculat un interval de
ncredere
- conf.level = intervalul de ncredere
- formula = este o formul de forma membrul_stng ~ membrul_drept, unde
membrul_stng este o variabil numeric ce d valorile, iar membrul_drept este
un factor cu dou nivele dndu-se corespunztoare celor dou grupuri
- data = o matrice opional sau data frame ce conine variabilele din formula
formula, implicit acestea fiind luate din environment;
- na.action = o funcie care indic ce ar trebui s se ntmple n cazul n care
datele conin valori NA.
Aplicaie: S considerm o companie care produce baterii, printre care i
baterii scumpe. ns se dorete modificarea necostisitoare a celor scumpe astfel nct
s se ajung la creterea duratei de via. Ipotezele statistice ar fi urmtoarele:
H0: durata de via a bateriilor modificate este aceeai cu cea a celor scumpe
Ha: durata de via a bateriilor modificate este mai mare cu cea a celor scumpe
Presupunem c avem la dispoziie un eantion de 6 baterii scumpe i un eantion de 5
baterii modificate. Cele 11 sunt construite n condiii identice i independent. Datele
disponibile se refer la durata de via a bateriilor considerate i sunt urmtoarele:
X = (48, 53, 74, 111, 113, 335) i Y = (62, 101, 167, 174, 190).
Urmtoarea secven de cod R aplic testul Wilcoxon pentru exemplul
considerat:
> x=c(48,53,74,111,113,335)
> y=c(62,101,167,174,190)
> wilcox.test(x,y)
Wilcoxon rank sum test
data: x and y
W = 10, p-value = 0.4286
alternative hypothesis: true location shift is not
equal to 0

Cum p-valoarea este 0.4286 > 0.05 rezult c diferena este nesemnificativ
statistic ntre cele dou eantioane.

134

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:
(x1,..., xn) i (y1,..., yn). n acest caz, statistica testului este urmtoarea:
t=

xy
,
d

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=

n
( x yi ) 2 1
i 1 i
n

2
n

(
x

y
)
i
i 1 i

n 1
Dup calcularea lui t dependent va trebui sa comparm valoarea obinut cu valoarea t
teoretic.
Aplicaie: Un cercettor dorete s studieze influena metodelor de relaxare
asupra reducerii conduitelor agresive la adolesceni. O grupa de 12 subieci cu
tulburri comportamentale este testat iniial n ce privete nivelul agresivitii. Dup
acest moment, cei 12 adolescenti sunt nvati s practice relaxarea i urmeaz sedine
de relaxare de cte 1 or de 5 ori pe sptmn. Dupa o perioada de 2 luni, subiecii
sunt retestai utiliznd aceeai prob pentru a observa dac nivelul lor de agresivitate a
sczut n urma practicrii metodelor de relaxare. Datele obinute de cei 12 adolesceni
la chestionarul de agresivitate pe parcursul celor dou testri sunt urmtoarele:
nainte = (21, 18, 15, 11, 24, 23, 17, 19, 19, 17, 20, 15)
dup = (15, 13, 16, 13, 13, 12, 11, 10, 15, 17, 14, 16)
Secvena de instruciuni R ce rezolv exemplul considerat este urmtoarea
> inainte = c(21,18,15,11,24,23,17,19,19,17,20,15)
> dupa = c(15,13,16,13,13,12,11,10,15,17,14,16)
> t.test(inainte, dupa, paired=TRUE)
Paired t-test
data: pre_test and post_test
t = 3.3726, df = 11, p-value = 0.006223
alternative hypothesis: true difference in means is
not equal to 0
95 percent confidence interval:
1.56327 7.43673
sample estimates:
mean of the differences
4.5

p-valoarea este 0.006223 i nefiind chiar nul rezult c se accept ipoteza nul.
Acelai lucru se poate determina i comparnd valoarea testului cu valoarea quantilei
distribuiei t care se poate afla n R astfel

135

> qt(0.975,11)
[1] 2.200985

Se observ c valoarea obinut 3.3726 este mai mare dect valoarea teoretic
2.200985 i deci mediile celor dou eantioane pereche sunt semnificativ diferite
statistic.
7.1.2.4 Testul F pentru dou eantioane independente

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 X1 respectiv X2;
-

variabilele sunt repartizate normal, X1 ~ N(m1, 12 ) i X2 ~ N(m2, 22 );


dou eantioane, unul din fiecare populaie: (x1,...., x n ), respectiv (y1,...., y n ).
1

Ipotezele testului pot fi de tip att de tip lateral ct i de tip bilateral.


Testul bilateral:
H0: 12 / 22 = 1
Ha: 12 / 22 1
Testul unilateral:

(egalitatea dispersiilor celor dou populaii)

H0: 12 / 22 = 1
Ha: 12 / 22 < 1 sau 12 / 22 > 1
Cnd ipoteza nul este adevrat, statistica
S2
F* = 1 ,
S 22
este repartizat Snedecor F , n1 1, n 2 1 pentru un prag de semnificaie , unde
n

S12

1
1

( xi x ) 2 estimaie nedeplasat pentru 12

n1 1 i 1

S 22

1
1

( yi y ) 2 estimaie nedeplasat pentru 22

n2 1 i 1

1 1
xi media de selecie a primului eantion
n1 i 1
n

1 1
yi media de selecie a celui de-al doilea eantion
n2 i 1
Repartiia F (Snedecor) cu 1, respectiv 2 grade de libertate are funcia de
densitate de forma:
y

136

2

1
1 1
1 2
1

2
x
2

x 2 1

, x0
f(x) =

2
1 2
2


2 2
Decizia, la pragul de semnificaie , pentru testul bilateral este urmtoarea: se
respinge ipoteza nul H0 n favoarea ipotezei alternative Ha dac:
1 / 2

F* > F1 / 2, n1 1, n 2 1 sau F* < F / 2, n1 1, n 2 1


Decizia, la pragul de semnificaie , pentru testul unilateral este urmtoarea:
se respinge ipoteza nul H0 n favoarea ipotezei alternative Ha dac:
F* > F1 , n1 1, n 2 1
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

137

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 lognormal. Testul Kolmogorov-Smirnov pentru dou eantioane compar dac cele
dou eantioane de date provin din aceeai distribuie, dei nu se specific exact tipul
distribuiei.
Din studierea convergenei funciei empirice de repartiie Fn ctre funcia
teoretic de repartiie F, Kolmogorov a demonstrat urmtoarea teorem:


K ( ) (1) k e 2k 2 ,
lim P d n
n
n
k
unde .> 0 i d n max Fn ( x ) F ( x ) .
Funcia K este calculat n tabele pentru diverse valori ale lui (tabelul
distribuiei Kolmogorov).
Cu ajutorul acestei teoreme se poate da un criteriu de verificare a ipotezei H0 c
repartiia empiric urmeaz o anumit lege de repartiie.
Dac ipoteza H0 este adevrat, atunci diferenele Fn ( x) F ( x) nu vor depi o
anumit valoare d ;n pe care o fixm astfel nct: P (d n d ;n / H 0 ) , unde
este riscul de gradul nti. Dar P (d n d ;n ) 1 P (d n d ;n ) .

Lund d ;n , nseamn c atunci cnd H0 este adevrat i n suficient de


n

mare avem: P d n 1 P d n 1 K ( ) .
n
n

Unui prag de semnificaie dat i corespunde prin relaia K ( ) 1 o

valoare astfel nct, pentru un volum n dat al seleciei gsim valoarea d ;n .


n

138


Regiunea critic pentru ipoteza H0 este dat de relaia d n . Deci:
n

dac d n , exist concordan ntre Fn i F i se accept ipoteza H0


n

dac d n , nu exist concordan i respingem ipoteza H0.


n
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

H0: p=0.5

139

Acest ipotez implic faptul c dndu-se o pereche aleatoare de msurtori (xi, yi)i
atunci xi i yi au aceeai ans de a fi mai mari unul dect cellalt.
Variabilele celor dou eantioane trebuie s fie de tip numeric, iar valorile s
fie exprimate n aceeai unitate de msur, pentru a se putea face diferena lor.
n pachetul de programe BSDA exist funcia R predefinit
SIGN.test(x, y = NULL, md = 0, alternative = "two.sided",
conf.level = 0.95)

unde
- x = este un vector de valori din primul eantion (valori NA sau Inf se accept, ns
sunt ignorate)
- y = este (opional) un vector de valori din al doilea eantion (valori NA sau Inf se
accept, ns sunt ignorate)
- md = valoarea medianei populaiei specificat n ipoteza nul
alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral).
- conf.level = intervalul de ncredere
Exemplu: S considerm doi vector ce conin valori nainte de un eveniment i
dup acesta. Vom testa ipoteza nul c Nu exist diferene ntre cei doi vectori de
msurtori, cu ipoteza alternativ Exist diferene ntre cei doi vectori de
msurtori
> x=c(15,14,14,13,15,13,12,13)
> y=c(16,14,15,15,17,15,14,15)
> SIGN.test(x,y)
Dependent-samples Sign-Test
data: x and y
S = 0, p-value = 0.01563
alternative hypothesis: true median difference is
not equal to 0
95 percent confidence interval:
-2.000 -0.675

sample estimates:
median of x-y
-2
Lower Achieved CI
Interpolated CI
Upper Achieved CI

Conf.Level L.E.pt U.E.pt


0.9297
-2 -1.000
0.9500
-2 -0.675
0.9922
-2 0.000

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

140

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 E1,
Ek. Se noteaz cu nij frecvena observat a evenimentului Ej n selecia de ordin i
(numerele nij se numesc celule de frecven). Teoria statistic spune c dac
(ni.)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 pj = P(Ej) i acetia n
formula
s

k (n
ij

X =

i 1 j 1

ni p j ) 2
ni p j

cu

ni

nij , i = 1, 2,, s,
j 1

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 X2 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 pij probabilitatea ca un individ luat la ntmplare din populaia considerat
s aparin liniei j i coloanei j. Dac pi este probabilitatea ca un individ s aparin
liniei i i p j este probabilitatea ca un individ s aparin coloanei j, atunci ipoteza c
cele dou variabile sunt independente poate fi scris sub forma

H0: pij pi p j , i = 1, 2,, s i j = 1, 2,, k.


Dac avem o selecie de volum n i nij sunt frecvenele observate, atunci

X2=

i 1 j 1

(nij npi p j ) 2
ni pi p j

Deoarece pi i p j sunt necunoscute, conform metodei verosimilitii maxime,


acestea se pot estima cu ni / n , respectiv n j / n , unde
k

j 1

i 1

ni

nij , respectiv n j nij .

X2=

(nij ni n j / n) 2
n n /n
i j
i 1 j 1

Atunci varibila
s

141

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

142

> chisq.test(t2)
Pearsons Chi-squared test
data: t2
X-squared = 3.2328, df = 3, p-value = 0.3571

Din nou se observ din nou independena celor dou variabile considerate.
7.1.2.8 Testul de independen al lui Fisher

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 H0 c cele dou
variabile aleatoare sunt independente i c deci repartiiile unitilor n cele patru
rubrici ale tabelei vor fi urmtoarele
x1
n1n1

y1

n
n1n2
n
n1

y2

x2
n 2 n1
n
n 2 n 2
n
n 2

Total
n1
n1

Pentru a vedea dac ntre cele dou variabiel aleatoare exist sau nu o conexiune,
trebuie s calculm nu numai probabilitatea P(n11, n12, n21, n11 / n1 n 2 ), dar i
probabilitile de a se obine repartiii care fa de cea observat se ndeprteaz mai
mult de repartiia din cazul independenei.
Dac n11 < n1n1 / n , tabelele ce se ndeprteaz mai mult sunt acelea care au
prima celul egal respectiv cu (n11-1), (n11-2),, 1, 0 uniti.
Dac n11 > n1n1 / n , tabelele extreme sunt acelea care au n prima celul

respectiv (n11+1), (n11+2),, min{ n1 , n1 }.


Compararea sumelor
P(n11) =

P(n11) =

n11

p(i) , dac n11 < n1n1 / n

i 0
min{n1 , n1 }

p(i) , dac n11 > n1n1 / n

i n11

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)

143

unde
- x = este un tabel de contingen 22 sau un prim obiect factor;
- y = este (opional) un al doilea obiect factor sau ignorat dac x este matrice;
- workspace = un ntreg ce specific dimensiunea spaiului de lucru folosit n
algoritm, cu unitatea de msur de cte 4 bytes;
- hybrid = o valoare logic implicit FALSE, folosit pentru tabele mai mari de
22, caz n care indic probabilitile exacte (implicite) sau o aproximare hibrid ce ar
trebui calculat;
- control = o list coninnd componente predefinite pentru un control jos al
algoritmului; n prezent, singurul folosit este mult, un ntreg pozitiv 2 cu valoarea
implicit 30, folosit doar pentru tabele mai mari dect 22; acesta specific de cte ori
ar trebui alocat spaiu pentru ci, ct i pentru valori;
- or = raportul de diferene din ipotez (folosit doar pentru tabele 22);
- alternative = direcia ipotezei alternative, valoarea implicit fiind two.sided
(bilateral), dar mai poate fi i greater sau less se poate specific doar prima liter
din ir; valabil doar pentru tabele 22;
- conf.int = parametru logic ce indic dac se dorete determinarea unui interval
de ncredere intervalul de ncredere
- conf.level = nivelul de ncredere pentru intervalul de ncredere returnat folosit
doar petru tabele 22 dac conf.int=TRUE;
- simulate.p.value = o variabil logic ce specific dac p-valoarea se va
calcula prin simulare Monte Carlo folosit pentru tabele mai mari dect 22;
- B un ntreg ce specific numrul de duplicate folosit n testul Monte Carlo.
Pentru a ti dac ntre cele dou variabile aleatoare componente ale vectorului
aleator (X, Y) exist o legtur semnificativ, se poae emite ipoteza H0 c cele dou
variabile aleatoare sunt independente i deci c repartiiile unitilor n cele patru
rubrici ale tabelei vor fi urmtoarele:
y1

x1
n1n1 / n

x2
n 2 n1 / n

y2

n1n2 / n

n 2 n2 / n

n1

n 2

total
n1
n2

Pentru a vedea dac ntre cele dou variabile aleatoare exist sau nu o
conexiune, trebuie s calculm nu numai probabilitatea P(n11, n12, n21, n11 / n1 n 2 ),
dar i probabilitile de a se obine repartiii care fa de cea observat se ndeprteaz
mai mult de repartiia din cazul independenei.
Dac n11 < n1n1 / n , tabelele ce se ndeprteaz mai mult sunt acelea care au
prima celul egal respectiv cu (n11-1), (n11-2),, 1, 0 uniti.
Dac n11 > n1n1 / n , tabelele extreme sunt acelea care au n prima celul

respectiv (n11+1), (n11+2),, min{ n1 , n1 }.


Compararea sumelor
P(n11) =

n11

p(i) , dac n11 < n1n1 / n

i 0

144

P(n11) =

min{n1 , n1 }

p(i) , dac n11 > n1n1 / n

i n11

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 H0 de independen.
ntr-o asemenea comparaie trebuie s inem seama dac alternativa ipotezei
H0 este uni- sau bilateral. n primul caz vom compara pe
n !n !n !n !
P(n11, n12, n21, n22 | n1 , n 2 ) = 1 2 1 2
n!n11!n12 !n21!n22 !
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.

145

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:
H0 : m1 = m2 = = mk
Ha : 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
146

vedere, toate cele trei grupuri conin tineri: exist vreo diferen semnificativ ntre
cele trei medii? Cum testm, mai exact, acest lucru?
Nr.crt Localitate 1
22
1
27
2
32
3
30
4
29
5
27
6
33
7
24
8
24
9
30
10
x
27,8
s
3,65

Localitate 2
28
22
24
18
21
26
25
20
24
28
23,6
3,34

Localitate 3
20
28
31
26
26
30
21
25
29
27
26,3
3,59

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: n1=10, n2=10 i n3=10.
Pentru fiecare dintre cele trei localiti / grupuri putem calcula cte o medie i cte o
abatere standard; mai avem aadar: x1 = 27,8 cu s1 = 3,65, x 2 = 23,6 cu s2 = 3,34 i
x3 = 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:

s x2

1 k
(x j x )
k 1 j 1

Aceasta indic o estimare a erorii standard din populaie, de unde putem extrage
foarte simplu varian din populaie ES = / n .
Ne confruntm, deci, cu dou tipuri de variaii: o variaie ntre grupuri
(variaia mediilor de grup n jurul mediei generale) i una n interiorul grupurilor
(variaiile observaiilor n jurul fiecrei medii de grup). Ambele tipuri de variaii sunt
folosite ca estimri ale variaiei generale n populaie.
Analiza de varian se bazeaz pe compraia dintre dou estimri ale varianei
2 pentru ntreaga populaie. Logica analizei este urmtoarea: dac cele dou estimri
ale varianei din populaie 2 sunt aproximativ egale, atunci ipoteza nul este
adevrat (n populaie, toate mediile sunt egale). Dac ipoteza de nul nu este
adevrat, atunci cele dou estimri ale varianei vor fi semnificativ diferite.
> localit1 = c(22,27,32,30,29,27,33,24,24,30)
> localit2 = c(28,22,24,18,21,26,25,20,24,28)
> localit3 = c(20,28,31,26,26,30,21,25,29,27)
> localit = c(localit1,localit2,localit3)
> n=rep(10,3)
> v=rep(1:3,n)
> table(localit)
localit

147

18 20 21 22 24 25 26 27 28 29 30 31 32 33
1 2 2 2 4 2 3 3 3 2 3 1 1 1
>f=function(x) c(mean=mean(x),var=var(x),n=length(x))
> tapply(localitati,v,f)
$`1`
mean
var
n
27.80000 13.28889 10.00000
$`2`
mean
var
n
23.60000 11.15556 10.00000
$`3`
mean var
n
26.3 12.9 10.0
> date = data.frame(localit=localit,v=factor(v))
> model = lm(localit~v,date)
> anova(model)
Analysis of Variance Table
Response: localit
Df Sum Sq Mean Sq F value Pr(>F)
v
2
90.6 45.300 3.6391 0.03987 *
Residuals 27 336.1 12.448
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 .
0.1 1

Valoarea de 3,639 (mult mai mare dect 1) ne sugereaz c ipoteza nul este
pe cale de a fi respins, pentru c variaia explicat de diferenele dintre grupuri este
mult mai mare dect variaa datorat erorilor aleatoare; existnd diferene majore ntre
grupuri, vor exista cu siguran diferene ntre mediile acestora. Modalitatea
alternativ este de a compara p-valoarea cu pragul de semnificaie ales; cum pvaloarea este 0.03987 i este mai mic dect = 5% se respinge ipoteza nul: cel
puin una dintre strategii a dat rezultate.
Anova nu ne spune ns dect dac acceptm sau respingem ipoteza nul,
adic dac exist sau nu o medie diferit statistic de celelalte. n cazul acceptrii
ipotezei nule cu Anova, pentru a vedea unde este diferena, putem folosi un test al
diferenelor dintre medii i anume testul Tukey.
n pachetul standard de funcii R stats exist funcia predefinit Tukey.HSD,
cu prototipul:
TukeyHSD (x, which, ordered = FALSE, conf.level = 0.95, ...)

148

unde
- x = un obiect de potrivire a modelului, de obicei aov;
- which = vector de caractere ce specific lista de termeni din modelul de potrivire
pentru care ar trebui calculate intervalele;
- ordered = valoare logic ce specific dac nivelele factorului ar trebui ordonate
cresctor dup medie nainte de a calcula diferenele;
- conf.level = nivelul de ncredere
Aceasta determin o mulime de intervale de ncredere pentru diferenele dintre
mediile nivelelor unui factor. John Tukey a calculat intervale bazate pe valorile
mediilor grupurilor i nu pe baza diferenelor individuale.
n cazul nostru, o secven de cod R necesar pentru rezolvarea problemei este
urmtoarea:
>
>
>
>
>
>

l1 = c(22,27,32,30,29,27,33,24,24,30)
l2 = c(28,22,24,18,21,26,25,20,24,28)
l3 = c(20,28,31,26,26,30,21,25,29,27)
localitati = c(l1,l2,l3)
n = rep(10,3)
v = rep(1:3,n)

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

149

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 HKW =

k R2
12
i 3(n 1) , unde Ri reprezint suma
n(n 1) i 1 ni

rangurilor din eantionul i, ni reprezint numrul observaiilor eantionului i,


i=1,2,, k, iar n este volumul seleciei totale;
-

se compar HKW cu valoarea teoretic (21 )(k 1) i dac HKW (21 )(k 1)
atunci ipoteza nul se respinge, respectiv dac HKW < (21 )( k 1) atunci ipoteza
nul se accept.
n pachetul standard de funcii R stats exist funcia predefinit

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

150

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.

151

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

V1

Concentratia de CO intre 1/3/2008 01:00 - 31/5/2008 24:00

10

12

14

Time

Fig 7.1
Funciile din R pentru analiza seriilor de timp prevd c datele msurate s fie
convertite n obiecte de tip ts. Conversia se face prin comenzile ts(...) sau as.ts(...),
mai exact
ts(data = NA, start = 1, end = numeric(0), frequency = 1,
deltat = 1, ts.eps = getOption("ts.eps"), class = ,
name= )
as.ts(x, ...)

Dintre parametrii din funciile de mai sus data reprezint vectorul sau matricea cu
datele msurate, start este momentul de ncepere al observaiilor, frequency este
152

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


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 Davis19 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 ntrun 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
autori20, 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 m t s t unde m t
este tendina neperiodic iar s t este partea periodic. In anumite determinri ale
tendinei partea periodic este inclus n formula pentru m t 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.

153

i a stabili evoliile lor cele mai probabile. Pentru aceasta este ns nevoie de
considera un model stochastic potrivit.
a1. Identificarea tendinei i a componentei periodice
Valorile msurate ale seriei temporale pot fi privite ca valori ale unui ir de
variabile aleatoare X t tZ sau X t tN . Descompunerea n tendin plus componenta
periodic plus partea rezidual se poate scrie
(7.2.1)
X t m t s t Yt
In formula de mai sus m t este tendin iar s t este componenta periodic. Pentru
tendin se utilizeaz n general metoda celor mai mici ptrate. Se specific modelul
de exemplu m t a bt i se estimeaz a i b prin metoda celor mai mici ptrate.
Pentru specificarea modelului n R avem informaii n manualul de introducere n R
care vine cu kitul de instalare. Reproducem de acolo cteva specificaii (seria de date
y este modelata ca expresie de alte serii de date x, x1, x2, etc., linear, prin formule):
Notaia n R
y ~ x sau y~1+x
y ~ 0 + x sau y ~ -1 + x sau y ~ x - 1
log(y) ~ x1 + x2
y ~ 1+x+I(x^2)
y~1+x+I(sin(2*x))

Explicaii
y~a+bx
y~bx
log(y) ~a+b*x1+c*x2
y ~ a+b*x+c*x^2
y ~ a+b*x+c*sin(2*x)

In cadrul seriilor temporale n loc de y ~ x avem tendina ca funcie de timp, x~t, unde
t este timpul.
Determinarea parametrilor a, b, c, etc., se face prin comanda lm (linear model) ca mai
jos:
lm(formula, data, subset, weights, na.action,
method = "qr", model = TRUE, x = FALSE, y = FALSE, qr =
TRUE,singular.ok = TRUE, contrasts = NULL, offset, ...)

Dintre parametrii funciei lm doar formula (sub forma unui tabel ca mai sus)
este obligatoriu deoarece datele data sunt menionate n formul, iar ceilali
parametri au valori implicite).
Rezultatul funciei lm este o list cu elemente numite din care coefficients
conine coeficienii obinui n urma regeresiei liniare, residuals conine diferenele
ntre valorile actuale i cele obinute prin foemula de regresie. Celelalte componente
se pot afla prin help(lm) n consola R.
Secvena de mai jos produce un ir de valori care se modeleaz n dou feluri
i apoi se reprezint grafic datele iniiale i modelele:
x=1:20/5
y=rnorm(20)/5+2*x+0.2*sin(2*x)
m1=lm(y~1+x)
m2=lm(y~1+x+I(sin(2*x)))
y1=m1$coeff[1]+m1$coeff[2]*x
plot(x,y, main="Modelele y~1+x si y~1+x+I(sin(2*x))")
lines(x,y1, lwd=2, lty=3)
y2=m2$coeff[1]+m2$coeff[2]*x+m2$coeff[3]*sin(2*x)

154

lines(x,y2,lwd=3,lty=4)
grid(5,5)

Rezultatul este n figura urmtoare:

Modelele y~1+x si y~1+x+I(sin(2*x))

Fig 7.2
Coeficienii celor dau modele sunt:
> m1
Call:
lm(formula = y ~ 1 + x)
Coefficients:
(Intercept)
0.02623
> m2

x
2.01722

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

x
2.04058

I(sin(2 * x))
0.26963

Pe figur vedem c modelul y~1+x+I(sin(2*x))


graficul (x,y) fa de modelul y~1+x.

aproximeaz mai bine

Pentru modele neliniare putem utiliza funcia R numit nlm. Forma funciei
este:
nlm(f, p, ..., hessian = FALSE, typsize = rep(1,
length(p)),
fscale = 1, print.level = 0, ndigit = 12, gradtol =
1e-6,
stepmax = max(1000 * sqrt(sum((p/typsize)^2)), 1000),
steptol = 1e-6, iterlim = 100, check.analyticals =
TRUE)

155

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 y ~ p1 p 2 x p 3 e p 4 x unde parametrii
p1 , p 2 , p 3 , p 4 se vor determina prin metoda celor mai mici ptrate trebuie s utilizm

funcia f (p) y i p1 p 2 x p 3 e p 4 x

, adic

f(p)= sum((y-p[1]-p[2]*x-p[3]*exp(p[4]*x))^2)

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:

4
0

Estimare neliniara

Fig. 7.3
Rezultatul m3 al funciei nlm este o list unde m3$estimate este un vector cu
valorile parametrilor determinai de rutina nlm. Dac parametrul $code este 1 sau 2
nseamn c probabil parametrii p sunt corect estimai (s-a ajuns la concluzia aceasta
din motive diferite pentru $code=1 sau $code=2). Vedem mai jos acest rezultat:
> m3
$minimum
[1] 2.24936e-14

156

$estimate
[1] 4.7903681 6.2172098 0.7584119
$gradient
[1] -2.586661e-06 -2.085010e-06 -4.790367e-05
$code
[1] 2
$iterations
[1] 7

Dac n modelul liniar sau n cel neliniar sunt cuprinse funcii periodice atunci
se determin simultan i tendin i partea periodic.
O alt modalitate de identificare a tendinei este sub forma unei medieri
exponeniale:
Valorile tendinei seriei x t sunt calculate succesiv prin
m t x t 1 m t 1
(7.2.2)
cu (0,1) . Alegerea lui este subiectiv. Dac datele ncep cu x 1 atunci avem :
m t 1 x 1 1
t 1

t 2

x 2 ... 1 x t 1 x t .

In acest fel tendina este pstrat sub forma unui vector de valori m t 1 t T .
Estimarea dup timpul maxim de msurare, T, se face prin m T k m T ceea ce nu este
foarte convenabil. O estimare a tendinei n aa fel ca ea s poat fi extins ntr-un
mod mai rezonabil dup t=T se poate face prin procedura Holt care const n mediarea
exponenial a tendinei m t ct i a pantei Pt sub forma:
m1 x 1
P1

x n x 1 pentru un n, de exemplu n 2

n 1
m t x t 1 m t 1 Pt 1

(7.2.3)

Pt m t m t 1 1 Pt 1

Parametrii , sunt subiectiv alei n intervalul (0,1). Extrapolarea tendinei


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

m t x t s t L 1 m t 1 Pt 1
Pt m t m t 1 1 Pt 1
s t x t m t 1 s t L

157

(7.2.5)

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


x T k m T k * PT s T 1 h 1 mod L

(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 x t , m t numit level, Pt numit tendin i s t . 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 HoltWinters",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)

158

V1

Co masurat + CO prezis Holt-Winters

10

12

14

Time

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 x t se obine o nou serie y t cu y t x t 1 x t . O nou
difereniere conduce la seria z t cu z t y t 1 y t x t 2 2 x t 1 x t 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 y t x t 2 x t ). Dac notm B operatorul de ntrziere

BX t

X t 1 atunci seria obinut prin prima diferen la lag=1 este Y 1 BX , iar

la lag=2 este Y 1 B 2 X .
c(x[1],x[1]+cumsum(y)).

Dac y=diff(x) atunci x poate fi restaurat prin

Transformarea seriei ntr-o serie staionar (vezi mai jos) se poate ncerca i
printr-o transformare de tip Box-Cox:
x t 1
pour 0

yt
(7.2.7)
lnx pour 0
t

159

In pachetul TeachingDemos exist funcia vis.boxcox care permite


vizualizarea interactiv a graficului seriei temporale dup o transformare BoxCox. 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 X t tZ se numete temporal staionar slab (staionar de ordinul 2) dac
media X t EX t este constant (nu depinde de t) i funcia de autocovarian
X r, s EX r X r X s X s

(7.2.8)

depinde doar de diferena h=r-s. In cele ce urmeaz notm E(X) media v.a. X. Pentro
o serie temporal staionar notm X h EX t h X X t X , independent de
t. Avem:
X 0 var(X t ) 0
X h X h
| X h | X (0)
k

k 1, a 1 , a 2 ,..a k a i i ja j 0
i , j1

In general vom scrie h sau h n loc de X h dac nu este pericol de


confuzie asupra seriei temporale X. Numim funcia de autocorelaie funcia:
h
(7.2.9)
0
In general vom scrie h n loc de h Estimatori numerici pentru medie,
funcia de autocovarian i autocorelaie sunt:
X X 2 ...X n
(7.2.10)
Xn 1
n
1 n |h|
h X t |h| X n X t X n
(7.2.11)
n t 1

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

160

Estimatorii pentru medie i corelaie pot fi studiai doar n unele ipoteze asupra
seriei temporale X. Astfel introducem unele tipuri de serii temporale staionare :
Zgomotul alb este un tip de serie temporal Z t tZ n care fiecare v.a. este de

medie zero i varian 2 , iar covariana este


2 , h 0
Z h
0 , h 0
Variabilele aleatoare Z t nu sunt neaprat independente.

(7.2.13)

Seria temporal i.i.t. este la fel ca zgomotul alb dar toate variabilele Z t sunt
independente identic distribuite.
Modelul general linear este o serie temporal X t tZ n care X t

t j

Z t tZ este un zgomot alb i | j | . Se verific fapietul c n acest caz avem


j

X h 2 j h j .
j

Serii staionare MA(q) (medii mobile) sunt serii de forma X t Z t i Z t i

unde Z t tZ este un zgomot alb . Notm 0 1 . Avem EX t 0 i

i 1

2 q |h|
i i |h| , | h | q

(7.2.14)
X h Cov(X t h , X t )
i 0
0,
| h | q

Seriile staionare de tip MA(q) sunt singurele serii staionare care au


X h 0 pentru h>q.
Seria staionar autoregersiv AR(p) este o serie de tipul (n general cerem i
ca media s fie zero) X t 1 X t 1 2 X t 2 ... p X t p Z t unde Z t tZ este un

zgomot alb i Z t este independent de X t k , k>0. Dac polinomul

z 1 1 z 2 z 2 ... p z p are toate rdcinile mai mari ca 1 n modul (serie

cauzal) atunci X t Z t j Z t j cu
j1

|
j1

| . Inmulind relaia de definiie a

lui X t cu X t k gsim sistemul i lund mediile obinem pentru k=1,2,..p:


1 1 2 1 3 2 ... p p 1

2 11 2 3 1 ... p p 2

.....
p 1 p 1 2 p 2 3 p 3 ... p

161

(7.2.15)

care prin rezolvare ne d 1 , 2 ,... p . Avem de asemenea 0 1 . Pentru k>p avem


analog k 1 k 1 2 k 2 3 k 3 ... p k p . 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 X t
i X t k se consider componentele perpendiculare pe spaiul vectorial generat de
X t 1 , X t 2 ,...X t k 1 , fie ele X t ,0 respectiv X t ,k . Funcia de autocorelaie parial se
definete acum ca i k ,k Corr (X t , 0 , X t ,k ) . Deoarece proieciile depind doar de
produsele scalare reciproce (corelaii ntre X i , X j ) 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:
X t 1 X t 1 2 X t 2 ... p X t p 1 Z t 1 2 Z t 2 ... q Z t q Z t
unde Z t este un zgomot alb independent de X t k pentru k>0. Dac seria este cauzal

adic polinomul z 1 1 z 2 z 2 ... p z p are rdcinile mai mari ca 1 n modul


atunci

X t Zt jZt j

cu

j1

j1

| .

Dac

polinomul

z 1 1 z 2 z 2 ... q z q 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 , unde 2 este variana lui Z t .
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

(AN=asimptotic
Xt

t j

cu

In

particular

normal).

v
X n este AN(0, )
n
lucru se ntmpl dac

atunci

acest

| i Z t tZ este un zgomot alb.

162

ii. Dac X t

t j

cu

| , Z t tZ este un zgomot alb i n plus


2

| j | i

|
h
|
| j | , atunci X

h
j
j

2
j

2
.
est AN .
, 1 W

n
.

unde matricea W R mm are componentele


w i, j

k i k j k i k j 2i j 2 k

k 2i k k j 2 jk k i

(7.2.16)

k i k i 2i k k j k j 2 jk
k 1

(formula lui Bartlett).


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

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

163

AR. Dac funcia de autocorelaie parial dat de acf este nul pentru
intervale temporale k>p(sau cade n intervalul de ncredere cu ncrederea 95% n
jurul lui zero, tiprit pe grafic de funcia acf), atunci alegem modelul AR(p).
Putem simula n R serii temporale de tip ARIMA(p,d,q) prin funcia arima.sim
care are forma:
arima.sim(model, n, rand.gen = rnorm, innov = rand.gen(n, ...),
n.start = NA, start.innov = rand.gen(n.start, ...),...)

Doar parametrii model i n sunt obligatorii, ceilali avnd valori implicite. Mai
jos simulm o serie AR(2) i i tiprimACF i PACF. Scriptul este:
s1<-arima.sim(model=list(ar=c(-.3,-.4)), n=10000)
par(mfrow=c(1,2))
acf(s1)
acf(s1, type="partial")

Rezultatul este n figura urmtoare:

Partial ACF

0.6
0.2
-0.2

ACF

10

20

30

-0.4 -0.3 -0.2 -0.1 0.0

Series s1

1.0

Series s1

40

10

Lag

20

30

40

Lag

Fig. 7.5
Forma PACF sugereaz un model AR(2). Acum simulm un model MA(2) i
tiprim ACF+PACF:
s1<-arima.sim(model=list(ma=c(-.3,-.4)), n=10000)
par(mfrow=c(1,2))
acf(s1)
acf(s1, type="partial")

Rezultatul este:
Series s1

10

20

30

40

-0.1
-0.3 -0.2

Partial ACF

0.2
-0.2

ACF

0.6

0.0

1.0

Series s1

Lag

10

20
Lag

Fig. 7.6
Graficele sugereaz un model MA(2).

164

30

40

ARMA. Pentru modelele ARMA(p,q) un indiciu asupra valorilor potrivite


pentru p i q este funcia extins de autocorelaie21 (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.1

0.1

0.3

Series s1

Partial ACF

0.00 0.10 0.20 0.30

ACF

Series s1

10

30

Lag

10

30
Lag

Fig. 7.7

> eacf(s1)
AR/MA
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0xxxxxoooooo o o o
1xxxxooooooo o o o
2xxoxxoooooo o o o
3xxxoooooooo o o o
4xxxxooxoooo o o o
5xxxoxoxoooo o o o
6xxxoxxoxooo o o o
7xxoxxxxxoxo o o o
Pe graficele ACF i PACF seria nu pare AR sau MA. EACF sugereaz un
model ARMA(2,2), ARMA(1.4) sau MA(6). Dac se ruleaz exemplul din nou se
obine alt figur dat de eacf din cauz c simularea produce alte valori pentru serie.
O alt metod de determinare a parametrilor p i q este de a propune toate
valorile posibile pentru p i q n intervalele [0, pmax] respectiv [0, qmax] ca n cazul
21

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.

165

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 1 , 2 , ... p dac

1 , 2 , ... p se nlocuiesc cu estimrile lor 1 , 2 , ... p . Pentru modele ce conin i


parte medie mobil metoda este mult mai complicat.
Metoda celor mai mici ptrate const n a scrie:
Z t X t 1 X t 1 2 X t 2 .. p X t p 1 Z t 1 2 Z t 2 ... q Z t q (7.2.17)
i a minimiza:
S,

t p 1

(7.2.18)

considernd Z p , Z p 1 ,...Z p q 1 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 exemplu22, demonstraiile gsindu-se n cartea pentru
matematicieni23. 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 1 , 2 ,.. p , 1 ,.. q i 2 prin metoda verosimilitii maxime i
apoi se calculeaz criteriul AICC:
AICC 2 logL1 , 2 ,..p , 1 ,..q , 2 2p q 1 / n p q 2 (7.2.19)

In acest criteriu L 1 , 2 ,.. p , 1 ,..q , 2 este funcia de verosimilitate a crei expresie

L , , 2

2 n/2

r0 r1 ...rT 1 e

1
2

X j X j 2

j 1

r j1

(7.2.20)

depinde X 1 , X 2 ,...X T i r0 , r1 , rT 1 calculai prin algoritmul inovaiilor (vezi citrile de


la subsol). Criteriul const n a alege parametrii p i q care minimizeaz AICC.
Penalizarea 2p q 1 / n p q 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

166

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 X t 1 X t 1 ... p X t p , ar=coeficienii 1 ,... p
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
> m2

sigma^2 estimated as

1.029

Call:
ar(x = s2, order.max = 5, method = "ols", AIC = T)
Coefficients:
1
2
0.3905 -0.2092
Intercept: -0.0003215 (0.03208)
Order selected 2
> m3

sigma^2 estimated as

1.027

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

167

0.3901

-0.2089

Order selected 2

sigma^2 estimated as

1.026

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

2 a variabilelor Z t din modelul ARMA(p,q)


residuals: valorile Z t 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
sigma2: variana

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:

168

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


Coefficients:
ar1
ar2
0.4012 -0.2091
s.e. 0.0310
0.0295

ma1
-0.3021
0.0279

sigma^2 estimated as 0.9877:


aic = 28265.57

ma2
0.4996
0.0243

intercept
-0.0040
0.0147

log likelihood = -14127.79,

Se vede c practic au fost determinai corect coeficienii ar i ma. Coeficientul


intercept din lista de coeficienii este media variabilelor X t 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 .
De regul se fac teste pentru a verifica dac valorile reziduale Z t 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 n 1 . In R acest


lucru este cercetat prin funcia acf.

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

n n 1 2
, n n 12n 5 / 72
4

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

3. Testul LjungBox const n a calcula: Qh n n 2

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


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

169

5. Testul punctelor de ntoarcere. La momentul i avem un punct de ntoarcere


dac y i 1 y i y i 1 sau y i 1 y i y i 1 . Fie T numrul punctelor de
ntoarcere. Dac n este mare i valorile y i provin de la v.a. iid atunci T are o
2n 2 16n 29
repartiie aproximativ N
,

90
3
In R exist funcia tsdiag care tiprete rezidualii standardizai (la varian 1),
calculeaz funcia de autocorelaie a rezidualilor i calculez testul Box (sau Ljung
Box) pn la un h dat. Forma funciei este:
tsdiag(object, gof.lag, ...)

unde object este o serie temporal modelat n R (deci are rezidualii calculai), gof.lag
este numrul maxim de pai h (vezi testul 3 (LjungBox) pn la care se calculeaz
Q(h).
In scriptul urmtor se simuleaz o serie ARMA(2,2) creia i se determin
parametrii cu funcia arima i apoi cu funcia tsdiag se studiaz dac modelul este
valid.
s1<-arima.sim(model=list(ma=c(-.3,.5),
ar=c(0.4,-0.2)),
n=10000)
model1<-arima(s1,order=c(2,0,2),method="ML")
tsdiag(model1)

4
2
0
-4 -2

StandardizedResiduals

Obinem urmtoarele reprezentri grafice din tsdiag:

4000

6000

8000

10000

-0.02

0.00

0.02

2000

10

20

30

40

10

20

30

40

0.4

0.8

0.0

P-values

ACFof Residuals

Fig. 7.8
Se vede c acf este suficient de mic pentru putea fi considerat zero, iar testul
LjungBox indic faptul c n general pentru aproape toi h p-valoarea testului este

170

suficient de mare pentru a admite c rezidualii sunt iid. Acum dac cercetm modelul
determinat gsim:
> model1
Call:
arima(x = s1, order = c(2, 0, 2), method = "ML")
Coefficients:
ar1
ar2
0.3831 -0.1976
s.e. 0.0289
0.0288

ma1
-0.2773
0.0258

sigma^2 estimated as 1.018:


28562.93

ma2
0.5047
0.0239

intercept
0.0016
0.0152

log likelihood = -14276.47,

aic =

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 X t t 0,1,...T pentru valori t>T definim predicia X T h ca proiecia lui
X T h pe spaiul generat de X t t 0,1,...T . Aceast proiecie poate fi calculat innd

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

171

$pred
Time Series:
Start = 1001
End = 1050
Frequency = 1
[1] 0.30741965
[7] -0.05590263
[13] -0.05814027
[19] -0.05790182
[25] -0.05789656
[31] -0.05789666
[37] -0.05789666
[43] -0.05789666
[49] -0.05789666
$se
Time Series:
Start = 1001
End = 1050
Frequency = 1
[1] 0.9632667
[8] 1.0117388
[15] 1.0117514
[22] 1.0117514
[29] 1.0117514
[36] 1.0117514
[43] 1.0117514
[50] 1.0117514

-0.01205071
-0.06270560
-0.05800335
-0.05789466
-0.05789655
-0.05789666
-0.05789666
-0.05789666
-0.05789666

0.9663791
1.0117442
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514

-0.15271697
-0.06009920
-0.05785878
-0.05789444
-0.05789666
-0.05789666
-0.05789666
-0.05789666

1.0064598
1.0117491
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514

-0.10329277
-0.05718103
-0.05785189
-0.05789652
-0.05789669
-0.05789666
-0.05789666
-0.05789666

1.0089120
1.0117511
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514

-0.04444154
-0.05699457
-0.05789317
-0.05789728
-0.05789667
-0.05789666
-0.05789666
-0.05789666

1.0107742
1.0117512
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514

1.0116303
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514

-0.03973509
-0.05781187
-0.05790899
-0.05789691
-0.05789666
-0.05789666
-0.05789666
-0.05789666

1.0116409
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514
1.0117514

Obinem urmtorul grafic cu valorile seriei i valorile prezise:

0
-3

-2

-1

s1

Seria s1 de 1000 masuratori si predictia pentru 50 pasi

200

400

600

800

1000

Timpul

Fig. 7.9
Constatm c prediciile produse de model nu urmeaz variaiile seriei.
Aplicm aceeai tehnic de tratare pentru seria real de CO menionat la nceputul
seciunii de serii de timp obinem:
>co=read.table(file.choose())
>tsco<-ts(co, frequency=168)
> plot(tsco, main="CO intre 1 ian.2008 si 30. iun. 2008",
+xlab="Timpul in saptamani")

172

Graficul seriei este n figura urmtoare:

V1

10

15

CO intre 1 ian.2008 si 30. iun. 2008

20

40

60

80

Timpul in saptamani

Fig. 7.10
Facem graficul pentru ACF i PACF pentru a vedea ce model ar fi potrivit.
> acf(tsco)

0.0

0.2

0.4

ACF

0.6

0.8

V1

0.00

0.05

0.10

0.15

0.20

0.25

Lag

Fig. 7.11
Constatm c ACF nu se anuleaz deci nu poate fi un model MA
Calculm PACF:
> acf(tsco, type="partial")

Obinem:

0.6
0.4
0.2
-0.2 0.0

Partial ACF

0.8

Series tsco

0.00

0.05

0.10

0.15

0.20

Lag

Fig. 7.12
Figura sugereaz un model AR

173

0.25

Incercm i cu EACF:
> eacf(tsco, ar.max = 20, ma.max = 20)

Obinem:
AR/MA
0 1
0 x x
1 x x
2 x o
3 x o
4 x x
5 x x
6 x x
7 x x
8 x x
9 x x
10 x x
11 x x
12 x x
13 x x
14 x x
15 x x
16 x x
17 x x
18 x x
19 x o
20 x x
>

2
x
x
x
o
x
x
x
x
x
x
x
x
x
x
x
o
x
o
o
x
x

3
x
o
o
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x

4
x
x
x
x
x
o
x
x
x
x
x
x
o
o
x
x
x
x
o
o
x

5
x
x
x
x
x
o
o
o
o
x
x
x
x
x
x
o
x
o
o
x
x

6
x
x
x
o
o
o
o
o
o
x
x
x
x
x
x
x
x
x
x
o
o

7
x
x
x
o
x
o
o
x
x
x
x
x
x
x
x
x
x
x
x
o
o

8
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
o
x
o
o

9
x
x
x
x
o
x
x
o
o
o
o
o
x
x
x
x
x
x
x
x
o

10
x
x
o
o
o
o
o
x
o
o
o
o
o
o
x
x
o
x
o
x
x

11
x
x
x
x
o
o
o
o
o
o
o
o
o
x
x
x
o
o
o
o
x

12
x
x
o
o
o
x
o
x
o
x
x
x
o
o
o
x
x
o
o
o
o

13
x
x
x
o
o
o
o
o
o
o
o
x
o
o
o
x
x
x
x
x
x

14
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
x
x
x
x

15
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
o
x
x

16
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
x

17
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
x

18
x
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x

19
x
x
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

20
x
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
x
o
o

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)

-20 0

20

40

60

80

-0.05 0.10

ACF of Residuals
P-values

10

20

30

40

10

20

30

40

0.0 0.6

Standardized Residuals

Obinem:

Fig. 7.13

ACF arat c exist corelaii semnificative ntre reziduali pentru diferene mari de
timp. Mergem totui mai departe. Predicia dat de model arat astfel:

174

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

0.6
0.2

0.4

p1$pred

0.8

Predictii CO

79.2

79.4

79.6

79.8

80.0

Time

Fig. 7.14
Prediciile pentru CO nu mai urmresc variaiile constatate n modelul real. Se pare c
nu am gsit modelul potrivit de serie temporal.
In general aplicate la modele reale teoria nu se potrivete ntotdeauna cu realitatea. In
seciunea urmtoare prezentm o alt tehnic de analiz a seriilor de timp care s-a
dovedit mai bun pentru aceste date (CO).

175

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 lucrare25 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
s:E R.
Fie t, x fluxul lui (7.2.21) pentru o valoare fixat a lui t= . Fie

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


Atunci, conform unei teoreme a lui F. Takens26 n condiii generale pentru s i A i
pentru un m N suficient de mare, aplicaia
S : A Rm
(7.2.22)
S x s F ( m 1) x , s F m 2 x ,....s F 1 x , x
este o scufundare a lui A n R m .
Pe imaginea atractorului S ( A) R m avem
(7.2.23)
S n , x0 s n s n m 1 , s n m 2 ...s n 1 , s n
Dinamica lui F de pe atractorul A este exprimat pe imaginea sa S(A) prin
s n G s n s n 1
ca n figura urmtoare:

Fig. 7.15
O uoar modificare a lui (7.2.233) introducnd o anumit ntrziere
este d N * conduce la

s n s n m 1d , s n m 2 d ...s n d , s n

24

(7.2.24)

Eckmann, J.P., D. Ruelle, 1985. Ergodic theory of chaos and strange attractors, Rev. Mod. Phys. 57,
pp. 617-656
25
Rainer Hegger, Holger Kantz, and Thomas Schreiber, 1999. Practical implementation of nonlinear
time series methods: The TISEAN package, Chaos 9,.pp. 413-435.
26
H. D. I. Abarbanel, Reggie Brown, John J. Sidorowich, and Lev Sh. Tsimring, 1993. The
analysis of observed chaotic data in physical systems, Rev M Phys, 65, pp. 1331-1392.

176

Intrzierea optima sugerat de Fraser i Swinney pentru (7.2.24) este recomandat ca


fiind primul minim local al informaiei mutuale empirice:
p i , j d

(7.2.25)
H p i , j d ln
p p
i, j
i
j

Probabilitatile pi i p i, j d n (7.2.25) sunt obinute prin partiionarea datelor

s n 1nT

ntr-un numar de subintervale al valorilor datelor msurate: pi este


probabilitatea ca funcia s s ia valori n subintervalul i iar p i , j ( d ) 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 s j este cel mai apropiat vecin al lui si n R m atunci si 1 G si i s j 1 G s j
sunt de asemenea apropiai i raportul Ri || s i 1 s j 1 || / || s i s j || este mai mic
dect un prag euristic Rt. In caz contrar punctul s j 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

s n k

1
s jk
card (U n ) s j U n

(7.2.26)

unde U n este o mic vecintate a lui s n n R m . Predicia este fcut pentru n k T ,


ultima msuratoare.
Predicia local liniar este dat de formula

s n1 an s n bn

(7.2.27)

unde coeficienii a n R m , bn R sunt determinai astfel nct

s j U n

a n s j bn

j 1

(7.2.28)

s fie minim. Suma este efectuat dup toi s j dintr- o mic vecintate U n a lui s n
dar destul de mare nct s conin suficiente puncte pentru a asigura ca problema
celor mai mici patrate (7.2.28) s fie nesingular. In lucrrile citate n pagina
anterioar se gsesc i alte metode de predicie.
Aa cum am mai menionat aceste metode au fost implementate de Rainer
Hegger, Holger Kantz i Thomas Schreiber n pachetul TISEAN care este disponibil
i n R. Pentru a putea fi folosit n R trebuie ca pachetul TISEAN cu executabilele s
fie dezarhivat ntr-un director. Pe urm trebuie instalat n R pachetul RTisean care
conine apeluri n stilul R pentru executabilele din TISEAN. La primul apel al unei
funcii din RTisean se cere directorul cu executabilele TISEAN. Informaii despre
funciile din pachet pot fi obinute prin ??RTisean. Acest pachet de analiz a seriilor
temporale a fost utilizat pe date de poluare obinute n municipiul Bucureti, n

177

particular pentru concentraia de CO al crei grafic este n Fig. 7.1. Reproducem27


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).
CO
m=48, d=8

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0

CO

CO

CO
m=48, d=1

24

48

72

96

120

144

168

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0

Time

24

48

72

96

CO measured

CO

CO

144

168

CO predicted

CO
m=100, d=8

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
48

168

b)

CO
m=100, d=1

24

144

CO predicted

a)

120

Time

CO measured

72

96

120

144

168

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0

Time
CO measured

24

48

72

96

120

Time
CO predicted

CO measured

c)

CO predicted

d)

Fig. 7.16
Concentria de CO este nefiresc de bine estimat prin predicia 7.2.26 pentru o dimensiune de
scufundare m>=48. Contrar cu teoria, la o ntrziere d=1 predicia e mai bun dect pentru d=8, unde
este primul minim al informaiei mutuale empirice 7.2.25. Rutina TISEAN utilizat a fost lzo (n R se
numete lzo.test).

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

PM 2.5
m= 100, d= 1

30

40
35

25

30
25

20

CO

CO

35

15

20
15

10

10

0
0

24

48

72

96

12 0

14 4

16 8

24

48

72

Time
PM 2 .5 m e as ured

96

12 0

1 44

16 8

Time
P M 2 . 5 pred ict ed

P M 2. 5 m e as ured

a)

P M 2 . 5 pr ed ict ed

b)

Fig. 7.17
Prediciile pentru 168 de ore a polurii cu PM 2.5

27

Viorel Petrehus, Ileana Armeanu, Camelia Slave, Analysis of the Urban Air Pollution in Bucharest,
Proceedings BALCOR 2011, vol 2. pp 72-78

178

In momentul cnd s-au fcut predicii simultane (funcia s din (7.2.22) are
valori n R p , deci S are valori n R mp , pentru p poluani considerai simultan) am
constatat prin multe ncercri c prediciile nu devin mai bune. In figura urmtoare
vedem ce se ntmpl dac simultan lum CO i PM 2.5 n considerare. Datele
msurate pentru un an i jumtate sunt utilizate pentru a prezice poluarea pe o
sptmn.
PM 2.5
m=48, d=1

CO

CO
m=48, d=1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0

35
30
25

PM20
15
10
5
0
0

24

48

72

96

120

144

168

CO measured

24

48

72

96

120

144

168

Time

Time
CO predicted

PM 2.5 measured PM 2.5 predicted

b)

a)
Fig. 7.18

Cele mai bune predicii simultane sunt obinute pentru d = 1 i sunt semnificative numai pentru un
interval de timp mai mic de 20 de ore

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 U n , 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 s n 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 dintrun 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)).

179

Bibliografie

**. The R Development Core Team, R: A Language and Environment for Statistical
Computing, 2011-12-13.
1. M. Allehard. A Tyny Handbook of R, Springer, 2011-12-13.
2. Y. Aragon. Sries Temporelles avec R. Mthodes et cas. Springer, 2011.
3. M. Dumitrescu, A. Bttorescu. Applied Statistic using the R System, Ed.
Universitii Bucureti, 2006.
4. J. D. Cryer, Kung-Sik Chan. Time Series Analysis, with Applications in R,
Springer, 2008.
5. J. Maindonald, W. J. Braun. Data Analysis and Graphics using R an ExampleBased Approach, Cambridge University Press, 2003
6. Murrell, P. (2005) R Graphics. Chapman & Hall/CRC Press.
7. A. Pun, M. Pun. Analiz Statistic folosind limbajul R, Editura Matrix Rom,
Bucureti, 2009.
8. V. Petrehu, S.A. Popescu, Probabiliti i Statistic, Universitatea Tehnic de
Construcii, Bucureti, 1997, civile.utcb.ro/cmat/cursrt/psvp.pdf.
9. D. Ruppert. Statistics and Data Analysis for Financial Engineering. Use R!
Springer, 2010.
10. G. Zbganu. Metode Matematice n Teoria Riscului i Actuariat, Editura
Universitii Bucureti, 2004.

180

S-ar putea să vă placă și