无法在R中创建lm对象的列表
我正在创建一个包含20个无法在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中的所有对
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)
}