我有兴趣从clogit模型中获取设定位置的拟合值。这包括人口水平响应及其周围的置信区间。例如,我的数据看起来大致如下:
set.seed(1)
data <- data.frame(Used = rep(c(1,0,0,0),1250),
Open = round(runif(5000,0,50),0),
Activity = rep(sample(runif(24,.5,1.75),1250, replace=T), each=4),
Strata = rep(1:1250,each=4))
在Clogit模型中,活动在一个阶层内不会发生变化,因此没有活动的主要影响。
mod <- clogit(Used ~ Open + I(Open*Activity) + strata(Strata),data=data)
我想要做的是建立一个新的数据框架,我最终可以在Open的指定位置绘制边缘拟合值,类似于传统glm模型中的新数据设计:例如,
newdata <- data.frame(Open = seq(0,50,1),
Activity = rep(max(data$Activity),51))
但是,当我尝试在clogit上运行预测函数时,我收到以下错误:
fit<-predict(mod,newdata=newdata,type = "expected")
Surv中的错误(rep(1,3000L),已使用):未找到对象“已使用”
我意识到这是因为r中的clogit正在通过Cox.ph运行,因此,预测函数试图预测同一层内的对象之间的相对风险(在这种情况下=使用)。
我的问题是,如果有办法解决这个问题。这很容易在Stata(使用边距命令)中完成,并在Excel中手动完成,但是我想在R中自动执行,因为其他所有内容都是在那里编程的。我也在R中手动构建了这个(下面的示例代码),但是我仍然在我的实际数据中看到不正确的CI,因此我希望尽可能依赖于预测函数。我的手动预测代码是:
coef<-data.frame(coef = summary(mod)$coefficients[,1],
se= summary(mod)$coefficients[,3])
coef$se <-summary(mod)$coefficients[,4]
coef$UpCI <- coef[,1] + (coef[,2]*2) ### this could be *1.96 but using 2 for simplicity
coef$LowCI <-coef[,1] - (coef[,2]*2) ### this could be *1.96 but using 2 for simplicity
fitted<-data.frame(Open= seq(0,50,2),
Activity=rep(max(data$Activity),26))
fitted$Marginal <- exp(coef[1,1]*fitted$Open +
coef[2,1]*fitted$Open*fitted$Activity)/
(1+exp(coef[1,1]*fitted$Open +
coef[2,1]*fitted$Open*fitted$Activity))
fitted$UpCI <- exp(coef[1,3]*fitted$Open +
coef[2,3]*fitted$Open*fitted$Activity)/
(1+exp(coef[1,3]*fitted$Open +
coef[2,3]*fitted$Open*fitted$Activity))
fitted$LowCI <- exp(coef[1,4]*fitted$Open +
coef[2,4]*fitted$Open*fitted$Activity)/
(1+exp(coef[1,4]*fitted$Open +
coef[2,4]*fitted$Open*fitted$Activity))
理想情况下,我的最终产品看起来像是预测功能的产品......
答案 0 :(得分:1)
显然,Terry Therneau对于clogit模型的预测问题不那么纯粹:http://markmail.org/search/?q=list%3Aorg.r-project.r-help+predict+clogit#query:list%3Aorg.r-project.r-help%20predict%20clogit%20from%3A%22Therneau%2C%20Terry%20M.%2C%20Ph.D.%22+page:1+mid:tsbl3cbnxywkafv6+state:results
这是对代码的修改,它会生成51个预测。需要放入一个虚拟Strata
列。
newdata <- data.frame(Open = seq(0,50,1),
Activity = rep(max(data$Activity),51), Strata=1)
risk <- predict(mod,newdata=newdata,type = "risk")
> risk/(risk+1)
1 2 3 4 5 6 7
0.5194350 0.5190029 0.5185707 0.5181385 0.5177063 0.5172741 0.5168418
8 9 10 11 12 13 14
0.5164096 0.5159773 0.5155449 0.5151126 0.5146802 0.5142478 0.5138154
15 16 17 18 19 20 21
0.5133829 0.5129505 0.5125180 0.5120855 0.5116530 0.5112205 0.5107879
22 23 24 25 26 27 28
0.5103553 0.5099228 0.5094902 0.5090575 0.5086249 0.5081923 0.5077596
29 30 31 32 33 34 35
0.5073270 0.5068943 0.5064616 0.5060289 0.5055962 0.5051635 0.5047308
36 37 38 39 40 41 42
0.5042981 0.5038653 0.5034326 0.5029999 0.5025671 0.5021344 0.5017016
43 44 45 46 47 48 49
0.5012689 0.5008361 0.5004033 0.4999706 0.4995378 0.4991051 0.4986723
50 51
0.4982396 0.4978068
{警告}:凡人都很难确定哪一个R神相信这一个。我从这些专家那里学到了很多R和统计数据。我怀疑有一些我不太了解的统计问题或解释。