Aquest document pretén ser una introducció o recordatori dels pocs elements de R que fem servir a l’assignatura. El material de l’assignatura, incloent les llistes de problemes i pràctiques dels seminaris permet veure aquestes operacions en el seu context. Addicionalment, recordeu que teniu també l’ajuda de R, el material que hi ha enllaçats a l’aula global i la molta documentació accessible sobre R.
Per fer servir RStudio cal instal·lar, idealment per aquest ordre:
Buscar download R
i download RStudio
en
qualsevol cercador és la manera més ràpida de trobar la pàgina per
descarregar les versions actuals.
Alternativament, es pot fer servir RStudio en línia anant a https://posit.cloud/ (cal crear-s’hi un compte gratuït) o fer servir MyApps, tot i que normalment el que va millor és instal·lar R i RStudio a l’ordinador.
2+2
## [1] 4
3.7-2
## [1] 1.7
7*6
## [1] 42
10/3
## [1] 3.333333
3^2 #potència
## [1] 9
Compte amb l’ordre de les operacions:
3+4/2
## [1] 5
(3+4)/2
## [1] 3.5
Qualsevol objecte es pot desar en una variable:
a <- 5
b <- 7*5+25
c <- "Això és un text d'exemple"
I es pot recuperar amb el nom de la variable:
a
## [1] 5
b
## [1] 60
c
## [1] "Això és un text d'exemple"
O fer servir en una altra operació:
(a+b)/2
## [1] 32.5
A la pestanya “Environment” de RStudio podem veure les variables que tenim en cada moment.
Un vector és una sèrie de valors del mateix tipus, com ara una sèrie de números.
c(4, 12, 32) # La funció c ens permet crear vectors especificant-ne els elements
## [1] 4 12 32
20:30 # Nombres enters entre el 20 i el 30
## [1] 20 21 22 23 24 25 26 27 28 29 30
v1 <- c(13.5, 9, -50) # Podem assignar un vector a una variable
v1
## [1] 13.5 9.0 -50.0
Si una operació es pot fer amb un número (com ara una operació aritmètica), si l’apliquem a un vector R la fa a cada element del vector:
v <- c(3, 12, 4)
v
## [1] 3 12 4
2*v
## [1] 6 24 8
v-1
## [1] 2 11 3
w <- 1:3
w
## [1] 1 2 3
v+w
## [1] 4 14 7
w^2
## [1] 1 4 9
Podem referir-nos a un component d’un vector (per exemple, un dels
números que conté el vector), indicant-ne l’índex (o sigui, la posició)
entre []
.
v
## [1] 3 12 4
v[1]
## [1] 3
v[2]
## [1] 12
v[3]
## [1] 4
Una funció fa una operació a partir d’uns arguments. En totes les funcions escrivim el nom de la funció i a continuació els arguments entre parèntesis i separats per comes.
sqrt(16) # Arrel quadrada
## [1] 4
sqrt(0:10) # Un vector pot ser un argument d'una funció
## [1] 0.000000 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751
## [9] 2.828427 3.000000 3.162278
c(-1, 12, 3, 56, 33) # Aquesta funció ja la coneixíem
## [1] -1 12 3 56 33
sum(1:4) # Suma dels components d'un vector. En aquest exemple, 1+2+3+4
## [1] 10
Podem aconseguir ajuda sobre una funció escrivint-ne el nom a la casella que hi ha a la pestanya “Help” de RStudio (a baix a la dreta).
Moltes funcions estan sempre disponibles a R, però d’altres venen en paquets que cal instal·lar i carregar.
library()
amb el nom del paquet com a argument, o a la
pestanya “Packages” marqueu la casella al costat del nom del
paquet.Per exemple:
library(corrplot)
## corrplot 0.92 loaded
Una taula de dades o data frame és una estructura que conté columnes amb variables sobre un nombre de casos (files).
Aquesta secció fan servir taules de dades d’exemple que ja són a R. Podeu trobar-ne informació buscant-ne el nom a l’ajuda.
Una taula de dades es pot carregar:
En tots dos casos, l’ordre resultant es pot copiar a l’script per tornar a carregar la mateixa taula de dades en qualsevol moment.
Primeres i darreres fileres (per veure què hi ha):
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
tail(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.6 1 1 4 2
Nombre de files i de columnes:
nrow(mtcars)
## [1] 32
ncol(mtcars)
## [1] 11
dim(mtcars)
## [1] 32 11
Noms de les columnes:
names(mtcars)
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
## [11] "carb"
Per referir-nos a una variable concreta en una taula de dades tenim diferents sintaxis força equivalents.
$:
mtcars$hp
## [1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230 66 52
## [20] 65 97 150 150 245 175 66 91 113 264 175 335 109
sum(mtcars$hp)
## [1] 4694
with:
with(mtcars, hp)
## [1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230 66 52
## [20] 65 97 150 150 245 175 66 91 113 264 175 335 109
with(mtcars, sum(hp))
## [1] 4694
També podem seleccionar files i columnes amb [,]
(abans
de la coma les files, després de la coma les columnes):
# Una columna
mtcars[,4]
## [1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230 66 52
## [20] 65 97 150 150 245 175 66 91 113 264 175 335 109
sum(mtcars[,4])
## [1] 4694
Aquesta mateixa sintaxi també permet seleccionar files posant l’índex abans de la coma:
mtcars[4,]
## mpg cyl disp hp drat wt qsec vs am gear carb
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
O seleccionar una casella concreta amb la fila i la columna:
mtcars[1,4]
## [1] 110
Algunes funcions de R permeten indicar el data frame amb el paràmetre data:
boxplot(hp~cyl, data=mtcars)
Obtenim una taula de freqüències amb table
.
table(mtcars$cyl) # nombre de cilindres
##
## 4 6 8
## 11 7 14
table(mtcars$cyl, mtcars$am) # nombre de cilindres i tipus de canvi de marxes
##
## 0 1
## 4 3 8
## 6 4 3
## 8 12 2
L’argument de les funcions que construeixen gràfics amb aquestes variables és la taula de freqüències:
barplot(table(mtcars$cyl), main="nombre de cilindres")
pie(table(mtcars$cyl), main="nombre de cilindres")
mosaicplot(table(mtcars$cyl, mtcars$am))
Estadístics:
mean(mtcars$hp)
## [1] 146.6875
median(mtcars$hp)
## [1] 123
var(mtcars$hp)
## [1] 4700.867
sd(mtcars$hp)
## [1] 68.56287
min(mtcars$hp)
## [1] 52
max(mtcars$hp)
## [1] 335
quantile(mtcars$hp) # quartils
## 0% 25% 50% 75% 100%
## 52.0 96.5 123.0 180.0 335.0
quantile(mtcars$hp, probs=0.9) # percentil del 90
## 90%
## 243.5
IQR(mtcars$hp) # rang inetrquartíl·lic
## [1] 83.5
Si a la variable hi ha valors perduts (NA
), els podem
excloure amb el paràmetre na.rm.
mean(mtcars$hp, na.rm=TRUE) # (en aquest exemple no hi ha valors perduts i el resultat és el mateix)
## [1] 146.6875
mean(c(2, 3, NA))
## [1] NA
mean(c(2, 3, NA), na.rm=TRUE)
## [1] 2.5
Gràfics:
hist(mtcars$hp)
hist(mtcars$hp, breaks=30) # breaks = nombre aproximat d'intervals
boxplot(mtcars$hp)
aggregate(hp~cyl, data=mtcars, mean)
## cyl hp
## 1 4 82.63636
## 2 6 122.28571
## 3 8 209.21429
aggregate(hp~cyl, data=mtcars, median)
## cyl hp
## 1 4 91.0
## 2 6 110.0
## 3 8 192.5
boxplot(hp~cyl, data=mtcars, median)
cor(mtcars$hp, mtcars$wt) #pes i potència
## [1] 0.6587479
cor(mtcars[,1:6]) # unes quantes variables numèriques de cop
## mpg cyl disp hp drat wt
## mpg 1.0000000 -0.8521620 -0.8475514 -0.7761684 0.6811719 -0.8676594
## cyl -0.8521620 1.0000000 0.9020329 0.8324475 -0.6999381 0.7824958
## disp -0.8475514 0.9020329 1.0000000 0.7909486 -0.7102139 0.8879799
## hp -0.7761684 0.8324475 0.7909486 1.0000000 -0.4487591 0.6587479
## drat 0.6811719 -0.6999381 -0.7102139 -0.4487591 1.0000000 -0.7124406
## wt -0.8676594 0.7824958 0.8879799 0.6587479 -0.7124406 1.0000000
pairs(mtcars[,1:6])
Ajustem el model lineal (regressió simple):
model <- lm(hp~disp, data=mtcars) #potència en funció de la cilindrada
summary(model)
##
## Call:
## lm(formula = hp ~ disp, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -48.623 -28.378 -6.558 13.588 157.562
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 45.7345 16.1289 2.836 0.00811 **
## disp 0.4375 0.0618 7.080 7.14e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 42.65 on 30 degrees of freedom
## Multiple R-squared: 0.6256, Adjusted R-squared: 0.6131
## F-statistic: 50.13 on 1 and 30 DF, p-value: 7.143e-08
coefficients(model)
## (Intercept) disp
## 45.7345322 0.4375526
Diagrama de dispersió i representació de la recta de regressió:
plot(hp~disp, data=mtcars) #potència en funció de la cilindrada
abline(model, col="red")
Alternativa útil quan hi ha molts punts:
smoothScatter(mtcars$dis, mtcars$hp) #potència en funció de la cilindrada
abline(model, col="red")
Per cada una de les distribucions aleatòries que coneix, R té quatre funcions amb el nom format per les lletres d, p, q o r seguides de l’abreviació del nom de la variable que fan les mateixes operacions per cada variable.
Fem servir d’exemple una variable binomial \(X \sim B(20, 0.3)\) (nombre d’èxits en 10 intents, cada un d’ells amb probabilitat d’èxit 0,3).
\(P(X=5)\)
dbinom(5, 20, .3)
## [1] 0.1788631
\(P(X \le 5)\)
pbinom(5, 20, .3)
## [1] 0.4163708
\(P(X > 5)\)
pbinom(5, 20, .3, lower.tail = FALSE)
## [1] 0.5836292
Mostra de 30 realitzacions d’aquesta variable aleatòria:
rbinom(30, 20, .3)
## [1] 8 7 2 5 8 8 9 8 7 6 6 5 5 8 5 2 8 6 3 7 5 6 5 7 4
## [26] 4 8 2 3 10
Fem servir d’exemple una variable \(X\sim N(10, 3)\) (variable normal de mitjana 10 i desviació estàndard 3).
\(P(X<5)\)
pnorm(5, 10, 3)
## [1] 0.04779035
\(P(X>5)\)
pnorm(5, 10, 3, lower.tail = FALSE)
## [1] 0.9522096
\(x\) tal que \(P(X<x)=0,9\)
qnorm(0.9, 10, 3, lower.tail = FALSE)
## [1] 6.155345
Mostra de 30 resultats d’aquesta distribució normal:
rnorm(30, 10, 3)
## [1] 14.7497115 4.3369402 10.2682192 11.4339488 9.0712555 17.0754815
## [7] 14.9013550 10.3589101 9.9694434 12.0766480 10.4976349 11.4755999
## [13] 0.8220891 8.3634349 6.6860555 10.2455150 11.4267679 7.5044382
## [19] 8.7246062 6.5042253 13.9844072 13.1058840 10.3183043 10.6215938
## [25] 5.8169747 11.2441999 7.6667611 10.6031413 14.5392221 5.7026095
Contrast i interval de confiança de mitjanes:
t.test(mtcars$hp, mu=100)
##
## One Sample t-test
##
## data: mtcars$hp
## t = 3.852, df = 31, p-value = 0.0005502
## alternative hypothesis: true mean is not equal to 100
## 95 percent confidence interval:
## 121.9679 171.4071
## sample estimates:
## mean of x
## 146.6875
Contrast i interval de confiança de proporcions:
prop.test(table(mtcars$am), p=.4)
##
## 1-sample proportions test with continuity correction
##
## data: table(mtcars$am), null probability 0.4
## X-squared = 4.2305, df = 1, p-value = 0.0397
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
## 0.4078543 0.7578086
## sample estimates:
## p
## 0.59375
Contrast d’homogeneïtat o d’independència:
chisq.test(table(mtcars$cyl, mtcars$am))
## Warning in chisq.test(table(mtcars$cyl, mtcars$am)): Chi-squared approximation
## may be incorrect
##
## Pearson's Chi-squared test
##
## data: table(mtcars$cyl, mtcars$am)
## X-squared = 8.7407, df = 2, p-value = 0.01265
model <- lm(hp~cyl+disp, data=mtcars)
summary(model)
##
## Call:
## lm(formula = hp ~ cyl + disp, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.50 -22.89 -10.33 15.17 135.52
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -32.4317 32.2803 -1.005 0.323
## cyl 24.5145 9.0218 2.717 0.011 *
## disp 0.1189 0.1300 0.915 0.368
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 38.72 on 29 degrees of freedom
## Multiple R-squared: 0.7016, Adjusted R-squared: 0.681
## F-statistic: 34.09 on 2 and 29 DF, p-value: 2.427e-08