我正在尝试使用有序逻辑回归(具体而言,来自MASS软件包的polr)来计算一组生物标记物的几率和相关的p值。我一直在使用epiDisplay包中的“ ordinal.or.display()”函数来查看回归结果,但请注意显示的p值与我手动计算的值之间的差异……大约是原来的两倍。当我使用正态分布计算时,它会很大。我是否缺少特定于序数逻辑回归的东西,还是epiDisplay函数存在问题?
我尝试查看epiDisplay软件包(https://cran.r-project.org/web/packages/epiDisplay/epiDisplay.pdf)的文档,但没有找到任何解释该p值是如何计算的。任何帮助或其他知识非常感谢!
#the model using polr from MASS
#generating artifical outcome var from mt cars
mtcars <- mtcars
mtcars$outcome <- round(runif(nrow(mtcars))*5)
myMod <-polr(ordered(outcome) ~ factor(am)+ factor(carb)+ wt,
data = mtcars,
Hess = TRUE)
summary <- summary(myMod)
(ctable <- coef(summary(myMod)))
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
## combined table: p = 0.624
(ctable <- cbind(ctable, "p value" = p))
ordinal.or.display(myMod) #p value = 0.312
我希望p值相同-epiDisplay可能不会乘以2吗?
答案 0 :(得分:0)
每当模拟数据时,请设置随机数种子。否则,我们将无法复制您的结果。
set.seed(123)
当您应该使用t分布时,已使用正态分布获取p值。因此,您用于计算p值的代码应为:
df <- summary(myMod)$df.residual
p <- pt(abs(ctable[, "t value"]), df=df, lower.tail=FALSE) * 2
这也是epiDisplay包中的ordinal.or.display
函数进行计算的方式。您可以通过查看第9行的代码进行检查。
library(epiDisplay)
ordinal.or.display
现在检查:
data(mtcars)
mtcars$outcome <- round(runif(nrow(mtcars))*5)
myMod <- polr(ordered(outcome) ~ factor(am)+ factor(carb)+ wt,
data = mtcars,
Hess = TRUE)
ctable <- coef(summary(myMod))
df <- summary(myMod)$df.residual
p <- pt(abs(ctable[, "t value"]), df=df, lower.tail=FALSE) * 2
options(digits=2)
(ctable <- cbind(ctable, "p value:" = p))
Value Std. Error t value p value:
am1 -2.335 1.19 -1.962 0.064
carb2 0.045 0.92 0.049 0.961
carb3 1.840 1.40 1.319 0.202
carb4 -0.618 1.16 -0.534 0.599
carb6 1.721 1.85 0.933 0.362
carb8 2.418 2.10 1.152 0.263
wt -0.875 0.68 -1.295 0.210
ordinal.or.display(myMod)
#Waiting for profiling to be done...
Ordinal OR lower95ci upper95ci P value
am1 0.097 0.009 0.971 0.064
carb2 1.046 0.166 6.477 0.961
carb3 6.298 0.428 112.827 0.202
carb4 0.539 0.051 5.065 0.599
carb6 5.59 0.121 273.826 0.362
carb8 11.218 0.162 864.225 0.263
wt 0.417 0.106 1.573 0.210
我也一样。