Valor p de NaN cuando se usa el buen ajuste de R en datos binomiales

8

Estoy tratando de probar la bondad de ajuste para un vector de datos de conteo a un binomio. Para hacerlo, estoy usando la goodfit()función en el vcdpaquete. Cuando ejecuto la función, sin embargo, devuelve NaNel valor p de la prueba de Chi-cuadrado. En mi configuración, tengo un vector de datos de conteo con 75 elementos.

> library(vcd)
> counts <- c(32, 35, 44, 35, 41, 33, 42, 49, 36, 41, 42, 45, 38, 43, 36, 
35, 40, 40, 43, 34, 39, 31, 40, 39, 36, 37, 37, 37, 32, 48, 41, 
32, 37, 36, 49, 37, 41, 36, 34, 37, 41, 32, 36, 36, 30, 33, 33, 
42, 39, 36, 36, 29, 31, 41, 36, 39, 40, 37, 39, 39, 31, 39, 37, 
40, 33, 41, 34, 46, 35, 41, 44, 38, 44, 34, 42)
> test.gof <- goodfit(counts, type="binomial", 
+                     par=list(size=length(counts), prob=0.5))

Todo funciona bien, pero cuando inspecciono el goodfit()objeto obtengo lo siguiente:

> summary(test.gof)

 Goodness-of-fit test for binomial distribution

                      X^2 df  P(> X^2)
Pearson               NaN 75       NaN
Likelihood Ratio 21.48322 19 0.3107244
Warning message:
In summary.goodfit(test.gof) : Chi-squared approximation may be incorrect

Al principio sospeché que era un problema de tamaño de muestra pequeño, pero también tengo un conjunto de datos con 50 observaciones que no devuelve NaNel valor p. También he tratado de cambiar el método goodfit()a ML con resultados similares.

¿Por qué esta función estaría produciendo NaNen este caso? ¿Existe una función alternativa para calcular GOF en los datos de conteo?

DrewConway
fuente
@Gavin: ¿debería estar cerrado o podría ser movido?
Joshua Ulrich
@Joshua Si puede ser movido por un mod, lo mejor sería moverlo ya que @DrewConway ha hecho un trabajo razonable con la Q y la reproducibilidad. ¿Cómo logramos una migración? ¿Marcar la publicación?
Gavin Simpson
Maldición, estaba escribiendo una respuesta y tuve que moverme durante 10 minutos desde la máquina. Y ahora volví y vi tus comentarios. =)
aL3xa
Esta pregunta se ha fusionado con su casi duplicado.
whuber

Respuestas:

5

Tienes cero frecuencias en conteos observados. Eso explica NaNs en sus datos. Si observa el test.gofobjeto, verá que:

table(test.gof$observed)

 0  1  2  3  4  5  7  8 10 
56  5  3  2  5  1  1  2  1

Tienes 56 ceros. De todos modos, en mi humilde opinión esta pregunta es para http://stats.stackexchange.com .

aL3xa
fuente
1
Gracias por la nueva publicación de SO, pero ¿cómo recomienda que trate con los ceros dado que todavía quiero estimar un GOF?
DrewConway
Hola Drew, perdón por mi respuesta tardía. Bueno, en el caso de frecuencias cero, se recomienda (al menos eso me enseñaron) fusionar categorías, ya que Chi-cuadrado permite algunas frecuencias 0 (menos del 20% de frecuencias puede ser 0 cuando el factor tiene más de 2 niveles) , si eso es razonable, o dejar caer Chi-cuadrado y elegir una técnica alternativa. Como generalmente dejo caer la cosa, es posible que desee hacer otra pregunta con respecto a la prueba de bondad de ajuste adecuada.
aL3xa
3

¿Serías más feliz con un objeto goodfit alterado quirúrgicamente?

> idx <- which(test.gof$observed != 0)
> idx
 [1] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 49 50
> test.gof$par$size <- length(  idx-1)
> test.gof$fitted <- test.gof$fitted[idx]
> test.gof$count <- test.gof$count[idx]
> test.gof$observed <- test.gof$observed[idx]
> summary(test.gof)

     Goodness-of-fit test for binomial distribution

                      X^2 df  P(> X^2)
Pearson               Inf 75 0.0000000
Likelihood Ratio 21.48322 19 0.3107244
Warning message:
In summary.goodfit(test.gof) : Chi-squared approximation may be incorrect
DWin
fuente
Tramposo! / 10char :)
Brandon Bertelsen
0

Intenta trazarlo. Tendrás una mejor idea de lo que está sucediendo. Como se mencionó anteriormente, está obteniendo NaN porque está pasando 0 frecuencias a chisq.test ()

test.gof <- goodfit(counts, type="binomial", par=list(size=length(counts), prob=0.5)) 
plot(test.gof)
## doesn't look so good 
test.gof <- goodfit(counts, type="binomial", par=list(size=length(counts))) 
plot(test.gof)
## looks a little more clear
Brandon Bertelsen
fuente