下标分配中不允许使用 NA:预测概率错误

NAs are not allowed in subscripted assignments: error in predicting probability

在预测选择一组二元互斥结果的概率的模型上使用预测时出现以下错误。使用nnet包的multinom函数。

Error in predict.multinom(model_name, df.predict, "probs") : NAs are not allowed in subscripted assignments In addition: Warning message: 'newdata' had 5 rows but variables found have 100 rows

这是一个可重现的例子:

require(nnet)

response1 <- sample(runif(100))
response2 <- 1-response1
responses <- as.matrix(data.frame(response1 = response1, response2 = response2))

train <- data.matrix(data.frame(var1 = runif(100), var2 = runif(100)))

multinom.mod <- multinom(responses ~ train)

test.df <- data.frame(var1 = runif(5), var2 = runif(5))
predict.vec <- predict(multinom.mod, test.df)

如您所见,问题在于我的响应包含 2 个变量。看起来比当我预测比训练集中更少的行数时,该函数试图将训练集中的响应变量与测试集连接起来。

更新:

以下使用新的预测集。但是,响应变量被视为分类变量,因此预测不正确:

require(nnet)

train <- data.frame(response1 = sample(runif(100)), response2 = 1-response1, var1 = runif(100), var2 = runif(100))

multinom.mod <- multinom(response1 + response2 ~ ., train, type = "probs")

test.df <- data.frame(var1 = runif(5), var2 = runif(5))

predict.vec <- predict(multinom.mod, test.df)

如果您想预测每个响应类别的概率,您应该使用:

predict.vec <- predict(multinom.mod, test.df, type = "probs")

否则,预测默认为 class,type = class

更新,完整的用法(训练和预测)应该是这样的:

require(nnet)

response1 <- sample(runif(100))
response2 <- 1 - response1

train <- data.frame(var1 = runif(100), var2 = runif(100))
# train with matrix
responses <- cbind(response1, response2)
multinom.mod <- multinom(responses ~ var1 + var2, train, type = "probs")
# train with category
train$response <- ifelse(response1 > response2, "response1", "response2")
multinom.mod1 <- multinom(response ~ var1 + var2, train)

test.df <- data.frame(var1 = runif(5), var2 = runif(5))
# no matter which training method you use,
# you can predict class (default) or probability
predict.cvec <- predict(multinom.mod, test.df, type = "class")
predict.pvec <- predict(multinom.mod, test.df, type = "probs")

predict.cvec1 <- predict(multinom.mod1, test.df, type = "class")
predict.pvec1 <- predict(multinom.mod1, test.df, type = "probs")