2015-04-01 111 views
1

我创建了一个循环来让参与者(每个参与者有6个数据点)将非线性模型拟合到六个数据点。第一个模型是单参数模型。这个模型的代码很好用。时间变量已定义。参与者变量是id变量。数据是长形式的(每个参与者的每个数据点一行)。wrapnls:错误:在初始参数估计时的奇异梯度矩阵

这里是1个参数的循环代码的工作原理:

1_p_model <- dlply(discounting_long, .(Participant), function(discounting_long) {wrapnls(indiff ~ 1/(1+k*time), data = discounting_long, start = c(k=0))}) 

然而,当我试图符合二参数模型,我得到这个错误“错误:奇异梯度矩阵的初始参数估计”,而仍然使用wrapnls功能。我意识到模型可能超过参数化,这就是为什么我试图使用wrapnls而不是仅仅使用nls(或nlsList)。在我的领域有些人坚持要看到两种模式的适合。我认为这个wrapnls模型避免了0或接近0的残差问题。这是我的代码不起作用。该模型的起始值和限制是该领域的标准。

2_p_model <- dlply(discounting_long, .(Participant), function(discounting_long) {nlxb(indiff ~ 1/(1+k*time^s), data = discounting_long, lower = c (s = 0), start = c(k=0, s=.99), upper = c(s=1))}) 

我意识到,我可以使用nlxb(这确实让我为每个参与者正确的参数值),但功能并没有给预测值或每个数据点的残差(至少我不认为这)我想要计算AIC值。

我也接受其他解决方案,让参与者通过数据运行循环。

回答

0

你在最后提到'nlxb不会给你残差',但它确实如此。如果您致电nlxb的结果被称为fit,则残差位于fit$resid。因此,只需将它们添加到原始数据即可获得拟合值。老实说,我不知道为什么nlxb尚未与predict()函数一起使用,但至少有一种方法可以获得预测值。