使用R语言nls拟合模型时遇‘non-numeric argument’错误求助
解决nls拟合时的"non-numeric argument to binary operator"错误
错误原因
task是因子类型(分类变量),nls不会像lm那样自动将因子转换为数值型哑变量,直接用time*task会因非数值类型的变量参与乘法运算报错。- 你在
nls中用单个参数B对应time*task,但原lm的time*task展开后包含time主效应、task主效应、time:task交互效应,对应多个独立参数,单个B无法匹配这个结构。
解决方法
步骤1:明确原线性模型的参数结构
先运行你的lm模型查看参数:
df <- data.frame(task=rep(c("x", "y", "z"), each=6), time=1:18, y=c(1, 5, 9, 14, 17, 29, 2, 3, 1, 5, 2, 3, 29, 21, 18, 16, 14, 5)) OLS <- lm(y~ time*task, data=df) summary(OLS)
输出的参数会是:(Intercept)、time、tasky、taskz、time:tasky、time:taskz(共6个参数)。
步骤2:在nls中显式处理因子变量
将task的每个水平转为数值型哑变量(0/1),并为每个参数设置初始值(直接用lm的系数作为初始值能提升拟合效率):
NLS <- nls( y ~ intercept + time_coef*time + task_y*I(task == "y") + task_z*I(task == "z") + time_task_y*I(time*(task == "y")) + time_task_z*I(time*(task == "z")), data = df, start = list( intercept = coef(OLS)[1], time_coef = coef(OLS)[2], task_y = coef(OLS)[3], task_z = coef(OLS)[4], time_task_y = coef(OLS)[5], time_task_z = coef(OLS)[6] ) ) # 查看拟合结果 summary(NLS)
说明
I(task == "y")会生成一个数值向量,当task为y时取值1,否则为0,同理I(task == "z")。- 这样所有参与运算的变量都是数值型,不会触发非数值参数错误,同时模型结构和原
lm完全一致。
内容的提问来源于stack exchange,提问作者locus
相关产品推荐
相关产品推荐

