GLM:警告信息:“newdata”有16623行,但找到的变量有22488行。

3

我在论坛中搜寻了许多像这样的文章,但没有一个可以解决我的问题。

现在,我求助于您。

我有类似于以下数据:

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")

我的愿望是在01月的数据上训练模型,然后将其应用于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月行数的总和。

我该怎么办?


什么是 pur8 - conv3d
1
嗨,Christian - 你能提供一个真实数据的子集,以便其他人可以重现这个错误信息吗?这将是解决问题的第一步。 - colin
1
@colin 我已经提供了。 - Christian R. Houen
@Gregor 我在这个网站上将我的变量定义为a、b、c等,因为我认为这样会更好地概述。在我的程序中,我既有这些变量,也有一个带有列名的版本。两者都提供了相同的错误。 - Christian R. Houen
1
好吧,即使它已经工作了,那样也会破坏事情。您的模型是根据名称为“a”,“b”和“c”的变量定义的。因此,当您在新数据上进行预测时,它会在您提供给“newdata”的数据框中寻找名为“a”,“b”和“c”的列。但是这些不是您的列名。相反,请在公式中使用您的列名。 - Gregor Thomas
显示剩余2条评论
2个回答

4
尝试在不先将每列保存到向量中的情况下运行该模型。我认为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 

由于某种原因,现在它可以工作了。我曾经(至少我认为是这样)在沮丧中抓狂地尝试了无数次。教训是:“你试过关掉再打开吗?” - Christian R. Houen

1

我生成了一些伪数据,看起来像您的问题,作为数据框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')

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