1. CONSTANTES

2. VARIABLES Y ASIGNACIONES

2. VECTORES

c(0,2,4)
c("hola", "adiós", "hasta luego")
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. FUNCIONES

# Funció 'sample()' simula extracciones aleatorias de una urna de objetos
# Argumentos:
#   x: vector de los objetos de la urna
#   size: número de extracciones
#   replace: extracciones con restitución de los objetos?
#   prob: vector de probabilidades de los objetos (iguales por defecto)
sample(x=6, size=100, replace=TRUE, prob=NULL) # versió completa 
sample(6, 100, TRUE, NULL) # versió sin nombres de argument
sample(TRUE, 6, NULL, 100) # versió equivocando el orden de los argumentos
sample(100, 6, TRUE, NULL) # otra versió equivocando el orden de los argumentos
sample(replace=TRUE, x=6, prob=NULL, size=100) # versión ok 
nombreFuncion = function(arg1, arg2, ...) {
  # cuerpo de la función
  # return(expression) # opcional
}
# función que suma algunos términos de una série geométrica
# r^0 + r^1 + r^2 + ...
# pero que se pueda elegir dónde comienza y dónde acaba
serie.geom = function(razon=1, inicio=0, fin=0) {
  valores = razon^(inicio:fin)
return( sum(valores) )  
}
serie.geom(razon=2, inicio=0, fin=3)
## [1] 15
serie.geom(razon=2, fin=3) # observa cómo usa valores por defecto 
## [1] 15
serie.geom(inicio=0, fin=3)
## [1] 4

4. ALGUNAS FUNCIONES Y OPERACIONES IMPORTANTES CON VECTORES

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ÓN DE VECTORES (SUBVECTORES)

letters # vector de letras del abecedario (ya creado en R)
v = letters[1:5] # de la "a" a la "e"
v # miramos v
set.seed(2019) # para hacer simulaciones repetibles
# simulación de 100 letras de "a" a "e" equiprobables
w = sample(x=v, size=100, replace=TRUE)
w # miramos los datos simulados
# ¿cuántos datos tiene el vector?
length(w)
# ¿cuáles son los 10 primeros datos?
w[1:10]
# ¿y si me interesa descartar los 10 primeros datos?
w[-(1:10)]
# ¿cuántas letras "a" hay en el vector w?
w=="a" # hace comparaciones, y devuelve TRUEs y FALSEs (100 en total)
w[w=="a"] # selecciona de w solo las componentes de los TRUEs
length(w[w=="a"]) # finalmente cuenta cuántas hay
# ¿cuántas "vocales" hay en el vector w?
w[w=="a" | w=="e"] # seleccionamos las que son vocales
length(w[w=="a" | w=="e"]) # respuesta a la pregunta

6. MATRICES

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

7. HOJAS DE DATOS

data(mtcars) # carga hoja de datos "mtcars" en R
mtcars # miramos los datos
str(mtcars) # son demasiados datos. es mejor ver la estructura
names(mtcars) # miramos los nombres de las columnas
row.names(mtcars) # miramos los nombres de filas (cada fila, un coche)
# datos de la columna "mpg"
mtcars$mpg
# datos de columna "mpg" pero de coches con 4 cilindros (columna "cyl")
mtcars$mpg[mtcars$cyl==4]
# hoja de datos solo con columnas "disp" y "mpg" en este orden
mtcars[,c('disp', 'mpg')]
# hoja de datos solo con columnas "disp" y "mpg" en este orden
# pero solo de coches de 4 cilindros
mtcars[mtcars$cyl==4, c('disp', 'mpg')]

8. LISTAS

# creamos una lista simple
l1 = list(mensaje="Ha funcionado", muestra=c(5.5, 10.4, 2.8), estad=4.8, facil=TRUE)
l1 # miramos la lista
l1[[2]] # accedemos a la segunda componente
l1[["muestra"]] # accedemos a la componente etiquetada como "muestra"
l1$muestra # accedemos a la componente etiquetada como "muestra"
# un ejemplo de lista creada por la función t.test() de R
contraste = t.test(x=1:10, mu=5, conf.level=0.99)
str(contraste) # miramos las etiquetas de la lista para poder acceder a ellas
contraste$p.value # devuelve el p-valor
contraste$conf.int # devuelve el intervalo de confianza

9. ESTRUCTURAS DE FLUJO

Bucles for():

  • Para repetir una tarea cambiando un valor de contador
  • La sintaxis es:
for(contador in vector) {
  # cuerpo del bucle
}
  • donde:
    • contador es un nombre arbitrario.
    • in es palabra reservada (obligatoria).
    • vector es un vector concreto definido ahí mismo (o antes).
  • Se crea la variable contador que, en cada ciclo del bucle, tomará un valor del vector vector.
  • Los bucles son lentos en R. Si puedes, evítalos, usando directamente operaciones con vectores (que son rápidos).
  • Ejemplo:
for(i in 1:3) { 
  warning("Step ", i, "!!!")
}

Condicional if()

  • Para hacer una tarea si se cumple una condición.
  • La sintaxis es:
if(expresion) {
  # parte que se procesa si expresion==TRUE
} else {
  # parte que se procesa si expresion==FALSE
}

-donde: - expresion es un valor lógico (normalmente resultado de una comparación). - el bloque de else { } es opcional. - Ejemplo:

nota = 5.0
if(nota >= 5) {
  warning("Aprobado!")
} else {
  warning("Suspendido!")
}
nota = 4.9
if(nota >= 5) {
  warning("Aprovado!")
} else {
  warning("Suspendido!")
}

Manejo de los errores

  • A veces, los datos que proporciona el usuario no permiten hacer operaciones, y la función no puede continuar. Se ha de informar al usuario para que pueda reaccionar.
  • Otras veces, los cálculos se pueden hacer, pero no se cumplen ciertas condiciones para que sean buenos cálculos. Se puede continuar pero también se ha de informar al usuario de los riesgos.
  • La forma más habitual de manejar estas situaciones es usar bloques condicionales if(), con las siguientes funciones:
    • stop("expresion"): termina el proceso, devolviendo Error, con el mensaje "expresion".
    • warning("expresion"): continua el proceso, pero escribe el mensaje "expresion".
  • Otra forma es stopifnot(condicio1, condicio2, ...), que termina el proceso, devolviendo Error, si no se cumple alguna de las condiciones lógicas indicadas.

10. VECTORITZACIÓN

# versión incorrecta (no vectorial)
funcionRara = function(x) {
  if(x <= 1) {
    return(x^2)
  } else {
    return(2-x)
  }
}
funcionRara(x=-1)
funcionRara(x=0)
funcionRara(x=1)
funcionRara(x=3)
funcionRara(x=c(-1,0,1,3))
#
# versión correcta (pero no vectorial!!!)
funcionRara2 = 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)
}
funcionRara2(x=-1)
funcionRara2(x=0)
funcionRara2(x=1)
funcionRara2(x=3)
funcionRara2(x=c(-1,0,1,3))
#
# versión correcta (y vectorial!!!)
funcioRara3 = function(x) {
  y = numeric(length(x))
  y[x<=1] = (x^2)[x<=1]
  y[x>1] = (2 - x)[x>1]
  return(y)
}
funcionRara3(x=-1)
funcionRara3(x=0)
funcionRara3(x=1)
funcionRara3(x=3)
funcionRara3(x=c(-1,0,1,3))
# la dibujamos
x = seq(from=-2, to=2, length=100)
y = funcionRara3(x)
plot(x=x, y=y, type='l') # para ver la gràfica

11. OTRAS FUNCIONES DE 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. EJERCICIOS EVALUABLES

12.1. CONTRASTE DE HIPÒTESIS SIMPLES: Define la función que resuelve el contraste de hipótesis simples \[ \left\{ \begin{array}{ll} H_0: & f_X = f_0 \\ H_1: & f_X = f_1 \end{array} \right. \] que minimiza una combinación lineal de las probabilidades de error tipo I y II. Si la combinación es \(a \cdot \alpha(\delta) + b \cdot \beta(\delta)\), y la muestra es \(\vec{x} = (x_1, x_2, \ldots, x_n)\), entonces el procedimiento óptimo rechaza \(H_0\) si y solo si \(a \cdot f_0(\vec{x}) - b \cdot f_1(\vec{x}) < 0\).

# Escribe aquí tu solución
# función contrasteHipotSimples()
# argumentos: ver enunciado
# calcular el valor a*f0(muestra) - b*f1(muestra)
# crear una lista con: (1) el valor calculado, y 
# (2) la frase "Aceptar H0" o "Rechazar H0", según corresponda
# devolver la lista creada

12.2. CONVERTIR DATOS NUMÉRICOS EN SIGNOS: Escribe una función num2signs() que tome un vector de datos numéricos (argumento x) y devuelva un vector de “signos” (con solo 2 números, como 0 y 1, o dos caracteres, como + y -).

# Escribe aquí tu solución

12.3. NÚMERO DE RACHAS: Escribe una función nruns() que, para un vector de datos de dos categorías (argumento x, por ejemplo, de números, o cualquier otra pareja de signos), devuelva el número de rachas existentes en el vector.

# Escribe aquí tu solución

12.4. LA DISTRIBUCIÓN DE PROBABILIDAD DEL NÚMERO DE RACHAS: Define en R la función de probabilidad de la variable aleatoria \(R\) = “número de rachas”, para un proceso de dos signos, en el cual se han observado \(n_1\) signos de un tipo y \(n_2\) signos del otro tipo. La función tendrá la forma druns(x, n1, n2), donde n1 y n2 son los argumentos de la cantidad de signos de cada tipo, y x puede ser cualquier valor posible, de manera que druns() devuelve la probabilidad de cualquier número de rachas posibles que se indique en x.

# Escribe aquí tu solución

12.5. CONTRASTE DE ALEATORIEDAD POR RACHAS: Implementa una función que realice el contraste de aleatoriedad (por rachas) para muestras pequeñas, según la estructura que se propone (usará las funciones de los ejercicios anteriores):

runs.test = function(x, type='median') {
# Argumentos:
#   x: vector de datos numéricos o signos
#   type: 'median' o 'increment', según el criterio para comparar
# Devuelve: el número de rachas y su p-valor

# bloque 1: comprobar si `x` son signos o números
# bloque 2: construir cadena de signos (si procede)
# bloque 3: calcular las rachas y su número
# bloque 4: calcular su p-valor. Si hay más de 20 signos de 
#           cada tipo, usar aprox. normal (busca fórmula en teoría)
#           y si no, la distribución exacta (ejercicio anterior)
# Al final:
#   return(list(R=, p.value=))
#     donde `R` es el valor del estadístico y
#     `p.value` su p-valor
#     recuerda que el p-valor es la probabilidad del valor observado de R
#     y también de otros valores que sean menos creíbles (para H0, y más para H1) que R  
}

12.6. PROGRAMAR UN NUEVO MODELO DE VARIABLE ALEATORIA EN R: Programa las 4 funciones de probabilidad del modelo “Tipy01” de parámetro \(\theta \in ]0,1[\) dado por las funciones:

# Escribe aquí tus funciones
#
# Después pruébalas con algunos valores
# dtipy(x=0.5, theta=0.5)
# ptipy(q=0.9, theta=0.1)
# qtipy(p=0.5, theta=0.1)
# rtipy(n=100, theta=0.1)
# También puedes dibujar la "f" en todo su dominio
# con distintos valores de theta para ver 
# las zonas de mayor densidad de probabilidad 
# x = seq(from=-1, to=2, by=0.01) # el eje x
# fx1 = dtipy(x=x, theta=0.2)
# plot(x=x, y=fx1, type='l')
# fx2 = dtipy(x=x, theta=0.5)
# points(x=x, y=fx2, type='l', lty=2)
# fx3 = dtipy(x=x, theta=0.8)
# points(x=x, y=fx2, type='l', lty=3)