无法在R中创建lm对象的列表

无法在R中创建lm对象的列表,r,R,我正在创建一个包含20个lm对象的列表,以便多项式的阶数对应于列表中的位置 第一个lm对象具有响应y和预测poly(x,度=1),第二个对象具有响应y和预测poly(x,度=2),依此类推,直到poly(x,度=20)。以下是我编写的代码: model_list = list() for(deg in 1:20){ model_list[[deg]] = lm(y ~ poly(x, degree = deg), data = data) } 现在,我尝试对model_list中的所有对

我正在创建一个包含20个
lm
对象的列表,以便多项式的阶数对应于列表中的位置

第一个
lm
对象具有响应
y
和预测
poly(x,度=1)
,第二个对象具有响应
y
和预测
poly(x,度=2)
,依此类推,直到
poly(x,度=20)
。以下是我编写的代码:

model_list = list()
for(deg in 1:20){
   model_list[[deg]] = lm(y ~ poly(x, degree = deg), data = data)
}
现在,我尝试对
model_list
中的所有对象应用一个函数,该函数计算每个
lm
对象的RMSE,如下所示:

rmse = sapply(model_list, rmse_function, data = data2, response = "y")
我不断地得到一个错误:

longer object length is not a multiple of shorter object 
lengthError: variable 'poly(x, degree = deg)' was fitted with type "nmatrix.1" but type "nmatrix.20" was supplied
我尝试直接创建20个不同的lm对象,然后将它们列成一个列表,
sapply
在那里工作,但在for循环的列表中不起作用

我试过使用
lappy
,但这并没有改变问题,在以前的帖子中,似乎设置了
degree=deg
,但我不确定如何改变它,使
有效地运行

编辑:
rmse_函数
如下所示:

rmse_function = function(model, data, response){
  sqrt(mean((data[, response] - predict(model, data)) ^ 2))
}

data
data2
只是读取两列的csv(
x
y
)的数据帧,两列的随机生成的数字范围都在(-10,10)之内。

问题是,您直接将公式提供到
lm()
,因此,在您安装的型号中,它将存储呼叫
。。。多边形(x,度=度)
。此调用稍后在
predict()
中使用,由于
deg
20
,因此它将始终创建
nmatrix.20
。但是,在
model\u列表中
每个安装的型号都有
nmatrix.N
,其中
N
是度数。因此,您会得到一个错误

解决这一问题的最简单方法是预先创建一个字符串,然后将其转换为
lm()
中的公式:

for(1:20时的度数){

从你不给我们的表格来看,也不
数据
也不
rmse_函数
…数据2和数据是一样的?对不起,我刚编辑过,当我看到时,我忘了提到了!我想你的问题在于预测函数…如果你在相同的数据上使用它,试着将它改为
预测(模型)
…或者
模型[[“fitted.values”]]
predict使用的数据实际上与模型中使用的数据不同。
for(deg in 1:20){
   form <- paste0("y ~ poly(x, degree = ", deg, ")")
   model_list[[deg]] <- lm(as.formula(form), data = data)
}