Bagaimana cara menghitung nilai p dari odds ratio dalam R?

8

Saya memiliki daftar nilai berikut:

25  75
38  162

Rasio peluang adalah 0,7037 dan log (OR) adalah -0,3514. Untuk tabel kontingensi dengan nilai a, b, c, dan d, varian log (OR) diberikan oleh

(1/a + 1/b + 1/c + 1/d)

Bagaimana saya bisa menghitung p.value log (OR) dari data ini dalam R (apakah berbeda secara signifikan dari 0)?

juga
sumber

Jawaban:

9

Anda dapat menggunakan uji eksak Fisher, yang menginput tabel kontingensi dan mengeluarkan nilai-p, dengan hipotesis nol bahwa rasio odds adalah 1 dan hipotesis alternatif bahwa rasio odds tidak sama dengan 1.

(tab <- matrix(c(38, 25, 162, 75), nrow=2))
#      [,1] [,2]
# [1,]   38  162
# [2,]   25   75
fisher.test(tab)
# 
#   Fisher's Exact Test for Count Data
# 
# data:  tab
# p-value = 0.2329
# alternative hypothesis: true odds ratio is not equal to 1
# 95 percent confidence interval:
#  0.3827433 1.3116294
# sample estimates:
# odds ratio 
#  0.7045301 

Dalam hal ini nilai p adalah 0,23.

Josliber
sumber
Terima kasih atas cara cerdik untuk menentukan nilai p. Tes chi-square juga dapat digunakan dengan cara yang sama.
rnso
@ rnso pasti, meskipun uji pasti Fisher lebih disukai daripada Chi-square ketika Anda memiliki ukuran sel kecil di tabel kontingensi Anda.
josliber
4
Ini adalah mitos lama tapi sayangnya tidak benar. Pearson biasaχ2 memberikan lebih akurat P-nilai lebih dari yang disebut uji "tepat" Fisher bahkan ketika frekuensi yang diharapkan serendah 1,0.
Frank Harrell
dapatkah Anda mengatakan sedikit lebih banyak tentang @ FrankHarrell ini? Saya tahuχ2 akan menjadi hasil asimptotik, sedangkan uji eksak Fisher bergantung pada distribusi yang tepat, bagaimana p-nilai lebih "akurat" menggunakan metode asimptotik?
bdeonovic
1
Lihat komentar lengkap tentang ini di situs. Secara singkat, nilai-P dari uji Fisher terlalu besar. Kesalahan absolut rata-rata dalam nilai-P dari uji Pearson lebih kecil. Fisher hanya "tepat" dalam arti bahwa nilai-P "dijamin" tidak terlalu kecil.
Frank Harrell
9

Cara lain untuk melakukannya (selain uji eksak Fisher) adalah dengan memasukkan nilai-nilai ke dalam GLM binomial:

d <- data.frame(g=factor(1:2),
                s=c(25,75),
                f=c(38,162))
g <- glm(s/(s+f)~g,weights=s+f,data=d,
    family="binomial")
coef(summary(g))["g2",c("Estimate","Pr(>|z|)")]
##   Estimate   Pr(>|z|) 
## -0.3513979  0.2303337 

Untuk mendapatkan tes rasio kemungkinan (sedikit lebih akurat daripada Wald p-nilai yang ditunjukkan di atas), lakukan

anova(g,test="Chisq")

pemberian yang mana

##      Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL                     1     1.4178         
## g     1   1.4178         0     0.0000   0.2338

(LRT p=0.2338 Wald p=0.2303337 Nelayan p=0.2329 dalam hal ini karena sampelnya cukup besar)

Ben Bolker
sumber
4

Lebih baik menggeneralisasi solusi dan menggunakan rasio kemungkinan χ2uji dari model statistik seperti model logistik. Tes LR memberikan hasil yang cukup akuratP-nilai. Ini juga menangani kasus-kasus di mana Anda perlu menguji lebih dari satu parameter, misalnya, masalah 3-grup, efek kontinu yang nonlinier, dll. Tes LR untuk model keseluruhan (yang diperlukan dalam contoh ini karena tidak ada penyesuaian variabel) dapat dengan mudah diperoleh dalam basis R atau menggunakan rmspaket, misalnya

f <- lrm(y ~ groups, weights=freqs)
f  # prints LR chi-sq, d.f., P, many other quantities

Di sini model bersarang adalah model ini dan model intersep-only.

Frank Harrell
sumber
Saya dapat menemukan bahwa uji LR (lrtest) digunakan untuk membandingkan model bersarang. Bagaimana kita bisa menggunakannya di sini? Bisakah Anda menulis satu baris kode R untuk itu?
rnso
untuk apa nilainya ini kurang lebih pendekatan statistik yang sama (walaupun dengan penjelasan yang lebih baik) seperti pada jawaban saya di atas. lrm()memiliki standar yang berbeda, format keluaran, dll., tetapi model statistik (IIUC) sama denganglm(...,family="binomial")
Ben Bolker