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