Como usar o teste qui-quadrado para determinar se os dados seguem a distribuição de Poisson

10

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.

insira a descrição da imagem aqui

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 variabledifere 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 variablesegue 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)
luciano
fonte
λ

Respostas:

12

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:

  variable frequency
1        0        20
2        1        10
3        2         5
4        3         3
5        4         2
6        5         1

Então, quando você corre mean(df$variable), recebe 2.5, o que é exatamente o que isso significa 0:5. Ou seja, não é ponderado. Em vez disso, crie sua variável assim:

x = rep(0:5, times=c(20, 10, 5, 3, 2, 1))
table(x)
# x
#  0  1  2  3  4  5 
# 20 10  5  3  2  1
mean(x)
# [1] 1.02439

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:

probs = dpois(0:5, lambda=mean(x))
probs
# [1] 0.359015310 0.367771781 0.188370912 0.064321775 0.016472650 0.003374884
comp = 1-sum(probs)
# [1] 0.0006726867

Por fim, em R's chisq.test()função, o x=e y=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 de dpois()), 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 para y=. De qualquer forma, você realmente não precisa fazer isso, basta atribuir as probabilidades ao p=argumento. Além disso, você precisará adicionar um 0ao vetor de valores observados para representar todos os valores possíveis que não aparecem no seu conjunto de dados:

chisq.test(x=c(20, 10, 5, 3, 2, 1, 0), p=c(probs, comp))

#  Chi-squared test for given probabilities
# 
# data:  c(20, 10, 5, 3, 2, 1, 0)
# X-squared = 12.6058, df = 6, p-value = 0.04974
# 
# Warning message:
#   In chisq.test(x = c(20, 10, 5, 3, 2, 1, 0), p = c(probs, comp)) :
#   Chi-squared approximation may be incorrect

A mensagem de aviso sugere que podemos preferir simular, então tentamos novamente:

chisq.test(x=c(20, 10, 5, 3, 2, 1, 0), p=c(probs, comp), simulate.p.value=TRUE)

# Chi-squared test for given probabilities with simulated p-value 
#   (based on 2000 replicates)
# 
# data:  c(20, 10, 5, 3, 2, 1, 0)
# X-squared = 12.6058, df = NA, p-value = 0.07046

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:

- Reinstate Monica
fonte
3

Se eu entendi o que você quis dizer, deveria:

  1. estimar o parâmetro da distribuição Poisson para seus dados, assumindo que seja Poisson distribuído, digamos
lambdaEst = mean(x)
  1. 0,1,2,...
probTheo0 = dpois(x = 0, lambda = lambdaEst, log = FALSE)
  1. em seguida, compare as probabilidades reais com as teóricas por meio de um teste qui-quadrado seguindo esta abordagem Solução ChiSquare Test CV
Giorgio Spedicato
fonte