En esta práctica se repasan algunos contrastes de hipótesis no paramétricos de una y dos poblaciones
Recuerda que para tener un nivel de significación a lo sumo α, se debe definir el procedimiento: RECHAZAR H0 si p-valor <α.
chisq.test(x,p)
donde:
x
: frecuencias de la muestra. Es decir c(
n1,
n2,...
nk)
.p
: probabilidades del modelo. Es decir c(
p1,
p2,...
pk)
.p.value
, base para la decisión del contraste.Warning
si no se cumplen las condiciones teóricas de buena aproximación de la distribución ji-cuadrado. Hay que informar de ello si ocurre.ks.test(x,y,...)
donde:
x
: muestra de datosy
: nombre entrecomillado de la función F0 (tal cual esté programada en R)....
: parámetros que pueda necesitar la función F0 (por ejemplo, mean
y sd
si se trata de la normal, o rate
si se trata de la exponencial, etc.)p.value
, base para la decisión del contraste.Warning
si la muestra contiene datos repetidos. Hay que informar de ello si ocurre.lillie.test(x)
del paquete nortest
que hay que instalar y cargar:
x
: muestra de datosp.value
, base para la decisión del contraste.Warning
si la muestra contiene datos repetidos. Hay que informar de ello si ocurre.runs.test(x)
del paquete tseries
que hay que instalar y cargar:
x
: vector de signos (o con dos únicas categorías o números). Hay que fabricarlo a partir de la muestra, bien comparando cada dato con la mediana de todos ellos, o bien comparando cada dato con el anterior (si sube o baja)p.value
, base para la decisión del contraste.binom.test(x, n, p, alternative)
:
x
: cantidad de datos de la muestra inferiores o iguales a x0.n
: cantidad total de datos.p
: orden del cuantil (por defecto 0.5, para la mediana).alternative
: dirección de H1 (two.sided
por defecto para ≠, y atención a less
para > o greater
para <).p.value
, base de la decisión del contraste.chisq.test(x,p)
donde:
x
: matriz con las frecuencias de las muestras. Es decir matrix(data=
n11,
n12,...
nKk, nrow=
K, byrow=TRUE)
. Recuerda que la función table()
puede ayudarte a obtener las frecuencias de cada muestra.y
: dejar NULL
si x
tiene la matriz con las frecuencias de las muestras.p.value
, base para la decisión del contraste.Warning
si no se cumplen las condiciones teóricas de buena aproximación de la distribución ji-cuadrado. Hay que informar de ello si ocurre.ks.test(x, y)
donde:
x
e y
: datos de cada muestra.p.value
, base para la decisión del contraste.Warning
si la muestra contiene datos repetidos. Hay que informar de ello si ocurre.binom.test(x, n, p, alternative)
:
x
: recuento de preferencias por Yn
: tamaño de muestrap
: dejar por defecto (0.5)alternative
: dejar por defecto (two.sided
) si H1 es “Y DISTINTO de X”, cambiar a less
si H1 es “Y PEOR que X”, o cambiar a greater
si H1 es “Y MEJOR que X”.p.value
, base de la decisión del contraste.wilcox.test(x, y, alternative, paired)
:
x
: valoraciones del proceso X, o las restas de “Y menos X” (si no se pone nada en el argumento y
).y
: valoraciones del proceso Y (o nada si van las diferencias en x
).paired
: poner a TRUE
(ya que por defecto está a FALSE
).alternative
: dejar por defecto (two.sided
) si H1 es “Y DISTINTO de X”, cambiar a less
si H1 es “Y PEOR que X”, o cambiar a greater
si H1 es “Y MEJOR que X”.p.value
, base de la decisión del contraste.wilcox.test(x, y, alternative, paired)
:
x
: valoraciones del proceso X.y
: valoraciones del proceso Y.paired
: dejar a FALSE
(valor por defecto).alternative
: dejar por defecto (two.sided
) si H1 es “Y DISTINTO de X”, cambiar a less
si H1 es “Y PEOR que X”, o cambiar a greater
si H1 es “Y MEJOR que X”.p.value
, base de la decisión del contraste.Se deben contestar respondiendo a lo que se pregunta con palabras relativas al enunciado (prohibido mencionar H0 o H1 en las respuestas finales).
El siguiente bloque de código carga el espacio de trabajo mt1021-1415-labo-s1-data.RData
. En él están definidas ciertas variables para resolver los ejercicios
load("mt1021-1415-labo-s1-data.RData")
2.1. Simula 50 datos de un dado imperfecto definido por la tabla
X 1 2 3 4 5 6
f(X) 0.15 0.13 0.20 0.15 0.17 0.20
y luego contrasta si esa muestra es compatible con un dado perfecto, comentando el resultado, refiriendo al nivel de significación que se pueda utilizar. Usa alguna semilla para la simulación.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.2. Averigua si los datos de la variable ‘x72’ son compatibles con el modelo de Poisson de media 2.5, comentando el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.3. Simula 30 datos del modelo uniforme en el intervalo (0,1) y luego contrasta si esa muestra es compatible con el modelo normal de media 0.5 y varianza 0.25, comentando el resultado, refiriendo al nivel de significación que se pueda utilizar. Usa alguna semilla para la simulación.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.4. Contrasta si los datos de la variable ‘x74’ son compatibles con el modelo normal de media 5 y varianza 1, comentando el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.5. En caso de incompatibilidad en el ejercicio anterior, ¿se podría admitir al menos que los datos de la variable ‘x74’ son compatibles con el modelo normal? Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.6. Sospechando sobre la falta de independencia entre las observaciones sucesivas de una variable aleatoria, se compara cada dato con el anterior, dando lugar a la cadena de signos de la variable ‘x76’. Realiza un contraste que arroje luz sobre este asunto. Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.7. La mediana de la distribución de salarios en España se suponía de 650 EUR. Se sospecha que con la crisis ha disminuido. Se muestrea la población resultando los datos de la variable ‘x77’. Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.8. Contrasta si las distribuciones de usuarios de Windows, Linux y Mac son prácticamente las mismas en los grados A, B, C y D de la UJI. Los datos, para cada grado, vienen en las variables ‘x78A’, ‘x78B’, ‘x78C’ y ‘x78D’ respectivamente. Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.9. Contrasta si se puede asumir o no que los datos de dos grupos de población A y B, muestreados y almacenados en las variables ‘x79A’ y ‘x79B’, siguen la misma distribución de probabilidad o no. Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.10. Un grupo de personas prueba dos versiones de una pizza que la empresa fabricante quiere comercializar (A y B). Para determinar si hay alguna de las dos que es fuertemente preferida sobre la otra, en la población general, pide que cada uno se pronuncie sobre la que le ha gustado más. Los resultados están en la variable ‘x710’. La pizza A es la que se comercializa actualmente, y la B es una variante para sustituir a la A, si es sensiblemente mejor para el público ¿Qué resulta de la prueba experimental? Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.11. Un grupo de personas prueba dos versiones de una pizza que la empresa fabricante quiere comercializar (A y B). Para determinar si hay alguna de las dos que es fuertemente preferida sobre la otra, en la población general, pide que cada uno valore su calidad de 0 a 10. Los resultados están en la variable ‘x711’. La pizza A es la que se comercializa actualmente, y la B es una variante para sustituir a la A si es sensiblemente mejor para el público ¿Qué resulta de la prueba experimental? Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
2.12. Un grupo de personas se divide en dos subgrupos, cada uno de los cuales está destinado a probar una versión de pizza que la empresa fabricante quiere comercializar (A y B). Para determinar si hay alguna de las dos que es fuertemente preferida sobre la otra, en la población general, pide que cada uno valore su calidad de 0 a 10. Los resultados están en las variables ‘x712A’ y ‘x712B’. La pizza A es la que se comercializa actualmente, y la B es una variante para sustituir a la A si es sensiblemente mejor para el público ¿Qué resulta de la prueba experimental? Comenta el resultado, refiriendo al nivel de significación que se pueda utilizar.
# Escribe aquí tu codigo y compila con RStudio CTRL+SHIFT+K
# verás la salida de R
Escribe aquí tus comentarios (¡y borra esta frase!)
Algunas estructuras del lenguaje R son:
nombreFuncion = function(arg1, arg2, ...) {
# cuerpo de la función
}
nombreFuncion
es el nombre que se quiere ponerfunction
es palabra reservada (para definir la función)arg1
es el primer argumento, arg2
es el segundo, ...
indica que puede haber más argumentos (se pueden igualar a algo para que tomen valor por defecto)return(valor)
donde valor
es el objeto que se quiere devolverfor()
:for(contador in vector) {
# cuerpo del bucle
}
contador
es un nombre arbitrarioin
es palabra reservadavector
es un vector concreto definido antes (o ahí mismo)contador
que, a cada ciclo del bucle, tomará un valor del vector vector
. Ejemplo: for(i in 1:3) { warning("Step ", i, "!!!")}
if()
if(expresion) {
# parte que se procesa si expresion==TRUE
} else {
# parte que se procesa si expresion==FALSE
}
else { }
es opcionallength()
: longitud de un vector (= número de componentes) o de una hoja de datos (= número de columnas, ¡ojo!). Ejemplo: length(1:3)
dim()
: dimensiones de matrix u hoja de datos (filas, columnas)prod()
: multiplica las componentes de su vector argumento. Ejemplo: prod(1:3)
unique()
: devuelve un vector con los valores (sin repetir) que contiene el vector argumento. Ejemplo: unique(c(1,2,3,3,3,2,1,2,1))
diff()
: calcula las diferencias entre cada componente y la anterior del vector argumento. Ejemplo:diff(c(1,2,3,3,3,2,1,2,1))
eval(call("nombreFuncion", argumento))
: produce la evaluación de la llamada de la función "nombreFuncion"
con el argumento argumento
. Ejemplo: eval(call("prod", 1:3))
. Importante para manipular funciones como argumento de otras funcionesis.numeric()
: devuelve TRUE
si el vector argumento es de tipo numérico. Ejemplo: is.numeric(1:3)
, is. numeric(c("a", "b", "c"))
warning()
: imprime en pantalla un aviso (con el texto del argumento). Ejemplo: warning("La aproximación puede ser insuficiente!")
stop()
: detiene la ejecución de una función e imprime en pantalla un aviso (con el texto del argumento). Ejemplo: stop("No puedo operar con letras!")
4.1. Programa las 4 funciones de probabilidad del modelo “Tipy01” de parámetro θ∈]0,1[ dado por las funciones:
Recuerda llamarlas como es costumbre en R:
dtipy(x=, theta=)
para la función de densidad de probabilidad, f(x)ptipy(q=, theta=)
para la función de distribución (acumulada), F(x)qtipy(p=, theta=)
para la función de cuantiles, Xprtipy(n=, theta=)
para la función de simulaciones# Escribe aquí tus funciones y pruébalas con algunos valores
# dtipy(x=0.5, theta=0.5)
# ptipy(q=0.9, theta=0.1)
# También puedes dibujarlas
# x = seq(from=-1, to=2, by=0.01)
# fx = dtipy(x=x, theta=0.2)
# plot(x=x, y=fx, type='l')
10.2. CONTRASTE DE HIPÓTESIS SIMPLES: Define la función que resuelve el contraste de hipótesis simples {H0:fX=f0H1:fX=f1 que minimiza una combinación lineal de las probabilidades de error tipo I y II. Si la combinación es a⋅α(δ)+b⋅β(δ), y la muestra es →x=(x1,x2,…,xn), entonces el procedimiento óptimo rechaza H0 si y sólo si a⋅f0(→x)−b⋅f1(→x)<0.
x
: el vector con la muestra obtenida.f0
: el nombre de la función de densidad de probabilidad indicada en H0.f1
: el nombre de la función de densidad de probabilidad indicada en H1.a
, b
: los pesos de la combinación lineal de los tipos de error# Escribe aquí tu solución
# función contrasteHipotSimples()
# argumentos: los que dice el 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 el caso
# devolver la lista
10.2. DE DATOS A SIGNOS: Escribe una función num2signs()
que tome un vector de datos numéricos (argumento x
) y devuelva un vector de “signos” (con 2 números o caracteres).
0
(datos consecutivos iguales) se excluirán del vector de signos devuelto.# Escribe aquí tu solución
10.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 +1 y -1, o cualquier otra pareja de signos), devuelva el número de rachas existentes en el vector. Recuerda que una racha es una cadena máxima de valores iguales, situados entre valores del otro tipo, o extremos de la muestra (ojo, una racha puede ser un solo signo). Si el vector tiene más de dos categorías, que devuelva un mensaje de error indicando que “el vector tiene más de dos signos!”. Comprueba el funcionamiento con pequeños ejemplos.
# Escribe aquí tu solución
10.4. LA DISTRIBUCIÓN 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 que se han observado n1 signos de un tipo y n2 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 R, de modo que druns()
devuelve la probabilidad de cualquier número de rachas posible que se indique en x
. Comprueba el funcionamiento con pequeños ejemplos.
La función de probabilidad del “número de rachas” es:
# Escribe aquí tu solución
10.5. 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
# 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 número de rachas
# 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 (busca fórmula en teoría)
# Al final:
# return(list(R=, p.value=))
# donde `R` es el valor del estadístico y
# `p.value` su p-valor
}