GLM:警告消息:'newdata'有16623行,但找到的变量有22488行

时间:2018-05-15 20:11:55

标签: r machine-learning glm

我在这个论坛上搜索得很广泛,发现很多这样的文章,然而,没有一个能解决我的问题。

现在,我转向你。

我的数据类似于:

ontime currency incoterms price month
1      USD      FOB       234.2    01
1      CAD      FOB        92.4    01
0      USD      DAP       238.9    02
0      EUR      FOB       100      03
1      CNY      DAP       739.8    04

我这段代码:

g = df$ontime      #binary
a = df$currency    #String
b = df$INCOTERMS   #String
c = df$price       #float
f = df$month       #string

mod1 <- glm(g~a+b+c,family=binomial(link="logit"), data=df[f=="01",])
pred_ontime1 <- predict(mod1,df[f%in%c("02","03","04"),],type="response")

我的愿望是测试我的模型,我在第02个月,第02个月,第03个月和第04个月对数据进行了培训。

我的结果是:

Warning message:
'newdata' had 16623 rows but variables found have 22488 rows

我已经尝试过在01月进行培训并在01,02,03和04上进行测试,但没有给出错误信息,但是,对我的训练集中包含的数据进行测试似乎不合适。

值16623当然是02,03和04中的行数,而22488是01,02,03和04中的行数。

我该怎么办?

2 个答案:

答案 0 :(得分:3)

尝试运行模型而不先将每列保存到向量。我认为predict()无法判断它与模型相同的变量名称。

mod1 <- glm(ontime ~ currency + INCOTERMS + price, family = binomial(link = "logit"), data = df[df$month == "01",])
pred_ontime1 <- predict(mod1,df[df$month %in% c("02","03","04"),], type = "response")

看看是否有效。

以下是任何感兴趣的人都可以重现的例子:

df <- read.table(textConnection("ontime currency incoterms price month
0      USD      DAP       234.2    01
                          1      CAD      FOB        92.4    01
                          0      USD      DAP       238.9    02
                          0      USD      FOB       100      03
                          1      CAD      DAP       739.8    04"), header = TRUE)

mod1 <- glm(ontime ~ currency + incoterms + price, family = binomial(link = "logit"), data = df[df$month == 1,])
pred_ontime1 <- predict(mod1, df[df$month %in% c(2:4),], type = "response")
pred_ontime1
           3            4            5 
5.826215e-11 5.826215e-11 1.000000e+00 

答案 1 :(得分:0)

在这里,我生成了一些看起来像你的问题的伪数据框df

currency <- c('USD','CAD','CAD','EUR','CNY','USD','EUR','CNY')
incoterms <- c('FOB','FOB','DAP','DAP','FOB','DAP','FOB','DAP')
month <- c('01','01','01','01','01','02','03','04')
df <- data.frame(currency, incoterms, month)
df <- rbind(df,df,df,df)
df$price <- rnorm(nrow(df), 200, 50)
df$ontime <- rbinom(nrow(df), 1, 0.5)

然后我继续适应mod1。重要的是,我没有将每个预测变量定义为向量,我只是从数据框中按名称拉出它们,数据框已被子集化为仅包括第一个月。

mod1 <- glm(ontime ~ currency + incoterms + price, data = df[month == '01',])

以下预测功能现在运行良好:

pred <- predict(mod1, df[month %in% c('02','03','04'),], type = 'response')