【问题标题】:Plot survival and hazard function of survreg using curve()使用曲线()绘制 survreg 的生存和危险函数
【发布时间】:2013-04-20 15:46:37
【问题描述】:

我有以下 survreg 模型:

Call:
survreg(formula = Surv(time = (ev.time), event = ev) ~ age, 
    data = my.data, dist = "weib")
             Value Std. Error    z        p
(Intercept) 4.0961     0.5566 7.36 1.86e-13
age         0.0388     0.0133 2.91 3.60e-03
Log(scale)  0.1421     0.1208 1.18 2.39e-01
Scale= 1.15 

Weibull distribution

我想根据上述估计绘制 hazard 函数和 survival 函数。
我不想使用predict()pweibull() (如此处Parametric Survival 或此处SO question 所示。

我想使用curve() 函数。有什么想法可以做到这一点吗? survreg 的 Weibull 函数似乎使用了不同于通常的尺度和形状定义(并且与 rweibull 不同)。

更新:我想我真正需要它来表达危险/生存作为估计的函数Interceptage (+ other potential covariates)Scale,而不使用任何现成的*weilbull函数.

【问题讨论】:

    标签: r plot survival-analysis weibull parametric-equations


    【解决方案1】:

    你的参数是:

    scale=exp(Intercept+beta*x) 在您的示例中,假设年龄=40

    scale=283.7
    

    你的形状参数是模型输出的比例的倒数

    shape=1/1.15
    

    那么危险是:

    curve((shape/scale)*(x/scale)^(shape-1), from=0,to=12,ylab=expression(hat(h)(t)), col="darkblue",xlab="t", lwd=5)
    

    累积风险函数为:

    curve((x/scale)^(shape), from=0,to=12,ylab=expression(hat(F)(t)), col="darkgreen",xlab="t", lwd=5)
    

    生存函数是1-累积风险函数,所以:

    curve(1-((x/scale)^(shape)), from=0,to=12,ylab=expression(hat(S)(t)), col="darkred",xlab="t", lwd=5, ylim=c(0,1))
    

    还可以查看eha 包以及函数hweibullHweibull

    【讨论】:

      【解决方案2】:

      first link you provided 实际上对它的工作原理有一个清晰的解释,还有一个可爱的例子。 (谢谢你,这是一个很好的资源,我将在自己的工作中使用。)

      要使用curve 函数,您需要传递一些函数作为参数。确实,*weibull 系列函数对 Weibull 使用的参数化与 survreg 不同,但它可以很容易地转换,如您的第一个链接所述。另外,来自survreg中的文档:

      有多种方法可以参数化 Weibull 分布。流浪者 函数将它嵌入到一个一般的位置尺度族中,这是一个 与 rweibull 函数不同的参数化,并且经常导致 混乱。

        survreg's scale  =    1/(rweibull shape)
        survreg's intercept = log(rweibull scale)
      

      这是一个简单转换的实现:

      # The parameters
      intercept<-4.0961
      scale<-1.15
      
      par(mfrow=c(1,2),mar=c(5.1,5.1,4.1,2.1)) # Make room for the hat.
      # S(t), the survival function
      curve(pweibull(x, scale=exp(intercept), shape=1/scale, lower.tail=FALSE), 
            from=0, to=100, col='red', lwd=2, ylab=expression(hat(S)(t)), xlab='t',bty='n',ylim=c(0,1))
      # h(t), the hazard function
      curve(dweibull(x, scale=exp(intercept), shape=1/scale)
            /pweibull(x, scale=exp(intercept), shape=1/scale, lower.tail=FALSE), 
            from=0, to=100, col='blue', lwd=2, ylab=expression(hat(h)(t)), xlab='t',bty='n')
      par(mfrow=c(1,1),mar=c(5.1,4.1,4.1,2.1))
      

      我了解您在回答中提到您不想使用 pweibull 函数,但我猜您不想使用它,因为它使用了不同的参数化。否则,您可以简单地编写自己的pweibull 版本,使用survreg 的参数化:

      my.weibull.surv<-function(x,intercept,scale) pweibull(x,scale=exp(intercept),shape=1/scale,lower.tail=FALSE)
      my.weibull.haz<-function(x,intercept,scale) dweibull(x, scale=exp(intercept), shape=1/scale) / pweibull(x,scale=exp(intercept),shape=1/scale,lower.tail=FALSE)
      
      curve(my.weibull.surv(x,intercept,scale),1,100,lwd=2,col='red',ylim=c(0,1),bty='n')
      curve(my.weibull.haz(x,intercept,scale),1,100,lwd=2,col='blue',bty='n')
      

      正如我在 cmets 中提到的,我不知道您为什么要这样做(除非这是家庭作业),但如果您愿意,您可以手动编码 pweibulldweibull

      my.dweibull <- function(x,shape,scale) (shape/scale) * (x/scale)^(shape-1) * exp(- (x/scale)^shape)
      my.pweibull <- function(x,shape,scale) exp(- (x/scale)^shape)
      

      这些定义直接来自?dweibull。现在只需包装那些速度较慢、未经测试的函数,而不是直接包装 pweibulldweibull

      【讨论】:

      • 感谢您精心制作的电子邮件,但我也不想使用任何 *weibull 函数。是否可以将危害表示为Interceptage (+other covariates)scale 的函数?
      • 嗯,也许你错过了我的最后一段,我在其中向你展示了如何编写一个简单的 pweibull 包装器的函数。我不知道您为什么要重写 pweibull,因为它是用 C 编码的,而且速度非常快且经过充分测试。除非这只是家庭作业。不管怎样,我教你如何手工编码pweibulldweibull
      • 我认为 OP 错过了 R 输出和危险/生存函数之间的数学联系
      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 2015-12-26
      • 2021-12-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多