R语言nls双变量模型使用predFit计算预测区间报错问题
nls模型使用predFit计算预测区间时变量找不到的问题解决
问题场景
使用nls拟合含Day、Treatment两个解释变量的非线性回归模型,单独获取预测值时predict()和predFit()都正常,但添加interval="prediction"参数计算预测区间时,触发object 'Day' not found错误,仅保留Day单变量的简化模型则无此问题。
数据集与模型代码
DS <- data.frame(Day=rep(1:5,t=2), Amount=c(65,17,11,3.5,1.2,85,23,15,5,1.7), Treatment=rep(c(0,1),e=5)) Model <- nls(Amount ~ (a+b*Treatment) * exp((c+d*Treatment)*Day) + e, data=DS, start = list(a=10,b=10,c=-0.1,d=-0.1,e=0.1))
正常输出预测值
# predict()输出结果 predict(Model) # [1] 64.814965 18.614433 7.150980 4.306624 3.600871 84.626103 25.804353 9.562934 5.078476 3.840261 # predFit()无区间参数时输出结果 predFit(Model) # [1] 64.814965 18.614433 7.150980 4.306624 3.600871 84.626103 25.804353 9.562934 5.078476 3.840261
计算预测区间时的错误
执行以下代码:
predFit(Model,interval="prediction",level=0.95)
触发错误:
Error in eval(form[[3]]) : object 'Day' not found
In addition: Warning message:
In assign(xname, newdata[, xname]) :
only the first element is used as variable name
解决方法
问题源于predFit()处理含多变量交互的nls模型时,自动生成预测数据的逻辑存在缺陷,需显式指定newdata参数,即使要复用原数据集也必须传入。
修正后的代码:
library(investr) predFit(Model, interval="prediction", level=0.95, newdata=DS)
原理说明
当模型公式包含变量的乘积或嵌套交互(如Treatment与Day的组合项),predFit()无法自动从模型对象中正确提取所有变量的完整数据。显式传入newdata可以明确告知函数要使用的数据集,避免变量解析时的丢失问题。
内容的提问来源于stack exchange,提问作者eee ppp
相关产品推荐
相关产品推荐

