1. CONSTANTS

2. VARIABLES I ASSIGNACIONS

2. VECTORS

c(0,2,4)
c("hola", "adéu", "fins ara")
c(TRUE, TRUE, FALSE)
1:10
seq(from=0, to=1, length=5)
seq(from=0, to=1, by=0.1)
rep(x=1:3, each=10)
rep(x=1:3, times=5)
rep(x=1:3, times=c(5,2,4))

3. FUNCIONS

# Funció 'sample()' simula extraccions aleatòries d'una urna d'objectes
# Arguments:
#   x: vector dels objectes de l'urna
#   size: nombre d'extraccions
#   replace: extraccions amb restitució dels objectes?
#   prob: vector de probabilitats dels objectes (iguals per defecte)
sample(x=6, size=100, replace=TRUE, prob=NULL) # versió completa 
sample(6, 100, TRUE, NULL) # versió sense noms d'argument
sample(TRUE, 6, NULL, 100) # versió equivocant l'ordre dels arguments
sample(100, 6, TRUE, NULL) # altra versió equivocant l'ordre dels arguments
sample(replace=TRUE, x=6, prob=NULL, size=100) # versió ok 
nomFuncio = function(arg1, arg2, ...) {
  # cos de la funció
  # return(expressio) # opcional
}
# funció que suma alguns termes d'una sèrie geomètrica
# r^0 + r^1 + r^2 + ...
# però que es puga triar on comença i on acaba
serie.geom = function(rao=1, inici=0, fi=0) {
  valors = rao^(inici:fi)
return( sum(valors) )  
}
serie.geom(rao=2, inici=0, fi=3)
serie.geom(rao=2, fi=3) # observa com usa valors per defecte
serie.geom(inici=0, fi=3)

4. ALGUNES FUNCIONS I OPERACIONS IMPORTANTS AMB VECTORS

v = 1:10
ls()
v^c(2,1)
v - 5
sqrt(v-5)
sort(c(5,-1,20,0,13,14))
order(c(5,-1,20,0,13,14))
diff(c(5,-1,20,0,13,14))

5. INDEXACIÓ DE VECTORS (SUBVECTORS)

letters # vector de lletres de l'abecedari (ja creat en R)
v = letters[1:5] # de la "a" a la "e"
v # mirem v
set.seed(2019) # per fer simulacions repetibles
# simulació de 100 lletres de "a" a "e" equiprobables
w = sample(x=v, size=100, replace=TRUE)
w # mirem les dades simulades
# quantes dades té el vector?
length(w)
# quines són les 10 primeres dades?
w[1:10]
# i si m'interessa descartar les 10 primeres dades?
w[-(1:10)]
# quantes lletres "a" n'hi ha al vector w?
w=="a" # fa comparacions, i torna TRUEs i FALSEs (100 en total)
w[w=="a"] # selecciona de w només les components dels TRUEs
length(w[w=="a"]) # finalment conta quantes n'hi ha
# quantes "vocals" n'hi ha al vector w?
w[w=="a" | w=="e"] # seleccionem les que són vocals
length(w[w=="a" | w=="e"]) # resposta a la pregunta

6. MATRIUS

m1 = matrix(data=1:12, nrow=3)
m1
m2 = matrix(data=1:12, nrow=3, byrow=TRUE)
m2
m2[3,4] # element
m2[2,] # fila 2
m2[,3] # columna 3
m2[c(1,3), c(2,3)] # submatriu

7. FULLES DE DADES

data(mtcars) # carrega full de dades "mtcars" en R
mtcars # mirem les dades
str(mtcars) # son massa dades. és millor veure l'estructura
names(mtcars) # mirem noms de columnes
row.names(mtcars) # mirem noms de files (cada fila, un cotxe)
# dades de la columna "mpg"
mtcars$mpg
# dades de columna "mpg" però de cotxes amb 4 cilindres (columna "cyl")
mtcars$mpg[mtcars$cyl==4]
# full de dades només amb columnes "disp" i "mpg" en aquest ordre
mtcars[,c('disp', 'mpg')]
# full de dades només amb columnes "disp" i "mpg" en aquest ordre
# i amb cotxes de 4 cilindres
mtcars[mtcars$cyl==4, c('disp', 'mpg')]

8. LLISTES

# creem una llista simple
l1 = list(missatge="Ha funcionat", mostra=c(5.5, 10.4, 2.8), estad=4.8, facil=TRUE)
l1 # mirem la llista
l1[[2]] # accedim a la segona component
l1[["mostra"]] # accedim a la component etiquetada com "mostra"
l1$mostra # accedim a la component etiquetada com "mostra"
# un exemple de llista creada per la funció t.test() de R
contrast = t.test(x=1:10, mu=5, conf.level=0.99)
str(contrast) # mirem les etiquetes de la llista per poder accedir a elles
contrast$p.value # torna el p-valor
contrast$conf.int # torna l'interval de confiança

9. ESTRUCTURES DE FLUXE

9.1. Bucles for():

  • Per a repetir una tasca canviant un valor de contador
  • La sintaxi és:
for(contador in vector) {
  # cos del bucle
}
  • on:
    • contador és un nom arbitrari.
    • in és paraula reservada (obligatòria).
    • vector és un vector concret definit allí mateix (o abans).
  • Es crea la variable contador que, a cada cicle del bucle, prendrà un valor del vector vector. Exemple: for(i in 1:3) { warning("Step ", i, "!!!")}
  • Els bucles son lents en R. Si pots, evíta’ls, usant directament operacions amb vectors (que son ràpides).
  • Exemple:
for(i in 1:3) { 
  warning("Step ", i, "!!!")
}

9.2. Condicional if()

  • Per fer una tasca si es compleix una condició.
  • La sintaxi és:
if(expressio) {
  # part que es processa si expressio==TRUE
} else {
  # part que es processa si expressio==FALSE
}
  • on:
    • expressio és un valor lògic (normalment resultat d’una comparació).
    • el bloc de else { } és opcional.
  • Exemple:
nota = 5.0
if(nota >= 5) {
  warning("Aprovat!")
} else {
  warning("Suspens!")
}
nota = 4.9
if(nota >= 5) {
  warning("Aprovat!")
} else {
  warning("Suspens!")
}

9.3. Maneig dels errors

  • De vegades, les dades que proporciona l’usuari no permeten fer operacions, i la funció no pot continuar. S’ha d’informar a l’usuari per que puga reaccionar.
  • Altres vegades, els càlculs es poden fer, però no es compleixen certes condicions per que siguen bons càlculs. Es pot continuar però també s’ha d’informar a l’usuari dels riscos.
  • La forma més habitual de manejar aquestes situacions és usar blocs condicionals if(), amb les següents funcions:
    • stop("expressio"): termina el processament, tornant Error amb el missatge entre cometes.
    • warning("expressio"): continua el processament, però escriu el missatge.
  • Una altra forma és stopifnot(condicio1, condicio2, ...), que termina el processament, tornant Error, si no es compleix alguna de les condicions lògiques indicades.
  • Exemple:
warning("Un avís per alguna cosa")
stop("Alguna cosa prohibida")
stopifnot(1<2, 1==1, 3<2, 5<7)

10. VECTORITZACIÓ

# versió incorrecta (no vectorial)
funcioRara = function(x) {
  if(x <= 1) {
    return(x^2)
  } else {
    return(2-x)
  }
}
funcioRara(x=-1)
funcioRara(x=0)
funcioRara(x=1)
funcioRara(x=3)
funcioRara(x=c(-1,0,1,3))
#
# versió correcta (però no vectorial!!!)
funcioRara2 = function(x) {
  y = numeric(length(x))
  for(i in 1:length(x)) {
    if(x[i] <= 1) {
      y[i] = x[i]^2
    } else {
      y[i] = 2 - x[i]
    }
  }
  return(y)
}
funcioRara2(x=-1)
funcioRara2(x=0)
funcioRara2(x=1)
funcioRara2(x=3)
funcioRara2(x=c(-1,0,1,3))
#
# versió correcta (i vectorial!!!)
funcioRara3 = function(x) {
  y = numeric(length(x))
  cond1 = (x <= 1) 
  cond2 = (x > 1) 
  x1 = x[cond1]
  x2 = x[cons2]
  y[cond1] = x1^2
  y[cond2] = 2 - x2
  return(y)
}
funcioRara3(x=-1)
funcioRara3(x=0)
funcioRara3(x=1)
funcioRara3(x=3)
funcioRara3(x=c(-1,0,1,3))
# la dibuixem
x = seq(from=-2, to=2, length=100)
y = funcioRara3(x)
plot(x=x, y=y, type='l') # per a veure la gràfica

11. ALTRES FUNCIONS D’INTERÉS

unique(c(1,2,3,3,3,2,1,2,1))
diff(c(1,2,3,3,3,2,1,2,1))
eval(call("sum", 1:4))
is.numeric(1:3)
is.numeric(c("a", "b", "c"))

12. EXERCICIS AVALUABLES

12.1. CONVERTIR DADES NUMÈRIQUES EN SIGNES: Escriu una funció num2signs() que complisca els següents requisits:

# Escriu ací la teua solució

# Exemples
num2signs(x=c(1,2,3,4,3,1,5), type="increment") # 1  1  1 -1 -1  1
num2signs(x=c(3,3,7,7,7,7,7), type="increment") # -1 -1  1  1  1  1  1
num2signs(x=c(1,2,3,4,3,1,5), type="median") # -1 -1  1 -1  1
num2signs(x=c(3,3,7,7,7,3,7), type="median") # -1 -1  1  1  1 -1  1

12.2. NOMBRE DE RATXES DE UNA CADENA DE SIGNES: Escriu una funció nruns() que complisca els següents requisits:

# Escriu ací la teua solució

# Exemples
nruns(x=c(1,1,1,1,1,1,1)) # 1
nruns(x=c(1,-1,-1,-1,-1,-1,-1)) # 2
nruns(x=c(-1,-1,1,-1,1,-1,-1)) # 5

12.4. LA DISTRIBUCIÓ DE PROBABILITAT DEL NOMBRE DE RATXES: Defineix en R la funció druns() que complisca els següents requisits:

# Escriu ací la teua solució

# Exemples
druns(x=2:3, n1=2, n2=1) # 0.66667, 0.333333
druns(x=2:3, n1=3, n2=1) # 0.5, 0.5
druns(x=2:3, n1=4, n2=1) # 0.4, 0.6
druns(x=2:4, n1=2, n2=2) # 0.333333, 0.333333, 0.333333
druns(x=2:5, n1=3, n2=2) # 0.2, 0.3, 0.4, 0.1
druns(x=2:11, n1=10, n2=5) # 0.0006660007 0.0043290043 0.0239760240 0.0659340659 0.1438561439 0.2157842158 0.2237762238 0.1958041958 0.0839160839 0.0419580420

12.5. CONTRAST D’ALEATORIETAT PER RATXES: Implementa una funció runs.test() que realitze el contrast d’aleatorietat (per ratxes) per a mostres petites, segons l’estructura que es proposa (usarà les funcions dels exercicis anteriors):

# Escriu ací la teua solució

# Exemples
runs.test(x=c(1,2,3,4,3,1,5), type="increment") # $R=3 $p.value=0.6
runs.test(x=c(3,3,7,7,7,7,7), type="increment") # $R=2 $p.value=0.0952381
runs.test(x=c(1,2,3,4,3,1,5), type="median") # $R=4 $p.value=1
runs.test(x=c(3,3,7,7,7,3,7), type="median") # $R=4 $p.value=1

12.6. CONTRAST D’HIPÒTESIS SIMPLES: Defineix la funció simple.test() que complisca els següents requisits:

# Escriu ací la teua solució

# Exemples
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dexp", a=1, b=1) # 0.4511884, "Acceptar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dexp", a=1, b=10) # -4.488116, "Rebutjar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dnorm", a=1, b=1) # 0.9407989, "Acceptar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dnorm", a=1, b=10) # 0.4079893, "Acceptar H0"