如何从 lrm() 获取 OR 和 95%CI?
How to get the OR and 95%CI from lrm()?
我想使用 rms
包来构建逻辑模型,但是如何从 lrm()
中获得 95%CI 的 OR?我只知道如何获取 OR 的值。
我的代码如下:
n <- 1000 # define sample size
set.seed(17) # so can reproduce the results
y <- rep(0:1, 500)
age <- rnorm(n, 50, 10)
sex <- factor(sample(c('female','male'), n,TRUE))
label(age) <- 'Age'
label(sex) <- 'Sex'
f <- lrm(y ~ age + sex, x=TRUE, y=TRUE)
f
# OR
exp(coef(f))
要获得每个变量的对数优势比的较低 95% 置信区间,您需要从估计值中减去标准误差的 1.96 倍。对数优势比的置信区间上限是添加到估计值的标准误差的 1.96 倍。当您对这些结果取幂时,您就有了比值比的置信区间。
使用数字 1.96 的原因是标准正态分布的 2.5% 分位数为 -1.96,其 97.5% 分位数为 +1.96。如果你想避免使用 1.96 作为“幻数”,你可以使用 qnorm
函数来代替(见下文)。
lrm
对象的困难在于标准错误不直接存储在模型对象中,而是在每次打印到控制台时计算出来。但是,您可以通过对矩阵 var
的对角线求平方根来轻松获得它们,即 是 f
的成员:
sqrt(diag(f$var))
#> Intercept age sex=male
#> 0.326635446 0.006222249 0.126599055
您可以检查这是否与模型摘要中的标准误差列相同。
因此,要获得优势比及其置信区间的数据框,您可以这样做:
df <- data.frame(variable = colnames(f$var),
OR = exp(f$coefficients),
OR_lower = exp(f$coefficients + qnorm(0.025) * sqrt(diag(f$var))),
OR_upper = exp(f$coefficients + qnorm(0.975) * sqrt(diag(f$var))),
row.names = NULL)
df
#> variable OR OR_lower OR_upper
#> 1 Intercept 1.1107651 0.5855846 2.106953
#> 2 age 0.9990378 0.9869282 1.011296
#> 3 sex=male 0.8935087 0.6971681 1.145144
我想使用 rms
包来构建逻辑模型,但是如何从 lrm()
中获得 95%CI 的 OR?我只知道如何获取 OR 的值。
我的代码如下:
n <- 1000 # define sample size
set.seed(17) # so can reproduce the results
y <- rep(0:1, 500)
age <- rnorm(n, 50, 10)
sex <- factor(sample(c('female','male'), n,TRUE))
label(age) <- 'Age'
label(sex) <- 'Sex'
f <- lrm(y ~ age + sex, x=TRUE, y=TRUE)
f
# OR
exp(coef(f))
要获得每个变量的对数优势比的较低 95% 置信区间,您需要从估计值中减去标准误差的 1.96 倍。对数优势比的置信区间上限是添加到估计值的标准误差的 1.96 倍。当您对这些结果取幂时,您就有了比值比的置信区间。
使用数字 1.96 的原因是标准正态分布的 2.5% 分位数为 -1.96,其 97.5% 分位数为 +1.96。如果你想避免使用 1.96 作为“幻数”,你可以使用 qnorm
函数来代替(见下文)。
lrm
对象的困难在于标准错误不直接存储在模型对象中,而是在每次打印到控制台时计算出来。但是,您可以通过对矩阵 var
的对角线求平方根来轻松获得它们,即 是 f
的成员:
sqrt(diag(f$var))
#> Intercept age sex=male
#> 0.326635446 0.006222249 0.126599055
您可以检查这是否与模型摘要中的标准误差列相同。
因此,要获得优势比及其置信区间的数据框,您可以这样做:
df <- data.frame(variable = colnames(f$var),
OR = exp(f$coefficients),
OR_lower = exp(f$coefficients + qnorm(0.025) * sqrt(diag(f$var))),
OR_upper = exp(f$coefficients + qnorm(0.975) * sqrt(diag(f$var))),
row.names = NULL)
df
#> variable OR OR_lower OR_upper
#> 1 Intercept 1.1107651 0.5855846 2.106953
#> 2 age 0.9990378 0.9869282 1.011296
#> 3 sex=male 0.8935087 0.6971681 1.145144