2015-07-27 2 views
1

Я использую пакет ridge, чтобы сделать регрессию хребта. Предположим, что я использую данные mtcars и хочу предсказать, переменная qsec поэтому я:Прогнозировать с помощью linearRidge: Ошибка в as.mmatrix (mm)% *% beta: несоответствующие аргументы

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

В коде 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),]) 
+0

Спасибо, действительно, удивительный ответ! Я увижу, что менеджер пакетов знает об этой проблеме, я также обязательно свяжусь с вашим ответом! – jean

+0

Мне не удалось связаться с ней, поскольку ее адрес электронной почты может быть устаревшим – jean