R中的predict()glmnet函数出错

RDP*_*DPD 5 r glmnet

当我使用预测glmnet函数时,我得到下面提到的代码错误.

mydata <- read.csv("data.csv")
x<- mydata[,1:4]
y<- mydata[,5]
data<-cbind(x,y)
model<-model.matrix(y~., data=data)
ridgedata= model[,-1]
train<- sample(1:dim(ridgedata)[1], round(0.8*dim(ridgedata)[1]))
test<- setdiff(1:dim(ridgedata)[1],train)
x_train <- data[train, ]
y_train <- data$y[train]
x_test <- data[test, ]
y_test <- data$y[test]
k=5
grid =10^ seq (10,-2, length =100)
fit <- cv.glmnet(model,y,k=k,lambda = grid)
lambda_min<-fit$lambda.min
fit_test<-predict(fit, newx=x_test,s=lambda_min)
Run Code Online (Sandbox Code Playgroud)

错误如下:

as.matrix中的错误(cbind2(1,newx)%% nbeta):在为函数'as.matrix'选择方法时评估参数'x'时出错:cbind2(1,newx)中的错误%% nbeta:not -yet实现%*%的方法

我试过调试,但我不知道在哪里

as.matrix(cbind2(1,newx)%*%nbeta)

正在使用代码以及导致此错误的原因.

Ben*_*ker 7

原始数据框在预测变量中具有因子(分类)变量.当你使用model.matrix它时,用这个变量做一些合理的事情; 如果你直接传递给它predict,它不知道该怎么做.

newX <- model.matrix(~.-y,data=x_test)
fit_test<-predict(fit, newx=newX,s=lambda_min)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你可以用一个最小/简化的例子复制这个例子,只有几行数据...例如,这个设置给出了相同的错误(我称之为数据dd而不是"数据",因为后者是R)中的内置函数:

set.seed(101)
dd <- data.frame(y=rnorm(5),
            a=1:5,b=2:6,c=3:7,d=letters[1:5])
model <- model.matrix(y~., data=dd)
n <- nrow(dd)
train <- sample(1:n, size=round(0.8*n))
test <- setdiff(1:n,train)
Run Code Online (Sandbox Code Playgroud)