Víctor Nalda Castellet
2014-Oct-15 09:26 UTC
[R-es] Test K-S con distribuciones LogNormales
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> 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]]
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]]
Víctor Nalda Castellet
2014-Oct-15 14:24 UTC
[R-es] Test K-S con distribuciones LogNormales
Hola Ruben, Gracias por los paquetes que me comentas para realizar los contrastes de bondad de ajuste. Voy a seguir variando parámetros para ver los resultados que obtengo. Un saludo y muchas gracias. El 15 de octubre de 2014, 14:54, rubenfcasal <rubenfcasal en gmail.com> escribió:> 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> > 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 > > >-- Víctor Nalda Castellet [[alternative HTML version deleted]]
Reasonably Related Threads
- Generating log transformed random numbers
- Solved (??) Behaviour of integrate (was 'Poisson-lognormal probab ility calculations')
- Behaviour of integrate (was 'Poisson-lognormal probability calcul ations')
- Poisson-lognormal probability calculations
- rlnorm(n, meanlog = 0, sdlog = 1)