Cara menggunakan uji chi-squared untuk menentukan apakah data mengikuti distribusi Poisson

10

Gambar di bawah ini (Gambar 1 dari hal. 646 tulisan ini ) membandingkan nilai yang diamati dengan nilai yang diharapkan di bawah distribusi Poisson. Kemudian menjalankan uji chi-squared untuk melihat apakah nilai yang diamati berbeda dari nilai yang diharapkan di bawah distribusi Poisson.

masukkan deskripsi gambar di sini

Dengan menggunakan R, bagaimana mungkin untuk menghasilkan nilai yang diharapkan di bawah distribusi Poisson dan membandingkan nilai yang diamati menggunakan uji chi-squared?

EDIT:

Inilah upaya saya untuk melakukan apa yang mereka lakukan di kertas. Saya ingin tahu apakah distribusi yang diamati variableberbeda dari distribusi Poisson. Saya juga ingin tahu apakah yang saya lakukan di bawah ini adalah prosedur yang sama dengan apa yang mereka lakukan di kertas. Karena nilai-P> 0,05, saya telah menyimpulkan di bawah ini bahwa distribusi variablemengikuti distribusi Poisson - dapatkah seseorang mengonfirmasi hal ini?

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
sumber
Saya tidak cukup mengikuti pertanyaan Anda. Nilai yang diharapkan dari distribusi Poisson adalah , mean. Itu tidak ada hubungannya dengan w / R. Jika Anda mengharapkan & mengamati nilai-nilai, Anda dapat melakukan uji chi-squared secara manual di R; Saya tunjukkan bagaimana melakukannya di sini: Apa yang salah dengan perhitungan chi-squared ini? λ
gung - Reinstate Monica

Jawaban:

12

Cara Anda melakukan tes chi-squared tidak benar. Ada beberapa masalah. Pertama, bingkai data Anda terlihat seperti ini:

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

Jadi, ketika Anda berlari mean(df$variable), Anda dapatkan 2.5, yang hanya berarti dari 0:5. Artinya, tidak tertimbang. Sebagai gantinya, buat variabel Anda seperti ini:

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

The table()panggilan menunjukkan bahwa kode memberi kita apa yang kita inginkan, dan mean()memperkirakan lambda dengan benar.

Selanjutnya, perkiraan probabilitas Anda hanya berlaku 5, tetapi distribusi Poisson pergi hingga tak terbatas. Jadi, Anda perlu memperhitungkan probabilitas nilai-nilai yang tidak Anda miliki dalam dataset Anda. Ini tidak sulit dilakukan, Anda hanya menghitung komplemen:

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

Terakhir, di R's chisq.test()fungsi, x=dan y=argumen yang tidak tepat untuk nilai-nilai yang diharapkan dan diamati dalam cara Anda mengatur ini. Untuk satu hal, apa yang Anda sebut "diharapkan" sebenarnya adalah probabilitas (yaitu, output dari dpois()), untuk membuat nilai-nilai yang diharapkan ini, Anda harus melipatgandakan probabilitas tersebut (dan pastikan untuk memasukkan pujian) dengan jumlah total. Tetapi meskipun begitu, Anda tidak akan menggunakannya untuk itu y=. Bagaimanapun, Anda tidak benar-benar harus melakukan itu, Anda hanya dapat menetapkan probabilitas untuk p=argumen. Selain itu, Anda perlu menambahkan a 0ke vektor nilai yang Anda amati untuk mewakili semua nilai yang mungkin tidak muncul dalam dataset Anda:

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

Pesan peringatan menyarankan agar kami lebih memilih untuk mensimulasikan, jadi kami coba lagi:

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

Ini mungkin nilai p yang lebih akurat, tetapi menimbulkan pertanyaan tentang bagaimana hal itu harus ditafsirkan. Anda bertanya "Karena nilai-P> 0,05, saya telah menyimpulkan di bawah ini bahwa distribusi variabel mengikuti distribusi Poisson - dapatkah seseorang mengkonfirmasi hal ini?" Dengan menggunakan pendekatan yang benar, kami mencatat bahwa nilai p pertama hanya <.05, tetapi nilai p kedua (disimulasikan) hanya> .05. Meskipun p-value terakhir lebih akurat, saya tidak akan terburu-buru untuk menyimpulkan bahwa data memang berasal dari distribusi Poisson. Berikut adalah beberapa fakta yang perlu diingat:

gung - Pasang kembali Monica
sumber
3

Jika saya mengerti maksud Anda, Anda harus:

  1. perkirakan parameter distribusi Poisson untuk data Anda, anggaplah distribusi Poisson, katakanlah
lambdaEst = mean(x)
  1. menghitung, untuk masing-masing , probabilitas teoretisnya dengan asumsi distribusi Poisson, misalnya0,1,2,...
probTheo0 = dpois(x = 0, lambda = lambdaEst, log = FALSE)
  1. kemudian membandingkan aktual dengan probabilitas teoritis melalui uji chi-square mengikuti pendekatan ini solusi ChiSquare Test CV
Giorgio Spedicato
sumber