我正在尝试使用 ML 估计删失数据的三参数 Weibull 分布的参数。
我已经通过使用flexsurv
我定义了“自己的”密度函数的包来解决这个问题。
我还按照函数文档中给出的说明flexsurv::flexsurvreg
构建了包含所有必需信息的列表,以使用客户密度函数执行 MLE。
在下面你可以看到我到目前为止所做的。
library(FAdist)
library(flexsurv)
set.seed(1)
thres <- 3500
data <- rweibull(n = 1000, shape = 2.2, scale = 25000) + thres
y <- sample(c(0, 1), size = 1000, replace = TRUE)
df1 <- data.frame(x = data, status = y)
dweib3 <- function(x, shape, scale, thres, log = FALSE) {
dweibull(x - thres, shape, scale, log = log)
}
pweib3 <- function(q, shape, scale, thres, log_p = FALSE) {
pweibull(q - thres, shape, scale, log.p = log_p)
}
# Not required
#qweib3 <- function(p, shape, scale, thres, log.p = FALSE) {
# if (log.p == TRUE) {
# p <- exp(p)
# }
# qwei3 <- thres + qweibull(p, shape, scale)
# return(qwei3)
#}
dweib3 <- Vectorize(dweib3)
pweib3 <- Vectorize(pweib3)
custom.weibull <- list(name = "weib3",
pars = c('shape', 'scale', 'thres'), location = 'scale',
transforms = c(log, log, log),
inv.transforms = c(exp, exp, exp),
inits = function(t) {
c(1.2 / sqrt((var(log(t)))), exp(mean(log(t)) + (.572 / (1.2 / sqrt((var(log(t))))))), .5 * min(t))
}
)
ml <- flexsurvreg(Surv(df1$x, df1$status) ~ 1, data = df1, dist = custom.weibull)
变量 y 应该代表一个单元的状态,其中 1 是失败的,0 是在审查之前未失败的单元。
形状和比例的初始值取自fitdistrplus
包中定义的矩。
对于阈值参数,必须有一个约束,因为阈值必须确实小于数据的最小值。因此,阈值的约束在其最大值 .99 * t_min 将是令人满意的(这是我直到现在还没有实现的东西)。
上述 MLE 的输出如下:
> ml
Call:
flexsurvreg(formula = Surv(df1$x, df1$status) ~ 1, data = df1,
dist = custom.weibull)
Estimates:
est L95% U95% se
shape 2.37e+00 2.12e+00 2.65e+00 1.33e-01
scale 3.52e+04 3.32e+04 3.74e+04 1.08e+03
thres 2.75e+03 1.51e+03 5.02e+03 8.44e+02
N = 1000, Events: 481, Censored: 519
Total time at risk: 25558684
Log-likelihood = -5462.027, df = 3
AIC = 10930.05
即使有审查,估计的参数也不好。我已经用其他随机生成的数据做了几次这个过程......估计总是离“真相”很远。
因此,我需要改进我的代码或另一种可能性来估计具有 MLE 的三参数 Weibull 的参数。