簡體   English   中英

定義生存分布:: survreg()

[英]Defining a distribution for survival::survreg()

我嘗試使用伽瑪分布擬合survreg模型。

?survreg.distributions我定義了我的自定義分布,如下所示:

gamma <- list(name = 'gamma',
          parms = c(2,2),
          init = function(x, weights, ...){
            c(median(x), mad(x))
          },
          density = function(x, parms){
            shape <- parms[1]
            scale <- parms[2]
            cbind(pgamma(x, shape=shape, scale=scale),
                  1-pgamma(x, shape=shape, scale=scale),
                  dgamma(x, shape=shape, scale=scale),
                  (shape-1)/x - 1/scale,
                  (shape-1)*(shape-2)/x^2 - 2*(shape-1)/(x*scale) + 1/scale^2)
          },
          quantile = function(p, parms) {
            qgamma(p, shape=parms[1], scale=parms[2])
          },
          deviance = function(...) stop('deviance residuals not defined')
)

但是我不能讓它運行:

require(survival)
survreg(Surv(log(time), status) ~ ph.ecog + sex, lung, dist=gamma)
#Error in coxph.wtest(t(x) %*% (wt * x), c((wt * eta + weights * deriv$dg) %*%  : 
#  NA/NaN/Inf in foreign function call (arg 3)

該錯誤來自某些C代碼,但我認為它是更早產生的...

有任何關於survreg的提示/建議/替代方法嗎?

我找到了實現通用伽瑪分布的flexsurv軟件包。

對於Weibull分布, survregflexsurvreg的估計值相似(但請注意不同的參數化:

require(survival)
summary(survreg(Surv(log(time), status) ~ ph.ecog + sex, data = lung, dist='weibull'))

Call:
survreg(formula = Surv(log(time), status) ~ ph.ecog + sex, data = lung, 
    dist = "weibull")
              Value Std. Error      z         p
(Intercept)  1.7504     0.0364  48.13  0.00e+00
ph.ecog     -0.0660     0.0158  -4.17  3.10e-05
sex          0.0763     0.0237   3.22  1.27e-03
Log(scale)  -1.9670     0.0639 -30.77 6.36e-208

Scale= 0.14 

Weibull distribution
Loglik(model)= -270.5   Loglik(intercept only)= -284.3
    Chisq= 27.62 on 2 degrees of freedom, p= 1e-06 
Number of Newton-Raphson Iterations: 6 
n=227 (1 observation deleted due to missingness)


require(flexsurv)
flexsurvreg(Surv(log(time), status) ~ ph.ecog + sex, data = lung, dist='weibull')

Call:
flexsurvreg(formula = Surv(log(time), status) ~ ph.ecog + sex,     data = lung, dist = "weibull")

Maximum likelihood estimates: 
            est    L95%    U95%
shape    7.1500  6.3100  8.1000
scale    5.7600  5.3600  6.1800
ph.ecog -0.0660 -0.0970 -0.0349
sex      0.0763  0.0299  0.1230

N = 227,  Events: 164,  Censored: 63
Total time at risk: 1232.1
Log-likelihood = -270.5, df = 4
AIC = 549

使用flexsurvreg,我們可以將廣義伽馬分布擬合到此數據:

flexsurvreg(Surv(log(time), status) ~ ph.ecog + sex, data = lung, dist='gengamma')

Call:
flexsurvreg(formula = Surv(log(time), status) ~ ph.ecog + sex,     data = lung, dist = "gengamma")

Maximum likelihood estimates: 
            est    L95%    U95%
mu       1.7800  1.7100  1.8600
sigma    0.1180  0.0971  0.1440
Q        1.4600  1.0200  1.9100
ph.ecog -0.0559 -0.0853 -0.0266
sex      0.0621  0.0178  0.1060

N = 227,  Events: 164,  Censored: 63
Total time at risk: 1232.1
Log-likelihood = -267.57, df = 5
AIC = 545.15

loguristic分布不是內置的(與survreg相反),但是可以很容易地歸類(請參閱flexsurvreg示例)。

我還沒有對它進行過多的測試,但是flexsurv似乎是survival一個不錯的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM