我使用包ridge
进行岭回归让我们说我正在使用mtcars数据并且我想预测变量qsec
所以我这样做:
install.packages('ridge')
library(ridge)
library(stats)
library(dplyr) #for the select
data(mtcars)
index=1:floor(0.75*nrow(mtcars))
train=mtcars[index,]
test=select(mtcars[-index,],-qsec)
ridge.model<-linearRidge(qsec~.,data=train)
这似乎工作正常,然后我可以尝试使用predict
函数预测下一个值。
qsec.pred<-predict(ridge.model,test)
再次完美无缺,但当我尝试只用一行测试时:
qsec.pred.first.row<-predict(ridge.model,test[1,])
我收到以下错误:
Error in as.matrix(mm) %*% beta : non-conformable arguments
当只有一行时,处理数据似乎有问题。你知道解决这个问题的方法吗?或者我做错了什么?
答案 0 :(得分:1)
ridge:::predict.ridgeLinear
代码中似乎存在错误。具体来说,当他们对模型矩阵进行子集时,只有一行,他们就会失去矩阵的正确结构。
您可以通过编写自己的版本来修复它
predict.ridgeLinear <- ridge:::predict.ridgeLinear
body(predict.ridgeLinear)[[7]][[3]] <- quote(mm <- cbind(1, X[, ll, drop=FALSE]))
body(predict.ridgeLinear)[[7]][[4]] <- quote(mm <- X[, ll, drop=FALSE])
environment(predict.ridgeLinear) <- asNamespace("ridge")
这实际上是攻击特定的行号,因此它不是很强大。我只在版本ridge_2.1-3
上测试过。但是,在我们定义了这个函数之后,我们可以调用
predict(ridge.model,test[1,])
# Pontiac Firebird
# 17.65554
predict(ridge.model,test[1:2,])
# Pontiac Firebird Fiat X1-9
# 17.65554 19.34306
如果您认为此修复程序应永久包含在软件包中,您可能希望与软件包维护者联系。请随意参考这个答案。
其他解决方法是始终一次预测多行。即使它是同一行两次。
qsec.pred.first.row <- predict(ridge.model,test[c(1,1),])