A figura abaixo (Figura 1 da p. 646 deste artigo ) compara os valores observados com os valores esperados na distribuição de Poisson. Em seguida, ele executa um teste qui-quadrado para verificar se os valores observados diferem dos valores esperados na distribuição de Poisson.
Usando R, como é possível gerar valores esperados sob a distribuição de Poisson e comparar valores observados usando um teste qui-quadrado?
EDITAR:
Aqui está minha tentativa de fazer o que eles fizeram no papel. Quero saber se a distribuição observada variable
difere da distribuição de Poisson. Também quero saber se o que fiz abaixo é o mesmo procedimento que eles fizeram no papel. Como o valor P é> 0,05, concluí abaixo que a distribuição de variable
segue uma distribuição de Poisson - alguém poderia confirmar isso?
df <- data.frame(variable = 0:5, frequency = c(20, 10, 5, 3, 2, 1))
# estimate lambda
mean_df_variable <- mean(df$variable)
# calculate expected values if df$frequency follows a poisson distribution
library(plyr)
expected <- laply(0:5, function(x) dpois(x=x, lambda=mean_df_variable, log = FALSE))
# calculate actual distribution of df$frequency
observed <- df$frequency/sum(df$frequency)
# does distribution of df$frequency differ from a poisson distribution? Apparently
# not because P-value is > 0.05
chisq.test(expected, observed)
Respostas:
A maneira como você fez o teste do qui-quadrado não está correta. Existem vários problemas. Primeiro, seu quadro de dados fica assim:
Então, quando você corre
mean(df$variable)
, recebe2.5
, o que é exatamente o que isso significa0:5
. Ou seja, não é ponderado. Em vez disso, crie sua variável assim:A
table()
chamada mostra que o código nos dá o que queríamos e, portanto,mean()
estima lambda corretamente.Em seguida, suas probabilidades estimadas vão apenas para
5
, mas a distribuição de Poisson vai para o infinito. Portanto, é necessário considerar as probabilidades dos valores que você não possui no seu conjunto de dados. Isso não é difícil, basta calcular o complemento:Por fim, em
R
'schisq.test()
função, ox=
ey=
argumentos não são exatamente para os valores esperados e observados na forma como você configurar isso. Por um lado, o que você está chamando de "esperado" são na verdade probabilidades (ou seja, a saída dedpois()
), para produzir esses valores esperados, você teria que multiplicar essas probabilidades (e não se esqueça de incluir o elogio) pela contagem total. Mas, mesmo assim, você não usaria isso paray=
. De qualquer forma, você realmente não precisa fazer isso, basta atribuir as probabilidades aop=
argumento. Além disso, você precisará adicionar um0
ao vetor de valores observados para representar todos os valores possíveis que não aparecem no seu conjunto de dados:A mensagem de aviso sugere que podemos preferir simular, então tentamos novamente:
Esse é presumivelmente um valor p mais preciso, mas levanta uma questão sobre como deve ser interpretado. Você pergunta "Como o valor P é> 0,05, concluí abaixo que a distribuição da variável segue uma distribuição de Poisson - alguém poderia confirmar isso?" Usando a abordagem correta, notamos que o primeiro valor p foi apenas <0,05, mas o segundo valor simulado (p) foi apenas> 0,05. Embora o último valor-p seja mais preciso, não me apressaria em concluir que os dados vieram de uma distribuição de Poisson. Aqui estão alguns fatos a serem lembrados:
fonte
Se eu entendi o que você quis dizer, deveria:
fonte