Contrastes de hipótesis y primeros pasos en la programación: estructuras If-else.

Contraste de hipótesis sobre igualdad de varianzas

Aunque esta entrada se presenta como continuación de la 14ª sesión con Rcmdr, en la que hablábamos de contrastes de hipótesis, en realidad es más bien una excusa para empezar a hablar en el blog de las estructuras de  programación de R. Si ya tienes alguna experiencia escribiendo programas (en cualquier lenguaje de programación), la lectura de esta entrada te resultará muy, muy fácil. Pero si nunca lo has hecho, entonces esta entrada es para ti, he tratado de hacerla lo más fácil de digerir posible.

En aquella entrada hicimos algún contraste de hipótesis usando, por un lado, funciones de R específicas para ese tarea (como t.test), y por otro lado, haciendo “a mano” el contraste. Es decir, calculando los valores necesarios para el contraste paso a paso. Y al final de aquella entrada dejamos sin cubrir el caso del contraste de igualdad de varianzas en dos poblaciones normales. En parte para no hacerla demasiado extensa, y en parte porque quería reservar ese caso para esta entrada. Vamos con ello, entonces. En uno de los últimos exámenes que hemos hecho, pedíamos a nuestros alumnos que hicieran este ejercicio:

Dos marcas de analgésicos a firman en su publicidad que sus productos proporcionan un
alivio muy rapido del dolor de cabeza. Para decidir cual de los dos es más rápido, hemos
seleccionado un grupo de 22 pacientes y los hemos dividido aleatoriamente en dos grupos. Cada grupo ha recibido tratamiento con uno de los dos analgésicos. Los tiempos, en minutos, que los pacientes de cada grupo tardaron en sentir aliviado su dolor fueron estos:
Grupo 1={ 9.9, 8.0, 9.5, 5.9, 12.2, 13.5, 9.6, 11.5, 12.5, 9.5, 10.3, 11.9 }
Grupo 2={ 8.2,17.3, 10.1, 10.2, 9.1, 10.5, 9.7, 9.0, 15.2, 11.6 }
Utiliza estos datos para decidir cuál de los dos medicamentos parece producir efecto más
rápidamente. Ten en cuenta que no se sabe nada sobre la posible igualdad de varianzas en las poblaciones involucradas. Utiliza un nivel de confi anza del 95% en todos los contrastes de hipótesis que realices, y calcula además el p-valor de esos contrastes.

Es un ejercicio de contraste de medias en dos poblaciones (que se asumen normales), pero, como indica la frase subrayada, y dado que se trata de muestras pequeñas, es conveniente llevar a cabo previamente un contraste de igualdad de varianzas, con hipótesis nula:

H_0=\{\sigma_1^2=\sigma_2^2\}

Que es precisamente el caso que habíamos dejado pendiente.

El estadístico que vamos a utilizar en este caso es el cociente de las cuasivarianzas muestrales:

\dfrac{s_1^2}{s_2^2}

Utilizamos R para calcular el valor del estadístico en las muestras de ambas poblaciones:

> muestra1=c(9.9, 8.0, 9.5, 5.9, 12.2, 13.5, 9.6, 11.5, 12.5, 9.5, 10.3, 11.9)
> muestra2=c(8.2,17.3, 10.1, 10.2, 9.1, 10.5, 9.7, 9.0, 15.2, 11.6)

> (s1=sd(muestra1))
[1] 2.115509
> (s2=sd(muestra2))
[1] 2.914504

> (n1= length(muestra1))
[1] 12
> (n2= length(muestra2))
[1] 10

> (Estadistico=s1^2/s2^2)
[1] 0.5268664

Si la hipótesis nula fuera cierta, y las varianzas de las dos poblaciones fuesen iguales,  la distribución muestral de este estadístico sería una F de Fisher.

Así que para calcular el p-valor del contraste basta con hacer

> (pValor=2*(pf(Estadistico,df1=n1-1,df2=n2-1)))
[1] 0.3139952

Las preguntas estándar que se hace cualquier aprendiz de Estadística (y que tienen una contestación más extensa en los apuntes de teoría) son:  ¿por qué el 2? y ¿por qué usamos pf en lugar de 1-pf? Multiplicamos por dos porque se trata de un contraste bilateral, y debemos tener en cuenta la probabilidad de las dos colas de la distribución. Y usamos pf porque estamos calculando la probabilidad correspondiente a la cola izquierda de la distribución. Y ese es el punto clave (que hace de este el ejemplo ideal para esta entrada, como veremos) y que muchas veces causa dificultades a los principiantes. ¿Cómo sabemos que hay que usar la cola izquierda y no la cola derecha? Una gráfica de la distribución de Fisher nos ayudará en la discusión:2012_13_EstadisticaBiologia-ExamenEnero-Ejercicio01-ContrasteSi la hipótesis nula fuera cierta, los valores del estadístico cercanos a uno serían los más probables (porque el estadístico vale uno cuando las cuasivarianzas son iguales). Los valores que ponen en aprietos a la hipótesis nula son los que se alejan de uno, hacia una u otra de las colas de la distribución. Y como nosotros hemos obtenido un estadístico aproximadamente igual a 0.527, que es menor que uno, debemos usar la cola izquierda. Para tratar de dejarlo aún más claro, si intercambiamos los nombres de las muestras (como si las hubiéramos ordenado al revés), tendríamos:

> muestra2=c(9.9, 8.0, 9.5, 5.9, 12.2, 13.5, 9.6, 11.5, 12.5, 9.5, 10.3, 11.9)
> muestra1=c(8.2,17.3, 10.1, 10.2, 9.1, 10.5, 9.7, 9.0, 15.2, 11.6)

> (s1=sd(muestra1))
[1] 2.914504
> (s2=sd(muestra2))
[1] 2.115509

> (n1= length(muestra1))
[1] 10
> (n2= length(muestra2))
[1] 12

> (Estadistico=s1^2/s2^2)
[1] 1.898014

Y naturalmente, \dfrac{1}{1.898014}=0.5268665. Y si usamos  esta segunda ordenación de las muestras, puesto que ahora el valor del estadístico es mayor que uno, tenemos que usar la cola derecha de la distribución, como ilustra esta figura (no es la misma F de antes; los grados de libertad también han intercambiado sus posiciones):2012_13_EstadisticaBiologia-ExamenEnero-Ejercicio01-Contraste-aY ahora usamos 1-pf  para calcular el p-valor. En cualquier caso el resultado es, naturalmente,el mismo:

> (pValor=2*(1-pf(Estadistico,df1=n1-1,df2=n2-1)))
[1] 0.3139952

Y ahora que hemos discutido esto, vamos a lo que más nos interesa en esta entrada. Hemos visto que, dependiendo del valor del estadístico (es decir, dependiendo de cómo se ordenen las muestras), tendremos que decidir si usar la cola derecha o la cola izquierda para obtener el p-valor.  ¿Podemos automatizar este proceso de decisión? En el fondo, de eso trata la programación: de automatizar las decisiones. Por eso en el próximo apartado vamos a dar nuestro primer paso en el mundo de la programación en R.

Tomando decisiones. Estructuras If-else.

Si el objetivo (confesable) de todas las sesiones precedentes era acompañar al lector que está usando R en un curso de introducción a la Estadística, a partir de esta entrada vamos a  adentrarnos en un terreno que excede ese objetivo (tan modesto, por otra parte).  Si R ha llegado a la posición que ahora ocupa, y si su radio de acción no deja de crecer, es sobre todo porque no se limita a ser un programa de Estadística más al uso, con cada vez más opciones en los menús. Ante todo, R es un lenguaje de programación, con un fuerte sesgo -desde luego- hacia el análisis de datos. Para sacarle todo el partido a R hay que aprender algo de programación. Y otro de los objetivos de este blog es allanar ese camino a quien quiera hacerlo.

Sin más preámbulos, ¿cómo se hace esto? La decisión más básica consiste siempre en elegir entre dos caminos posibles (en general, dos opciones; pero la imagen del camino ayuda a pensar).  Y el esquema de una decisión básica siempre es este:

Si se cumple cierta condición, entonces vamos por el camino A. Y si no se cumple, vamos por el camino B.

Las frases que hemos marcado en azul son las que cambiarán en cada caso concreto, porque en cada ejemplo la condición será distinta, y distintos serán también los caminos A y B. Pero la forma de la frase es la misma siempre. Para traducir una frase de esta forma  al lenguaje de R disponemos de un estructura especial que, esquemáticamente, dejando todavía sin traducir las partes en azul de la frase, funciona así:

if(se sumple cierta condicion){
  vamos por el camino A
}else{
  vamos por el camino B
}

Veamos un ejemplo de decisión más concreto. Vamos a lanzar un dado (usando la función sample de R).  Si el resultado es menor o igual que  tres, entonces tú ganas. Y si eso no se cumple (es decir, si es mayor que tres),  yo gano. He coloreado en azul las partes correspondientes para resaltar la estructura de la frase. En R esto se convierte en:

(dado=sample(1:6,1))

if(dado<=3){
decision='tu ganas'
}else{
decision='yo gano'
}

decision

La parte interesante es el grupo central de instrucciones; el fragmento de código empieza con el lanzamiento del dado (y se muestra el resultado para ayudar a entender lo que sucede a continuación). Y el código termina mostrando el resultado, la decisión que se ha tomado.  Si es la primera vez que ves una de estas estructuras if-else, te conviene ejecutar el código varias veces para hacerte una idea de como funciona.

Volvamos al contraste sobre igualdad de varianzas. ¿Cuál es la estructura de la decisión que teníamos que tomar? Es decir, ¿cuál es la condición, y cuáles son los dos caminos? Vamos a intentar escribirlo de forma que la estructura sea evidente:

Si el estadístico es menor que uno, entonces calculamos el p-valor usando la cola izquierda de la F. Y si eso no se cumple (si el estadístico es >=1), entonces calculamos el p-valor usando la cola derecha.

Traducido a R el código que continúa con el ejemplo del examen es así (repetimos la sentencia en la que se calcula el Estadísitico para que se vea cómo encaja  esto con lo anterior):

(Estadistico=s1^2/s2^2)

if(Estadistico<1){
  pValor=2*pf(Estadistico,df1=n1-1,df2=n2-1)
}else{
  pValor=2*(pf(Estadistico,df1=n1-1,df2=n2-1))
)

pValor

Al ejecutar este código se obtiene el resultado correcto ¡sea cual sea el orden en que se coloquen las muestras! Esto nos permite escribir un fichero de comandos R que calcula el p-valor correcto, sin tener que preocuparnos del orden en que se colocan las muestras. Es muy razonable decir que es un programa en lenguaje R. Muy sencillo, pero un programa al fin y al cabo.

En próximas entradas vamos a aprender más sobre estos grupos if-else, y vamos a presentar más estructuras de programación,  que nos van a permitir crear programas en R cada vez más sofisticados, que por un lado nos permitirán sacar el mayor partido posible del sistema, y por otro lado nos harán capaces de entender los programas que otros han escrito y tal vez adaptarlos a nuestras necesidades concretas.

En la próxima entrada de esta serie, y antes de avanzar más, vamos a asegurarnos de que el terreno que pisamos es firme. Para ello, nos entretener en la forma de escribir la condición que usamos en una estructura de tipo if-else.  ¿Qué significa exactamente una condición? ¿Y como se escriben en R? Pronto lo veremos.

Muchas gracias por la atención.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s