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.

RStudio

Per fer servir RStudio cal instal·lar, idealment per aquest ordre:

  • R
  • RStudio

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.

Comandes bàsiques

Operacions aritmètiques

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

Variables

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.

Vectors

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

Funcions

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

Paquets

Moltes funcions estan sempre disponibles a R, però d’altres venen en paquets que cal instal·lar i carregar.

  • Instal·lar: Només cal fer-ho una vegada per que R baixi el paquet del repositori a Internet i el desi al disc dur del nostre ordinador. Si el paquet no està instal·lat, aneu a la pestanya “Packages” (a baix a la dreta), premeu “Install” i escriviu el nom del paquet.
  • Carregar: Per fer servir un paquet que teniu instal·lat l’heu de carregar a la memòria. S’ha de fer a cada sessió en que es vulgui fer servir el paquet. Feu servir la funció 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

Taules de dades

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.

Carregar una taula de dades

Una taula de dades es pot carregar:

  • Si està en format RData (el format propi de R), carregant el fitxer amb el botó d’obrir fitxers.
  • Si està en un altre format, com un full d’Excel o un fitxer de text, amb els assistents que s’obren amb el botó “Import Dataset” de la pestanya “Environment”.

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.

Funcions per taules de dades

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"

Variables en taules de dades

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)

Estadística descriptiva

Una o dues variables categòriques (o numèriques discretes)

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

Variables numèriques

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)

Variables numèriques i categòriques (o numèriques discretes)

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)

Dues variables numèriques o més

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

Variables aleatòries

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.

Distribució binomial

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

Distribució normal

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

Inferència

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

Regressió múltiple

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