我有病人的生存数据。其中一些被审查了。我想用R中的flexsruv包对经验数据拟合一个广义伽玛函数,而我想要拟合的所有其他函数(如指数、威布尔等)。工作正常,我得到了dist = "gengamma"的以下错误代码
Error in optim(method = "BFGS", par = c(5.02274354115438, -0.0670900421918298, :
non-finite finite-difference value [2]以下是我掌握的数据:
db.survival <- data.frame(time = c(101, 111, 185, 707, 85, 58, 427, 672, 90,
1452, 608, 99, 556, 62, 60, 1445, 563, 246,
163, 276, 216, 64, 61, 66, 67, 68, 81, 83,
99, 100, 100, 100, 100, 100, 100, 100, 100),
status = c(1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0))我收到一个错误代码,用于:
library(flexsurv)
flexsurvreg(Surv(time, status) ~ 1, data = db.survival, dist="gengamma")然而,当我选择"CG"或"SANN"方法时,我会得到结果(但它们不同)。
我的问题是:为什么我一开始就有一个错误?我编码错误吗?
谢谢您的任何帮助!
发布于 2017-11-03 21:58:14
我不认为你的代码有什么问题。错误来自flexsurvreg使用的flexsurvreg。默认情况下,optim使用help("optim")中所述梯度的有限差分近似。
gr函数,用于返回"BFGS"、"CG"和"L-BFGS-B"方法的梯度。如果是NULL,则采用有限差分近似.对于"SANN"方法,它指定一个函数来生成一个新的候选点。如果为空,则使用默认的高斯马尔可夫核。
通过以下调用,您可以看到代码在哪里失败
> options(error = recover)
> flexsurvreg(Surv(time, status) ~ 1, data = db.survival, dist="gengamma", control = list(trace = 100))
initial value 144.298116
iter 10 value 131.067771
iter 20 value 128.013812
iter 30 value 127.761461
iter 40 value 127.753269
Error in optim(control = list(trace = 100), method = "BFGS", par = c(5.02274354115438, :
non-finite finite-difference value [2]
Enter a frame number, or 0 to exit
1: flexsurvreg(Surv(time, status) ~ 1, data = db.survival, dist = "gengamma", control = list(trace = 100))
2: do.call("optim", optim.args)
3: optim(control = list(trace = 100), method = "BFGS", par = c(5.02274354115438, -0.0670900421918298, 0), fn = function (optpars, .
Selection: 3之后,您将看到optim确实运行了很少的迭代,但在某些C代码中却失败了。此外,您可以看到flexsurv没有向optim提供lower或upper参数,这些参数可以与方法"L-BFGS-B"一起使用。您可以在这个小故事中看到其中一个参数具有有限的支持,这可能会对您有所帮助。
https://stackoverflow.com/questions/47100140
复制相似问题