Cox 回归 HR 分组
Cox regression HR grouping
我想对以下问题进行 Cox 回归:一组患者是否接受“药物”治疗 (0 / 1)。我的时间变量“时间”告诉我观察患者的天数以及患者存活或死亡的“状态”(死亡 = 1,存活 = 0)。
library(survival)
set.seed(123)
df <- data.frame(time = round(runif(100, min = 1, max = 70)),
status = round(runif(100, min = 0, max = 1)),
drug = round(runif(100, min = 0, max = 1)),
age40 = round(runif(100, min = 0, max = 1)),
stringsAsFactors = FALSE)
object <- Surv(df$time, df$status)
model <- coxph(object ~ drug, data = df)
summary(model)
这对我来说效果很好,告诉我 HR 是 0.89,所以药物可以防止患者死亡。
现在我想做一些亚组分析,f.e。如果患者 <= 40 岁或 > 40 岁(40 岁:0 对 1),HR 如何变化。
我需要做的就是将变量“age40”包含到 coxph 中吗?
object2 <- Surv(df$time, df$status)
model2 <- coxph(object2 ~ drug + age40, data = df)
summary(model2)
如果我这样做,我在 drug1 摘要中的 HR 会略微变为 0.86,我会得到另一个 age40 (1.12)。
现在我的问题是:如果患者 <= 40 岁或 > 40 岁,在接受治疗(药物 = 1)时死亡的风险比如何。
编辑:另一个问题是在森林图中以图形方式显示药物对状态影响的不同 HRs、f.e。像这样:https://rpkgs.datanovia.com/survminer/reference/ggforest-2.png。
我想显示 Age40 = 0 vs. 1 和其他变量的 HR,而不是“性”、“rx”、“坚持”等,例如高血压 = 0 vs. 1,吸烟者 = 0 vs. 1。
谢谢!
使用参数 strata
.
coxph(object ~ drug + strata(age40), data = df)
您需要使用的函数是 model2
上的 predict
,并且需要为其提供一个新数据参数,其中包含您要考虑的所有情况:
exp( predict(model2, newdata=expand.grid(drug=c(0,1), age40=c(0,1))) )
# 1 2 3 4
#1.0000000 0.8564951 1.1268713 0.9651598
您现在已经掌握了所有 4 种药物和年龄 40 可能组合的情况。基本案例具有统一值,因为您正在从 {drug=0, age40=0} 的基线案例中估算风险比率您可以看到其他风险比率与什么相关
expand.grid(drug=c(0,1), age40=c(0,1))
drug age40
1 0 0
2 1 0
3 0 1
4 1 1
请注意,drug=0 与 drug=1 的比例对于单独考虑的每个年龄类别都是相同的。如果您想查看药物对两个年龄组的影响是否不同,您会使用交互模型:
model3 <- coxph(object2 ~ drug * age40, data = df)
summary(model3)
#----------------
Call:
coxph(formula = object2 ~ drug * age40, data = df)
n= 100, number of events= 50
coef exp(coef) se(coef) z Pr(>|z|)
drug -0.18524 0.83091 0.45415 -0.408 0.683
age40 0.09611 1.10089 0.39560 0.243 0.808
drug:age40 0.05679 1.05843 0.63094 0.090 0.928
exp(coef) exp(-coef) lower .95 upper .95
drug 0.8309 1.2035 0.3412 2.024
age40 1.1009 0.9084 0.5070 2.390
drug:age40 1.0584 0.9448 0.3073 3.645
Concordance= 0.528 (se = 0.042 )
Likelihood ratio test= 0.34 on 3 df, p=1
Wald test = 0.33 on 3 df, p=1
Score (logrank) test = 0.33 on 3 df, p=1
现在效果估计有点不同:
exp( predict(model3, newdata=expand.grid(drug=c(0,1), age40=c(0,1))) )
# 1 2 3 4
#1.0000000 0.8309089 1.1008850 0.9681861
我想对以下问题进行 Cox 回归:一组患者是否接受“药物”治疗 (0 / 1)。我的时间变量“时间”告诉我观察患者的天数以及患者存活或死亡的“状态”(死亡 = 1,存活 = 0)。
library(survival)
set.seed(123)
df <- data.frame(time = round(runif(100, min = 1, max = 70)),
status = round(runif(100, min = 0, max = 1)),
drug = round(runif(100, min = 0, max = 1)),
age40 = round(runif(100, min = 0, max = 1)),
stringsAsFactors = FALSE)
object <- Surv(df$time, df$status)
model <- coxph(object ~ drug, data = df)
summary(model)
这对我来说效果很好,告诉我 HR 是 0.89,所以药物可以防止患者死亡。
现在我想做一些亚组分析,f.e。如果患者 <= 40 岁或 > 40 岁(40 岁:0 对 1),HR 如何变化。
我需要做的就是将变量“age40”包含到 coxph 中吗?
object2 <- Surv(df$time, df$status)
model2 <- coxph(object2 ~ drug + age40, data = df)
summary(model2)
如果我这样做,我在 drug1 摘要中的 HR 会略微变为 0.86,我会得到另一个 age40 (1.12)。
现在我的问题是:如果患者 <= 40 岁或 > 40 岁,在接受治疗(药物 = 1)时死亡的风险比如何。
编辑:另一个问题是在森林图中以图形方式显示药物对状态影响的不同 HRs、f.e。像这样:https://rpkgs.datanovia.com/survminer/reference/ggforest-2.png。 我想显示 Age40 = 0 vs. 1 和其他变量的 HR,而不是“性”、“rx”、“坚持”等,例如高血压 = 0 vs. 1,吸烟者 = 0 vs. 1。
谢谢!
使用参数 strata
.
coxph(object ~ drug + strata(age40), data = df)
您需要使用的函数是 model2
上的 predict
,并且需要为其提供一个新数据参数,其中包含您要考虑的所有情况:
exp( predict(model2, newdata=expand.grid(drug=c(0,1), age40=c(0,1))) )
# 1 2 3 4
#1.0000000 0.8564951 1.1268713 0.9651598
您现在已经掌握了所有 4 种药物和年龄 40 可能组合的情况。基本案例具有统一值,因为您正在从 {drug=0, age40=0} 的基线案例中估算风险比率您可以看到其他风险比率与什么相关
expand.grid(drug=c(0,1), age40=c(0,1))
drug age40
1 0 0
2 1 0
3 0 1
4 1 1
请注意,drug=0 与 drug=1 的比例对于单独考虑的每个年龄类别都是相同的。如果您想查看药物对两个年龄组的影响是否不同,您会使用交互模型:
model3 <- coxph(object2 ~ drug * age40, data = df)
summary(model3)
#----------------
Call:
coxph(formula = object2 ~ drug * age40, data = df)
n= 100, number of events= 50
coef exp(coef) se(coef) z Pr(>|z|)
drug -0.18524 0.83091 0.45415 -0.408 0.683
age40 0.09611 1.10089 0.39560 0.243 0.808
drug:age40 0.05679 1.05843 0.63094 0.090 0.928
exp(coef) exp(-coef) lower .95 upper .95
drug 0.8309 1.2035 0.3412 2.024
age40 1.1009 0.9084 0.5070 2.390
drug:age40 1.0584 0.9448 0.3073 3.645
Concordance= 0.528 (se = 0.042 )
Likelihood ratio test= 0.34 on 3 df, p=1
Wald test = 0.33 on 3 df, p=1
Score (logrank) test = 0.33 on 3 df, p=1
现在效果估计有点不同:
exp( predict(model3, newdata=expand.grid(drug=c(0,1), age40=c(0,1))) )
# 1 2 3 4
#1.0000000 0.8309089 1.1008850 0.9681861