我创建了一个循环,使参与者将非线性模型拟合到六个数据点(每个参与者有6个数据点)。第一个模型是单参数模型。以下是适用于该模型的代码。时间变量已定义。参与者变量是id变量。数据格式很长(每个参与者的每个数据点都有一行)。
以下是带有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 :(得分:0)
你最后提到'nlxb
不会给你残余',但确实如此。如果您拨打nlxb
的结果被称为fit
,则残差位于fit$resid
。因此,只需将它们添加到原始数据中即可获得拟合值。老实说,我不知道为什么nlxb
没有使用predict()
函数,但至少有一种方法可以获得预测值。