使用曲线()绘制survreg的生存和危险函数

使用曲线()绘制survreg的生存和危险函数,r,plot,survival-analysis,weibull,parametric-equations,R,Plot,Survival Analysis,Weibull,Parametric Equations,我有以下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 L

我有以下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
我想根据上述估计绘制危险函数和生存函数。
我不想使用
predict()
pweibull()
(如此处或此处所示)

我想使用
curve()
函数。有什么想法可以实现吗?survreg的Weibull函数似乎使用了其他尺度和形状定义,而不是通常的定义(与rweibull不同)

更新:我想我真正需要它来表达危险/生存作为估计值的函数
截距
年龄(+其他潜在协变量)
缩放
,不使用任何现成的
*weilbull
函数。

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

要使用
曲线
函数,您需要将某些函数作为参数传递。确实,
*weibull
函数族对weibull函数使用了与
survreg
不同的参数化,但它可以很容易地进行转换,正如您的第一个链接所解释的那样。另外,从
survreg
中的文档中也可以看出:

有多种方法可以参数化威布尔分布 函数将其嵌入到通用位置刻度系列中,这是一个 与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
dweibull

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)
my.dweibull您的参数是:

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
软件包,以及
hweibull
hweibull


感谢您详尽的电子邮件,但我也不想使用任何
*weibull
函数。是否可以将危险表示为
拦截
年龄(+其他协变量)的函数
,和
scale
?嗯,也许你错过了我的最后一段,在那里我向你展示了如何编写一个只不过是
pweibull
包装的函数。我不知道你为什么要重写
pweibull
,因为它是用C编写的,而且速度很快,测试也很好。除非这只是家庭作业。总之,我向你展示了如何处理Code
pweibull
dweibull
。我认为OP忽略了R输出和危险/生存函数之间的数学联系
curve(1-((x/scale)^(shape)), from=0,to=12,ylab=expression(hat(S)(t)), col="darkred",xlab="t", lwd=5, ylim=c(0,1))