• No se han encontrado resultados

Introducció a R. Tomàs Aluja 11/ Setembre/ 2011

N/A
N/A
Protected

Academic year: 2021

Share "Introducció a R. Tomàs Aluja 11/ Setembre/ 2011"

Copied!
14
0
0

Texto completo

(1)

Introducció a R

Tomàs Aluja

[email protected]

11/ Setembre/ 2011

Instal.lació

http://cran.es.r-project.org

Documentació a llegir: An introduction to R (es descarrega al fer la instal·lació).

Una primera sessió:

Entrem a

R

# això és un comentari

# generació de 40 observacions N(0,1)

x <- rnorm(40)

x <- sort(x) # cal ordenar x pels plots de despres

x # d’aquesta manera veiem el contingut del vector x

# estadístics sumaris de x i histograma

summary(x) hist(x)

# generació d’una variable de resposta

y <- sin(x*pi)+0.1*rnorm(40)

# estadístics sumaris de y i histograma

summary(y) hist(y)

plot(x,y)

# creació d’un data.frame composat pels dos vectors

dd <- data.frame(x,y)

# veiem els atributs del data.frame

(2)

attributes(dd)

# comprovem que el data frame no son factors

#(=variables categòriques)

sapply(dd, is.factor)

# verifiquem els mínims i els màxims del data frame

sapply(dd, range)

# fem ara la regressió lineal entre y i x

reg1 <- lm(y ~ x, data=dd)

# vejam que conté l’objecte reg1

attributes(reg1)

# mirem per exemple els coefficients

reg1$coefficients

# vejam quina mena d’ajustament hem fet

plot(x,y)

# i sense tancar la finestra del plot

lines(x, reg1$fitted.values)

# ara fem una regressió local

reg2 <- loess(y ~ x, data=dd)

# i mirem que hem fet

lines(x,reg2$fitted,col=”blue”)

# t’ha agradat?. Doncs prova de fer una regressió +

# polinòmica

# reg1 <- lm(y ~ poly(x,n), data=dd)

# on n és el grau del polinomi), a veure si millores + l’ajustament! Quin és el grau del polinomi escollit?

# En realitat però el model el volem per poder fer prediccions respecte unes noves observacions

# El que passa es que les noves observacions segueixen un model una mica diferent de les observacions velles amb les que hem construït els dos models reg1 i reg2

(3)

xnew <- rnorm(40, mean=0.3) xnew <- sort(xnew)

ynew <- sin(xnew*pi*0.9)+0.2*rnorm(40)

# Utilitzem els models reg1 i reg2 per obtenir les prediccions per a les noves dades xnew

ypred1 <- predict(reg1,new.data=xnew)

# Mirem el que hem fet

plot(xnew,ynew) lines(xnew,ypred1)

# El que passa es que necessitem una mesura numèrica de la qualitat de l’ajustament

rss1 <- sum((ynew-ypred1)^2) rss1

# Fem el mateix amb el model reg2

ypred2 <- predict(reg2,new.data=xnew)

# Mirem el que hem fet, afegint els valors ajustats al plot anterior

lines(xnew,ypred2,col=”blue”)

# El que passa es que necessitem una mesura numèrica de la qualitat de l’ajustament

rss2 <- sum((ynew-ypred2)^2) rss2

# Quin valor és més petit, rss1 o rss2?

# El que doni un valor més petit indica que el model és millor, fa les prediccions més ajustades a la realitat. Però a partir de una sola vegada, ja podem dir que un model és millor que un altre?

# anem a fer-ho més vegades.

# Incloure les instruccions de generació de x,y,

estimació dels models reg1 i reg2, generació de xnew i ynew i càlcul de rss1 i rss2 dins un bucle

# primer inicialitzem rss1 i rss2

rss1 <- NULL

(4)

rss2 <- NULL

for (i in 1:100) { x <- rnorm(40)

y <- sin(x*pi)+0.1*rnorm(40) reg1 <- lm(y ~ poly(x,5)) reg2 <- loess(y ~ x)

xnew <- rnorm(40, mean=0.3)

ynew <- sin(x*pi*0.9)+0.2*rnorm(40) ypred1 <- predict(reg1,new.data=xnew) ypred2 <- predict(reg2,new.data=xnew) rss1[i] = sum((ynew-ypred1)^2)

rss2[i] = sum((ynew-ypred2)^2)}

# Ara comparem les mitjanes de les 100 simulacions

mean(rss1) mean(rss2)

# I per veure millor el que passa, anem a representar graficament rss1 i rss2

dens1 <- density(rss1) dens2 <- density(rss2)

plot(dens1)

lines(dens2,col=”blue”)

# AIXI DONCS, QUIN MODEL ÉS MILLOR?

En

R

gairebé tot són objectes:

vectors. Son les variables

> x <- c(1, 2, 3); y <- c(“a”, “b”, “c”) z <- c(TRUE, TRUE, FALSE)

factors. Són les variables categóriques

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

matrius

> y <- matrix(x, nrow=1, ncol=3); dim(y)

arrays. Són matrius de qualsevol nombre de dimensions

data.frame. Son matrius on les variables són de qualsevol tipus, es el resultat natural de la lectura d’un fitxer de dades.

(5)

llistes. Són llistes d’altres objectes. Es molt general

> ll <- list(x,y,z)

Per saber els objectes que tenim fem

> ls()

o

> objects()

Per saber si un objecte es un vector per exemple, fem

> is.vector(nom_objecte)

Per saber de quin tipus és un objecte, fem

> class(nom_objecte)

Cada objecte conté una llista d’atributs que el composen. Per saber els atributs d’un objecte fem:

> attributes(nom_objecte)

R

es “case sensitive”, escriure amb majúscules o minúscules si importa.

Importar les dades

El millor es llegir d’un fitxer texte, amb les dades separades per blancs o tabuladors. Es bó posar a la primera fila els noms de les variables.

> dd <- read.table(“h:/dir/nom.txt”, header=TRUE)

Atenció a la inclinació del barres del “path”.

L’objecte llegit, dd, és un data.frame.

Header = TRUE indica que la primera fila conté els noms de les variables.

Si tenim una primera columna indicant el nom de les files, aquesta columna no ha de portar identificador de columna.

Els literals no han de contenir cap espai en blanc.

(6)

També podem llegir fitxers separats per comes o punt i comes, així com importar fitxers d’altres sistemes (SPSS, ...)

Feu

> help(read.table)

Per veure tots els arguments de la funció i altres funcions relacionades.

Manipulació de les dades

Primer anem a veure que hem llegit

> dd

> summary(dd) # ens dona els mínim i màxims per + veure si un fitxer s’ha llegit correctament.

Per tenir directament accessibles els vectors del data.frame(dd), fem

> attach(dd)

Operació amb vectors

> nouv <- a+2*b+3*c+4*d

Estan disponibles els operadors aritmètics (+, -, *, /, ^, ...) i lògics (==, !=, >, >=,

<, <=, &, |) habituals.

També les funcions matemàtiques usuals: sqrt, log, log10, exp, sin, ...

Generació de seqüències

> a <- 1:20; b <- -10:10, c <- c(1:20, seq(from=22, + to=40, by=2)

> a <- rep(4,3); b <- gl(4,3, label=c(“b1”,”b2”, +

“b3”, “b4”)

Selecció d’elements d’un vector

> x <- 1:100

> y <- x[1:10]

> z <- x[c(2,21:30)] # seleccionem elements disjunts

> x[100]

> z <- list(x,y) # es una llista de vectors

(7)

> z[[2]]; y # el segon element d’una llista es un + vector

>

> y <- x[x>3] # selecciona els elements de x que + compleixen la condició. No confondre amb

>

> z <- x>3 # genera un vector lògic indicant si + compleixen la condició

Els valors mancants s’especifiquen amb NA (not available). El resultat

d’operacions aritmètiques no permeses dona NaN (not a number) o Infinity Operacions amb valors mancants

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

> is.na(x); which(is.na(x))

> x2 <- x[!is.na(x)] # treure els valors mancants

> x[is.na(x)] <- 0 # substituir-los per 0

>

> x3 <- (5, 3, NA, 7); mean(x3) # no funciona

> mean(x3, na.rm=T) # ara si

>

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

> X2 <- na.omit(X); cor(X); cor(X2)

Estadístics sobre els vectors

> mean(x); min(x); max(x); var(x); sd(x); ...

Recodificació de vectors

> z <- cut(x, 5)

> # recodificació en 5 intervals d’igual amplitud

>

> z <- cut(x, breaks=c(0,100, 130, 200, 999) # +

recodificació de x en 4 intervals definits pels talls + anteriors.

>

> z <- cut(x, quantile(x, c(0, 1/3, 2/3, 1)))

> # recodificació en 3 intervals equidistribuits (+ o

> -)

>

> z <- split(x, a)

> # partició del vector x en funció d’un factor a

Ordenació de vectors

(8)

> sort(x)

> rank(x)

> order(x)

> sort(x1, partial=x2) # ordenació de x1 segons els un vector d’indexos x2

Creació d’un vector d’etiquetes

Això ens serà útil per fer plots. Suposem que tenim una sèrie de factors i volem representar les etiquetes dels factors en un plot, aleshores caldrà capturar aquestes etiquetes en un vector de literals per despres poder-les representar.

En aquesta operació serà bo que els nivells del factors no siguin “1”, “2”, “3” ...

sinó que siguin mnemotècnics respecte la variable a la que fan referència, per exemple, si un factor representa l’edat, “ed-18”, “ed-25”, ed-40”, ...

> etiq <- c(levels(edat),levels(eciv),levels(regio))

>

> # per fer que els nivells dels factors siguin nemotècnics, podem fer:

> edat <- paste(“ed”, edat, sep=”-“)

Matrius i vectors

Definició

> A <- 1:24; dim(A) <- c(3,4,2); A

> B <- matrix(1:24, nrow=6); B

> C <- cbind(x, y)

>

> D <- B[2:4, 3:4]

Operacions amb matrius

> A + B

> A – B

> A * B # atenció, es el producte terme a terme

> A %*% B # és el producte matricial

> A %o% B # producte exterior (tots amb tots)

> t(A) # matriu trasposta

> solve(A) # matriu inversa

> eigen(A) # valors i vectors propis

> svd(A) # descomposició en valors singulars

> diag(A) # vector amb la diagonal de A

> diag(x) # matriu diagonal, amb diagonal = x

(9)

Operacions amb vectors

> A <- x * x # es un vector format pel producte terme a terme de x

> k <- x %*% x # = t(x) %*% x. Es el producte escalar de x amb si mateix (norma al quadrat).

> fq <- x %*% A %*% x # = t(x) %*% A %*% x. Es la forma quadràtica de A associada a x.

Operacions per files o per columnes.

> row.mean <- apply(dd, 1, mean) # mitjanes per files

> col.sum <- apply(dd, 2, sum) # sumes per columnes

> str.mean <- tapply(x, fac, mean) # mitjanes del + vector x segons les modalitats del factor fac

> dvector <- c(dd) # apila la matriu dd com un vector

Creació de taules

> taula <- table(fac1, fac2) # creuament de dos + factors

La taula creada es una matriu que podem manipular i eventualment exportar.

Gràfics

El gràfic bàsic es:

> plot(x,y)

Aquest gràfic el podem millorar

> plot(x,y, main=”títol xulo”, sub=”subtítol”, xlab=”eix x”, ylab=”eix y”)

# o complicar

> plot(x,y, main=”títol xulo”, sub=”subtítol”,

xlab=”eix x”, ylab=”eix y”, type=”l”) # per defecte + dibuixa un gràfic de punts, pero amb type = “l” els + uneix per línies

També podem fer plots amb etiquetes

(10)

> etiq <- rep(“obs”, length(x))

> plot(x,y, type=”n”) # i sense tancar la finestra

> text(x,y, labels=etiq)

Segons el contexte

R

és intel·ligent

> plot(sin, -pi, 2*pi)

Altres gràfics són:

> hist(x)

> barplot(fac)

> boxplot(edat~ fac) # boxplots per cada nivell de fac

> qqplot(edat, zscores)

> persp(x=c(1:30), y=c(1:30), z) # plot

+ d’una superficie de resposta z, z ha de ser una + matriu de dimensions 30 per 30

> ...

Funcions

> nom <- function(arg1, arg2, ... ){expressió}

{expressió} indica una formula o conjunt de formules (sentencies de

R

). La

funció pot donar en sortida, un valor numèric, un vector, un gràfic o un missatge.

Per exemple, si volem crear una funció que ens doni les probabilitats teòriques en una taula de contingència, sota la hipòtesis de independència , podem fer :

> probt <- function(taula){ + rm <- apply(taula,1,sum) + cm <- apply(taula,2,sum) + gm <- sum(taula) + prt <- rm %*% t(cm)/gm }

>

> pp <- probt(tt) # on tt es una taula de contingència

Si volem crear una funció donant més d’un resultat, per exemple, si volem fer una funció que centri i redueixi una matriu ponderada, donant com sortida la matriu estandaritzada i els vectors de mitjanes i desviacions tipus, farem una cosa com la següent:

# Funció de centrar i reduir ponderada

# pes vector de pesos

# Xraw matriu de dades original

(11)

> stan = function(Xraw,pes){

> X = as.matrix(Xraw)

> n = dim(X)[1]

> pes.rel = pes/sum(pes)

> xmean = pes.rel %*% X

> xsdev = sqrt(apply(pes.rel %*% (X - rep(1,n) %*%

xmean)^2, 2, sum))

> Xstan = (X - rep(1,n) %*% xmean) / rep(1,n) %*%

t(xsdev)

> list (stan = Xstan, mean = xmean, sdev = xsdev) }

# aleshores poden cridar la funció stan i veure els seus atributs

> Xstn = stan(Xdat, poids)

> attributes(Xstn)

Programació en R

R

disposa totes les instruccions pel control d’una execució

> for (i in 1:5) print (1:i)

>

> xg <- split(x, fac) # separació de dos vectors en + classes

> yg <- split(y, fac) # plot conjunt de la regressió + lineal en cada classe

> for (i in 1:length(yg)) {

plot(xg[[i]], yg[[i]]);

abline(lsfit(xg[[i]], yg[[i]])) }

>

> for (i in 1:length(x) {

if (x[i] > 99) print(iden[i])}

>

> if (condicio) expr_1 else expr_2

> while (condicio) expr

> repeat expr

> break

> next

(12)

Funcions probabilístiques

Disposem un ventall amplissim de distribucions de probabilitat, en particular les més corrents: Normal, Uniforme, t de student, F de Fisher,

χ

2, etc. En

R

s’indiquen respectivament per: norm, unif, t, f, chisq

El prefixe indica quina és la funció cridada: rxxx, pxxx, qxxx i dxxx.

> rnorm(10) # indica random, es a dir, generació aleatòria de 10 obs. d’una distribució N(0,1)

>

> pnorm(1.96) # obté el valor de la funció de distribució = P(x≤1.96)

>

> qnorm(0.5) # és la funció inversa de la funció de probabilitat qnorm(pnorm(x))=x

>

> dt(0) # dona el valor de la funció de densitat de la distribució t en el punt 0

Proves estadístiques clàssiques

Per realitzar les proves de hipòtesis més clàssiques, heu de carregar el paquet ctest (classical tests). Allí hi trobareu

> # prova de Chi-quadrat

> chisq.test(taula)

> chisq.test(fac1,fac2, p=probteo, simulate.p.value=T)

>

> # t de Student per una mostra

> t.test(edat, mu=45, alternative=”two.sided”)

>

> # t de Student per a dues mostres (aparellades o no)

> t.test(pres1,pres2, paired=T,alternative==”greater”)

>

> # prova de la igualtat de variancies

> var.test(pres1, pres2, ratio=1, conf.level=0.90)

>

> # F de Fisher per la igualtat de k mitjanes

> oneway.test(edat~mar2, dd, var.equal=T) ...

Una mica d’anàlisi multivariant

(13)

Anem a fer una anàlisi de components principals normalitzat, seguit del scrreplot dels valors propis i del biplot de Rp. Després fem una classificació sobre les 2 primeres coordenades principals. Per últim tallem l’arbre en 5 classes i llistem el contingut de cada classe.

> pcadd <- princomp(dataframe, cor=T)

> screeplot(pcadd)

> biplot(pcadd$scores, pcadd$loadings)

>

> d2d <- dist(pcad2$scores[,1:2])

> d2clu <- hclust(d2d, method = "ward")

> plot(d2clu)

>

> d2cut <- cut(d2clu, k=5)

> split(1:length(d2clu), d2cut)

Exportar dades

> write.table(nom.dataframe, file=”output.txt”, + col.names=TRUE)

Carregar més paquets

La carrega de paquets és molt fàcil a partir del item “package” de la barra principal. Podem carregar els paquets disponibles localment, o accedir als paquets disponibles en CRAN.

Per veure els paquets disponibles

> search()

> library(MASS) # per carregar la llibreria MASS

Per cada paquet podem veure la llista de funcions accedint al HTML help, clikant sobre el “package” que interessi.

Treballar amb programes R

Una forma còmoda de treballar amb

R

, es a partir de programes. Els programes son simplement fitxers texte, amb extensió xxxx.R, contenint les instruccions de

R

que volem executar degudament comentades.

Podem aprofitar la opció “Save history” del menú principal, per guardar una sessió interactiva. Després treiem els errors i les instruccions que no

(14)

interessen, la comentem i la deixem llesta per ser executada d’una tirada, al obrir el fitxer des de

R

.

Referencias

Documento similar

Ecci'noñ dormìtalti(^Hecj»e dotmìet-,^HÌ cuJÌ0dit JfrattJ\/uc- fìro detenior eitarà can vigilanrcjque no dormirà, ni dormitará. Pues fino ha de dormir, corno pide que fe

El contar con el financiamiento institucional a través de las cátedras ha significado para los grupos de profesores, el poder centrarse en estudios sobre áreas de interés

La incompleció i la degeneració de les dades que constitueixen l’experiència de l’infant són poca cosa, però, en comparació del fet que qualsevol persona sap coses de la

Fuente de emisión secundaria que afecta a la estación: Combustión en sector residencial y comercial Distancia a la primera vía de tráfico: 3 metros (15 m de ancho)..

A diferència del que es podria pensar, les fases de regeneració del bosc presenten un important creixement dels I A S , resultat de l'existència d'una economia mixta, així com

La campaña ha consistido en la revisión del etiquetado e instrucciones de uso de todos los ter- mómetros digitales comunicados, así como de la documentación técnica adicional de

De fet, les desigualtats són el resultat d’una apropiació dels recursos, de l’existència, fins i tot de l’experiència. D’aquesta manera, tres relacions socials desiguals

1a23de6df84bd2c8d2c149d97f7b0e8f