在 ggplot 或lattice 中利用 Surv 对象
有人知道如何利用 ggplot 或lattice 进行生存分析吗?制作网格或类似面的生存图会很好。
所以最后我尝试了一下,找到了卡普兰-迈耶图的解决方案。对于将列表元素放入数据框中的混乱代码,我深表歉意,但我无法找出其他方法。
注意:它仅适用于两层地层。如果有人知道我如何使用 x<-length(stratum) 来执行此操作,请告诉我(在 Stata 中,我可以附加到宏 - 不确定这在 R 中如何工作)。
ggkm<-function(time,event,stratum) {
m2s<-Surv(time,as.numeric(event))
fit <- survfit(m2s ~ stratum)
f$time <- fit$time
f$surv <- fit$surv
f$strata <- c(rep(names(fit$strata[1]),fit$strata[1]),
rep(names(fit$strata[2]),fit$strata[2]))
f$upper <- fit$upper
f$lower <- fit$lower
r <- ggplot (f, aes(x=time, y=surv, fill=strata, group=strata))
+geom_line()+geom_ribbon(aes(ymin=lower,ymax=upper),alpha=0.3)
return(r)
}
Anyone knows how to take advantage of ggplot or lattice in doing survival analysis? It would be nice to do a trellis or facet-like survival graphs.
So in the end I played around and sort of found a solution for a Kaplan-Meier plot. I apologize for the messy code in taking the list elements into a dataframe, but I couldnt figure out another way.
Note: It only works with two levels of strata. If anyone know how I can use x<-length(stratum)
to do this please let me know (in Stata I could append to a macro-unsure how this works in R).
ggkm<-function(time,event,stratum) {
m2s<-Surv(time,as.numeric(event))
fit <- survfit(m2s ~ stratum)
f$time <- fit$time
f$surv <- fit$surv
f$strata <- c(rep(names(fit$strata[1]),fit$strata[1]),
rep(names(fit$strata[2]),fit$strata[2]))
f$upper <- fit$upper
f$lower <- fit$lower
r <- ggplot (f, aes(x=time, y=surv, fill=strata, group=strata))
+geom_line()+geom_ribbon(aes(ymin=lower,ymax=upper),alpha=0.3)
return(r)
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我一直在
lattice
中使用以下代码。第一个函数绘制一个组的 KM 曲线,通常用作 panel.group 函数,而第二个函数添加整个面板的对数秩检验 p 值:审查指标有为 0-1 才能使此代码正常工作。用法如下:
如果您只使用“panel=panel.superpose”,那么您将无法获得 p 值。
I have been using the following code in
lattice
. The first function draws KM-curves for one group and would typically be used as thepanel.group
function, while the second adds the log-rank test p-value for the entire panel:The censoring indicator has to be 0-1 for this code to work. The usage would be along the following lines:
If you just use 'panel=panel.superpose' then you won't get the p-value.
我开始几乎完全遵循您在更新的答案中使用的方法。但 survfit 令人恼火的是它只标记变化,而不是每个刻度 - 例如,它会给你 0 - 100%、3 - 88%,而不是 0 - 100%、1 - 100%、2 - 100 %, 3 - 88%。如果将其输入 ggplot,您的线条将从 0 倾斜到 3,而不是保持平坦并直接下降到 3。根据您的应用程序和假设,这可能没问题,但这不是经典的 KM 图。这就是我处理不同数量的地层的方式:
对于它的价值,这就是我最终这样做的方式 - 但这也不是真正的 KM 图,因为我本身并没有计算出 KM 估计值(虽然我没有审查,所以这是等效的......我相信)。
I started out following almost exactly the approach you use in your updated answer. But the thing that's irritating about the survfit is that it only marks the changes, not each tick - e.g., it will give you 0 - 100%, 3 - 88% instead of 0 - 100%, 1 - 100%, 2 - 100%, 3 - 88%. If you feed that into ggplot, your lines will slope from 0 to 3, rather than remaining flat and dropping straight down at 3. That might be fine depending on your application and assumptions, but it's not the classic KM plot. This is how I handled the varying numbers of strata:
For what it's worth, this is how I ended up doing it - but this isn't really a KM plot, either, because I'm not calculating out the KM estimate per se (although I have no censoring, so this is equivalent... I believe).