我是 R 中“simsurv”包的新用户,我正在尝试复制 NICE DSU TSD 21 中描述的模拟研究(链接:https://www.sheffield.ac.uk/nice-dsu/ tsds/灵活方法生存分析)。为此,我尝试重新产生相同的结果,其中一个结果依赖于混合威布尔模型的规范。
当我运行此代码时:
# Load relevant packages
library(survival)
library(simsurv)
# Set sample size for the truth (i.e., a large number)
ss_truth <- 100000
# Sample age and frailty
age <- rnorm(ss_truth, 60, 6)
z <- rnorm(ss_truth, 0, 1)
t_lim_truth <- 80
# Other parameters
dist <- "weib"
lambda1 <- 0.6
lambda2 <- 0.7
gamma1 <- 1.8
gamma2 <- 0.5
pmix <- 0.3
frailty_beta <- 0.5
# Set seed for reproducibility
set.seed(1)
# Adjust for mixture versus non-mixture models
pmixopt <- pmix
mixopt <- TRUE
# Adjust length of lambda for mixture versus non-mixture models
if(is.na(lambda2)==TRUE){
lambda_in <- lambda1
} else {
lambda_in <- c(lambda1, lambda2)
}
# Adjust length of gamma for mixture versus non-mixture models
if(is.na(gamma2)==TRUE){
gamma_in <- gamma1
} else {
gamma_in <- c(gamma1, gamma2)
}
# Generate "truth"
td <- simsurv(dist = dist, lambda = lambda_in, gamma = gamma_in,
pmix = pmixopt, maxt = t_lim_truth, x = data.frame(z, frailty_beta), mixture = mixopt)
我收到此错误:
Error in stats::uniroot(rootfn_surv, survival = survival, x = x_i, betas = betas_i, :
f() values at end points not of opposite sign
请有人让我知道我做错了什么而产生此错误?
我尝试用硬编码条目手动替换上面行中的输入,这似乎也没有帮助:
td <- simsurv(dist = "weib", lambda = c(0.6, 0.7), gamma = c(1.8, 0.5),
pmix = 0.3, maxt = 80, x = data.frame(z, frailty_beta), mixture = TRUE)
当我尝试不同的 gamma 值时,我成功地使代码正常工作(例如,gamma 值为 1.2 和 0.8)。因此,这可能与这些特定的伽马值有关。然而,这些值与 DSU 研究中使用的值完全相同,所以我不确定为什么它在 R 中不起作用,但在 Stata 中似乎工作正常。请参阅参考原始伽玛值的附图。
在与软件包开发人员 Sam Brilleman 交流后,已经确定了解决方案!简而言之,需要定义区间论证,使其足够大以在其中找到解决方案。下面是我运行的行,现在可以正常工作(重要部分在最后)。
td <- simsurv(dist = dist, lambda = lambda_in, gamma = gamma_in, pmix = pmixopt, maxt = t_lim_truth, x = data.frame(z, frailty_beta), mixture = mixopt, interval = c(1E-20, 1E20))
感谢 Sam 分享此细节:-)
最好的, 灰烬