使用 linearRidge 预测:as.matrix(mm) %*% beta 中的错误:不一致的参数

Predict with linearRidge : Error in as.matrix(mm) %*% beta : non-conformable arguments

我正在使用包 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  

只有一行时处理数据似乎有问题。你知道解决这个问题的方法吗?还是我做错了什么?

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),])