5
, -4.32
, 1.5e-4
, etc.Inf
(Infinite), NaN
(Not a Number)"a"
, 'b'
, "palabras de amor"
, etc. Entre comillas simples o dobles (para poder poner apóstrofes u otras comillas dentro).TRUE
y FALSE
.=
c(...)
.:
seq(from, to, length, by)
rep(x, times, each)
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))
...
(puntos suspensivos), que indican una cantidad indeterminada de argumentos.# 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
}
nombreFuncion
es el nombre que se quiere dar.function
es palabra reservada (para definir la función).arg1
sería el primer argumento, arg2
el segundo, y puede haber más....
indica que puede haber más argumentos (que no se esperan, pero que el usuario puede pasar, si hacen falta)return(expression)
: la expressión puede ser el nombre de una variable del cuerpo de la función.# 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)
serie.geom(razon=2, fin=3) # observa cómo usa valores por defecto
serie.geom(inicio=0, fin=3)
+
, -
, *
, /
, ^
, …sqrt()
, log()
, exp()
, sin()
, abs()
, … y otras<
, ==
, >
, <=
, >=
, !=
&
, |
, xor()
, !
(and, or, or exclusivo, not)ls()
sin argumentos, devuelve el vector de nombres de las variables definidas.a:b
crea vector de enteros consecutivos, de a
a b
.c(...)
concatena los argumentos (constantes i/o vectores) en un solo vector.length(x)
devuelve la longitud del vector argumento x
.sum(...)
SUMa las components de los (vectores) argumentos.prod(...)
PRODucto de las components de los (vectores) argumentos.sort(x, decreasing=FALSE)
devuelve un vector como el argumento, x
, pero reordenado de manera creciente (a menos que se cambie el argumento decreasing
a TRUE
).order(x, decreasing=TRUE)
devuelve el vector de las “posiciones” del vector x
que consiguen su ordenación (de manera creciente o decreciente, según sea el argumento decreasing
).min(...)
devuelve el valor MÍNimo de los argumentos.max(...)
devuelve el valor MÀXimo de los argumentos.which(x)
devuelve el vector de “posiciones” donde el vector de lógicos, x
, es TRUE
. Normalmente x
es una comparación, y which
nos dice qué componentes cumplen la comparación.diff(x)
devuelve un vector con las diferencias (incrementos) de cada componente respecto del anterior.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))
[]
con 3 posibles sintaxis:
TRUE
) y excluir (FALSE
). Ideal para seleccionar datos de un vector que cumplan una condición concreta.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
matrix(data, nrow, ncol, byrow=FALSE)
donde:
data
: vector a organizar en forma de matriznrow
, ncol
: número de filas y columnas (solo es necesario uno de los dos, el otro lo deduce de la longitud del vector)byrow
indica si la matriz se rellena por filas (por defecto NO)[ , ]
con dos argumentos
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
data.frame(etiq1=vector1, etiq2=vector2,...)
x
a la hoja de datos y tiene como etiquetas de columna los nombres V1
, V2
, …, entonces:
length(x)
: número de columnas (!!!)dim(x)
: dimensiones (filas, columnas)names(x)
: vector con etiquetas de columnasrow.names(x)
: vector con etiquetas de filasstr(x)
: estructura (devuelve por pantalla un resumen del tipo de variable que es, de las componentes que la forman, y unos pocos de los valores que contiene. Vale para todo tipo de variable en R$
y [,]
):
x$V1
: datos de la columna de etiqueta V1
x[ , "V1"]
: datos de la columna de etiqueta V1
x[, 1]
: datos de la primera columna.x[ , c("V1", "V3")]
: datos de la columna de etiqueta V1
x[, c(1,3)]
: datos de la primera y tercera columnasx$V1[condicion]
o bien x[condicion, "V1"]
(donde condicion
es una condición que solo cumplen los datos que queremos extraer)x[condicion, c("V1", "V3")]
(donde condicion
es una condición que solo cumplen los datos que queremos extraer)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')]
list(etiq1=obj1, etiq2=obj2,...)
donde etiq1
y etiq2
son etiquetas (nombres sin comillas) y obj1
y obj2
son objetos de cualquier tipo (vectores, matrices, hojas de datos, etc.)$
y [[]]
)# 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
for()
:for(contador in vector) {
# cuerpo del bucle
}
contador
es un nombre arbitrario.in
es palabra reservada (obligatoria).vector
es un vector concreto definido ahí mismo (o antes).contador
que, en cada ciclo del bucle, tomará un valor del vector vector
.for(i in 1:3) {
warning("Step ", i, "!!!")
}
if()
if(expresion) {
# parte que se procesa si expresion es TRUE
} else {
# parte que se procesa si expresion es FALSE
}
expresion
es un valor lógico (normalmente resultado de una comparación).else { }
es opcional.nota = 5.0
if(nota >= 5) {
warning("Aprobado!")
} else {
warning("Suspendido!")
}
nota = 4.9
if(nota >= 5) {
warning("Aprobado!")
} else {
warning("Suspendido!")
}
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"
.stopifnot(condicio1, condicio2, ...)
, que termina el proceso, devolviendo Error
, si no se cumple alguna de las condiciones lógicas indicadas.warning("Un aviso por algo")
stop("Algo prohibido")
stopifnot(1<2, 1==1, 3<2, 5<7)
for
, si se puede trabajar directamente con el vector y sus operaciones.x
.# 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!!!)
funcionRara3 = 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)
}
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
unique()
: devuelve un vector con los valores (sin repetir) que contiene el vector argumento.diff()
: calcula las diferencias entre cada componente y la anterior del vector argumento.eval(call("nombreFuncion", argumento))
: produce la evaluación de la llamada de la función "nombreFuncion"
con el argumento argumento
. Importante para manipular funciones como argumento de otras funcionesis.numeric()
, is.na()
, etc.: devuelve TRUE
si el vector argumento es del tipo especificado en cada caso.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.1. CONVERTIR DATOS NUMÉRICOS EN SIGNOS: Escribe una función num2signs()
que cumpla los siguientes requisitos:
num2signs
devuelve un vector de signos (\(1\)’s y \(-1\)’s) a partir de un vector de números, bien sea comparando cada valor con el anterior, o bien cada valor con la mediana de todos ellos.x
: vector numérico.type
: por defecto valdrá "increment"
. En ese caso se calcularán los incrementos x[i+1]-x[i]
, de modo que, si es positivo se producirá un valor \(1\), y si es negativo se producirá un valor \(-1\) (si es 0 se descarta). Si se pone type="median"
, entonces se compara cada dato con la mediana, de modo que, si es mayor se producirá un valor \(1\), y si es menor se producirá un valor \(-1\) (si es igual, se descarta)x
solo contiene dos valores distintos, se interpretarán ya como signos, y se devuelve dicho vector recodificando el mayor valor como \(1\) y el menor como \(-1\).type
.diff()
: devuelve un vector con las diferencias de cada dato respecto del anterior sin usar un bucle.unique()
: da los datos del vector sin repetirlos.length()
: cuenta los datos de un vector.median()
: calcula la mediana de un vector numérico.[ ]
: permite localizar datos de un vector (por posición o condición).numeric()
: crea un vector de ceros, de longitud indicada en su argumento.# Escribe aquí tu solución
# Ejemplos
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. NÚMERO DE RACHAS DE UNA CADENA DE SIGNOS: Escribe una función nruns()
que cumpla los siguientes requisitos:
nruns
devuelve el número de rachas de su argumento.x
: vector de valores \(1\) y \(-1\).diff()
: devuelve un vector con las diferencias de cada dato respecto del anterior sin usar un bucle.sum()
: suma los datos de su vector argumento.# Escribe aquí tu solución
# Ejemplos
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ÓN DE PROBABILIDAD DEL NÚMERO DE RACHAS: Define en R la función druns()
que cumpla los siguientes requisitos:
druns
devuelve la probabilidad del número de rachas indicado en su argumento, dadas las cantidades de signos de cada tipo.x
: vector con diversos números de rachas posibles.n1
: cantidad de signos de un tipo.n2
: cantidad de signos de otro tipo.x
condicionado a las cantidades n1
y n2
de signos de cada tipo. Cabe recordar la probabilidad de la variable aleatoria \(R\) = “número de rachas”, para un proceso de dos signos, en el cual se han observado \(n_1 \geq 1\) signos de un tipo y \(n_2 \geq 1\) signos del otro tipo:
choose()
: calcula el número combinatorio de sus dos argumentos.# Escribe aquí tu solución
# Ejemplos
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. CONTRASTE DE ALEATORIEDAD POR RACHAS: Implementa una función runs.test()
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
devuelve el estadístico “número de rachas” y su \(p\)-valorx
: vector de números o signostype
: si x
es vector de números, puede tomar el valor "increment"
o "median"
tal y como ocurre en el ejercicio de la función num2signs()
. Si x
es vector de signos, no se usará este argumento.num2signs
, nruns
y druns
).nruns()
: devolverá el estadístico \(R\).druns
, y sumar solo las que sean menores o iguales que la del estadístico observado.list(R=..., p.value=...)
(donde los puntos suspensivos deben ser completados con algo correcto).# Escribe aquí tu solución
# Ejemplos
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. CONTRASTE DE HIPÒTESIS SIMPLES: Define la función simple.test()
que cumpla los siguientes requisitos:
simple.test
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 la combinación \(a \cdot \alpha(\delta) + b \cdot \beta(\delta)\) (de probabilidades de errores tipo I y II), y la muestra es \(\vec{x} = (x_1, x_2, \ldots, x_n)\). El procedimiento óptimo de contraste es "rechazar \(H_0\) si y solo si \(a \cdot f_0(\vec{x}) - b \cdot f_1(\vec{x}) < 0\)x
: vector con la muestra de datos (\(\vec{x}\)).f0
: nombre (entrecomillado) en R de la función de densidad de probabilidad indicada en \(H_0\).f1
: nombre (entrecomillado) en R de la función de densidad de probabilidad indicada en \(H_1\).a
, b
: los pesos de la combinación lineal de los tipos de error (\(a\) y \(b\), resp.).eval()
: servirá para poder calcular la función de probabilidad sobre cada dato de la muestra.prod()
: multiplica los datos de su argumento.list(Value=..., Decision=...)
donde Value
es el valor de la operación que se calcula para tomar la decisión, y Decision
es la frase que informa de si se rechaza o no. Los puntos suspensivos se deben completar con la información adecuada.# Escribe aquí tu solución
# Ejemplos
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dexp", a=1, b=1) # 0.4511884, "Aceptar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dexp", a=1, b=10) # -4.488116, "Rechazar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dnorm", a=1, b=1) # 0.9407989, "Aceptar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dnorm", a=1, b=10) # 0.4079893, "Aceptar H0"