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

时间:2015-07-27 21:14:32

标签: r regression predict

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

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

1 个答案:

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