如何计算 R 中优势比的 p.value?

机器算法验证 r 方差
2022-03-14 10:21:25

我有以下值表:

25  75
38  162

优势比为 0.7037,log(OR) 为 -0.3514。对于具有值 a、b、c 和 d 的列联表,lo​​g(OR) 的方差由下式给出

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

如何从 R 中的这些数据计算 log(OR) 的 p.value(它是否与 0 显着不同)?

3个回答

您可以使用 Fisher 精确检验,该检验输入列联表并输出 p 值,零假设为优势比为 1,备择假设为优势比不等于 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 

在这种情况下,p 值为 0.23。

另一种方法(Fisher 精确检验除外)是将值放入二项式 GLM:

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 

稍微准确一些),请执行p

anova(g,test="Chisq")

这使

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

(在这种情况下,LRT Wald Fisher因为样本相当大)p=0.2338p=0.2303337p=0.2329

最好对解决方案进行泛化,并使用逻辑模型等统计模型中LR 检验提供了相当准确的值。这也可以处理需要测试多个参数的情况,例如 3 组问题、非线性的连续效应等。整个模型的 LR 测试(这是本示例中所需的全部,因为没有调整变量)可以很容易地在基础 R 中或使用包中获得,例如χ2Prms

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

这里的嵌套模型是这个模型和一个仅拦截模型。