[R-es] Test K-S con distribuciones LogNormales

rubenfcasal rubenfcasal en gmail.com
Mie Oct 15 14:54:01 CEST 2014


Hola de nuevo,

     En cuanto a otro tipo de contrastes de bondad de ajuste, podrías 
pensar en emplear por ejemplo el test de Anderson-Darling (podríamos 
decir que es una mejora del KS, mira p.e. 
http://en.wikipedia.org/wiki/Anderson%E2%80%93Darling_test). Creo que 
está implementado en R (p.e. paquete goftest). Para contrastes de bondad 
de ajuste, yo tengo empleado el paquete fitdistrplus y otros asociados 
al paquete distr (el distrMod creo recordar...) .

     Una duda que tengo es porque comparas la distribución de las medias 
con la de los datos originales (ten también en cuenta que hay 
dependencia entre estas muestras, p.e su media muestral es exactamente 
la misma). Si tienes una distribución teórica, sería más eficiente 
comparar directamente con esta distribución, e.g.:
ks.test(lognorm2$sample, "plnorm", meanlog = mean, sdlog = sd )
Aunque sigo obteniendo p-valor=1 con tu ejemplo.
     Prueba también a variar los parámetros...

     Un saludo,
         Rubén F.C.

El 15/10/2014 11:26, Víctor Nalda Castellet escribió:
> Hola Ruben,
>
> Sí precisamente es lo que comentas, en matemáticas no se suele llamar 
> bucketización (este término se emplea más en informática) sino datos 
> agrupados. Pero la idea es la que tu mismo dices.
>
> Respecto a las gráficas que has puesto, me han aclarado mucho sobre el 
> tema, gracias.
>
> Si realizo lo mismo, por ejemplo con nbucket=1000 sigo obteniendo un 
> p-valor de 1. Es decir, que casi le pongas lo que le pongas se obtiene 
> un p-valor de 1.
>
> ¿Qué otros test de contraste de hipótesis me podrías recomendar? 
> Porque igual ocurre lo que tu bien has dicho de que el test de K-S no 
> es precisamente el mejor para este caso.
>
>
> Un saludo, y ¡¡¡muchas gracias!!!
>
> El 15 de octubre de 2014, 10:50, rubenfcasal <rubenfcasal en gmail.com 
> <mailto:rubenfcasal en gmail.com>> escribió:
>
>     Hola Víctor,
>
>         Te escribo sin tener muy claro lo que quieres hacer (me llamó
>     la atención lo de "datos bucketizados", es la primera vez que lo
>     veo en estadística, aunque la terminología me suena a informática...).
>
>         Si no entiendo mal, en el segundo caso trabajas con medias de
>     una distribución lognormal agrupada. Simplemente hacer notar que
>     la distribución teórica de estas medias no es lognormal y la
>     varianza no coincide con la de la distribución original (es la
>     original dividida por el tamaño de las submuestras =  n/nbucket).
>
>         En cuanto al test KS, ten en cuenta que lo que hace es
>     comparar funciones de distribución empíricas:
>     # La de los datos originales:
>     curve(ecdf(sample)(x), type="s")
>     # Esta se parece mucho a la teórica como sería de esperar con una
>     muestra tan grande:
>     # curve(plnorm(x, meanlog = mean, sdlog = sd), lwd=2,add=TRUE)
>
>     # con la de las medias de las submuestras:
>     curve(ecdf(sample_bucket$mean)(x),type="s",lty = 2, add = TRUE)
>
>         Lo que creo que ocurre es que la segunda muestra es muy
>     pequeña y el test de KS no tiene evidencias para rechazar la H0.
>     Si consideras un numero mayor de "buckets" debería rechazar. Ten
>     en cuenta también que el test KS puede no ser el más potente...
>
>         Un saludo,
>             Rubén F.C.
>
>
>
>
>     El 15/10/2014 9:59, Víctor Nalda Castellet escribió:
>
>         Hola a todos, ¿que tal?
>
>         Os escribo porque llevo varios días con la siguiente duda:
>         quiero realizar
>         el test de K-S para dos distribuciones lognormales, una de
>         ellas con datos
>         agrupados (bucketizados).
>
>         library(stats)
>
>         # Definimos las variables
>         n <- 1000000 # tamaño de la muestra
>         mean <- 0 # media de la dist. normal
>         sd <- 1 # desviación típica de la dist. normal
>         nbucket <- 10 # numero de buckets
>
>         # Generamos la muestra de tamaño n
>         sample <- sort(rlnorm(n, meanlog = mean, sdlog = sd))
>         # Función de distribución
>         df <- plnorm(sample, meanlog = mean, sdlog = sd)
>         lognorm1 <- data.frame(sample=sample, distfun=df)
>         # Gráfica de la función de distribución sin bucketizar
>         plot(lognorm1, type = "l", col = "red")
>
>         # Bucketización - Muestra bucketizada
>         library(plyr)
>         dt <- data.frame(sample=sample, bucket=rep(1:nbucket, each =
>         n/nbucket))
>         sample_bucket <- ddply(dt,~bucket,summarise,mean=mean(sample))
>
>         # Función de distribución bucketizada
>         dfb <- plnorm(sample_bucket$mean, meanlog = mean, sdlog = sd)
>         lognorm2 <- data.frame(sample=sample_bucket$mean, distfun=dfb)
>         par(new=TRUE)
>         points(lognorm2, col = "blue")
>
>         ks.test(lognorm1$sample, lognorm2$sample) # Obtengo p-valor=1
>
>         El problema es que obtengo un p-valor de 1, y creo que debería
>         obtener un
>         p-valor bastante menor. ¿Sabéis lo que está ocurriendo?
>         Creo que si una de las distribuciones tiene 1.000.000 de datos
>         y la otra
>         tiene 10 datos (es la aproximación de la otra), como no se
>         parecen en nada
>         debería obtener un p-valor muy malo y no es así:
>
>         Two-sample Kolmogorov-Smirnov test
>
>         data:  lognorm1$sample and lognorm2$sample
>         D = 0.0683, p-value = 1
>         alternative hypothesis: two-sided
>
>         Respecto al tema de bucketizar, lo tengo que realizar de esa
>         forma.
>
>
>
>         Un saludo, y muchas gracias.
>
>
>
>
>
> -- 
> Víctor Nalda Castellet


	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es