glmnet函数中predict()出现错误:未实现的方法

7

当我使用predict 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)

错误如下:

Error in as.matrix(cbind2(1, newx) %*% nbeta) : 在选择函数 'as.matrix' 的方法时评估参数 'x' 时出错: Error in cbind2(1, newx) %*% nbeta : 暂未实现的方法 <data.frame> %*% <dgCMatrix>

我尝试进行调试,但不确定在哪里使用了以下代码并导致此错误:

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


尝试 x_test <- as.matrix(data[test, ]) - Ben Bolker
@BenBolker 出现了相同的错误。 - RDPD
1
好的,那么我们需要一个可复现的例子,请参考:https://dev59.com/eG025IYBdhLWcg3whGSx - Ben Bolker
你能发布一个无需请求访问权限的版本吗?最好能创建一个小的自包含示例,生成相同的错误并可以直接在此处发布。 - Ben Bolker
1个回答

13

您的原始数据框包含一个预测变量中的因子(分类)变量。当您使用model.matrix时,它会对该变量进行合理的处理;如果您将其直接传递给predict,那么它将不知道如何处理。

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

顺便说一下,你可以使用最小/虚构的例子来复制这个示例,只需几行数据即可……例如,这个设置会给出相同的错误(我将数据称为dd而不是"data",因为后者是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)

确实非常有帮助。谢谢! - RDPD
谢谢。这是否意味着我不能在cv.glmnet中使用分类变量?我遇到了同样的问题,除了一个(性别)之外,我正在使用数字变量。提前感谢! - Emmanuel Goldstein
另一个问题:你能解释一下 "~." 的含义吗?[波浪线后跟点号] - Emmanuel Goldstein
这意味着您需要使用model.matrix将分类变量转换为虚拟变量,这是最简单的方法。公式y〜.表示在模型矩阵中包括数据框中的所有变量(响应变量除外)。 - Ben Bolker
谢谢,我很感激。然而,我仍然不理解,因为x不包含响应变量。我们难道不是只将预测变量转换为虚拟变量(而不是y)吗?另一个问题是,使用glmnet可以使用分类变量,但是不使用cv.glmnet,这很奇怪(只是为了确保,我正在谈论上面的例子,带有减号,我也不知道它在做什么)。 - Emmanuel Goldstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接