NORMALIDAD: MÉTODOS GRÁFICOS Y TEST DE HIPÓTESIS - ¿PODEMOS FIARNOS DE LAS HERRAMIENTAS GRÁFICAS?
Introducción
Es, como quien dice, un dogma de fe que n>=30 se considera una muestra grande. Este número está en todos los libros de texto y páginas web imaginables y se da por hecho que siempre que aparezca una muestra de tamaño >=30 tenemos la posibilidad de reemplazar la t-student por la Z, obteniendo una buena aproximación.
Pero, ¿es verdad?
Planteamiento
Antes de nada, debemos concretar qué se entiende por “buena aproximación”. Normalmente, se trabaja con niveles de confianza del 95 o del 99% - en su mayoría del 95%.
Hay mucha variedad de test de hipótesis pero, por simplicidad, supondremos que tenemos un modelo sencillo: un test a una cola sobre la media con una muestra de tamaño n. Es decir, la hipótesis nula seria que la media es <= que un cierto valor fijo y la alternativa que es mayor que dicho valor.
En resúmen, rechazaremos la hipótesis nula si el t-estadístico asociado a la muestra es >qnorm(.975), si lo evaluamos con la normal, y >qt(.975,df=n), si lo evaluamos con la t-student, donde qnorm() y qt() son las funciones de R que devuelven los cuantiles correspondientes. Hemos tomado un nivel de confianza del 95%.
En este post, vamos a generar las diferencias, en términos porcentuales, entre la t-student con distintos grados de libertad y la Z. Calcularemos cuál es el error y lo representaremos gráficamente para entender mejor qué está pasando.
set.seed(123) #para poder repetir todo tal cual está
alfa <- 0.05 # nivel de significancia
nmuestras <- 1000
u<-0 #media de la población
s<-1 #desv tipica de la poblacion
# valores de n a considerar
n_ini<-30
n_fin<-200
# funcion para contar numero de fallos para un n, alfa y numero de muestras dados
contar_errores<-function(n,alfa,nmuestras,PRINT_ERROR=FALSE)
{
nerrores<-0 # numero de fallos
for (i in 1:nmuestras)
{
# muestra
x<-rnorm(n)
ux<-mean(x)
sdx<-sd(x)
# estadistico asociado a la muestra
t<-(ux-u)/(sdx/sqrt(n))
# calculo de los pvalores en ambos casos
pValorZ <- 1- pnorm(t)
pValorT <- 1- pt(t,df=n-1,lower.tail = TRUE)
# contar falsos positivos y falsos negativos
if ((pValorT<alfa && pValorZ>alfa) || (pValorT>alfa && pValorZ<alfa))
{
nerrores<-nerrores+1
if(PRINT_ERROR)
cat("ERROR tstudent:",pValorT, "\tZ:",pValorZ,"\n")
}
}
return(nerrores)
}
Y hemos cometido este porcentaje de errores
n<-30
nerrores<-contar_errores(n,alfa,nmuestras,TRUE)
## ERROR tstudent: 0.0520952 Z: 0.04672143
## ERROR tstudent: 0.05016751 Z: 0.04481326
## ERROR tstudent: 0.05531647 Z: 0.04991791
## ERROR tstudent: 0.0524867 Z: 0.0471094
## ERROR tstudent: 0.05151035 Z: 0.04614211
## ERROR tstudent: 0.05407359 Z: 0.04868348
cat("errores = ",round(100*(nerrores/nmuestras),2),"%\n")
## errores = 0.6 %
Ahora vamos a ver cómo evoluciona el número de errores conforme varía n:
n_ini<-10
n_fin<-100
nerrores<-matrix(0,nrow=2,ncol=n_fin) # matriz con primera fila valor de n y segunda num.errores.
for(n in n_ini:n_fin)
{
nerrores[1,n]<-n
nerrores[2,n]<-contar_errores(n,alfa,nmuestras,FALSE)
}
Y el resultado es
x<-nerrores[,n_ini:n_fin]
plot(x[1,],x[2,],ylab="errores",xlab="valor de n", main="tStudent vs Z")
De la gráfica resulta claro que n=30 es un valor totalmente arbitrario sin fundamento sólido. Un valor entre 60 y 80 parece mucho más adecuado.
Comentarios
Publicar un comentario