【发布时间】:2017-07-06 23:48:59
【问题描述】:
在预测选择一组二元互斥结果的概率的模型上使用 predict 时出现以下错误。使用 nnet 包的 multinom 函数。
predict.multinom(model_name, df.predict, "probs") 中的错误: 下标作业中不允许使用 NA 另外:警告 消息:“newdata”有 5 行,但找到的变量有 100 行
这是一个可重现的例子:
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)
【问题讨论】:
-
该错误消息意味着您传递给
newdata的任何内容都与公式中使用的名称不匹配,这通常意味着您打错了字,或者您在公式中使用了mydata$Y ~ mydataX1 + mydata$X2之类的东西。你能展示用于拟合模型的代码和predict()调用吗? -
用于拟合模型的代码为:fit_retail
-
另外,如果
names(df.logit.model.ready)==names(data.frame(train_))的结果(其中df.logit.model.ready是预测df,train_是训练df)都是TRUE,那么列名怎么可能不匹配? -
提问时,您应该向reproducible example 提供示例输入数据,以便我们运行并测试代码以查看发生了什么。
-
@MrFlick,添加了一个可重现的示例