GLM: Предупреждающее сообщение: у 'newdata' было 16623 строки, но у найденных переменных есть 22488 строк - PullRequest
0 голосов
/ 15 мая 2018

Я обшарил форум повсюду и нашел много подобных статей, однако ни одна не решила мою проблему.

Теперь я обращаюсь к вам.

У меня есть данные, похожие наэто:

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.

Что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Здесь я сгенерировал некоторые псевдоданные, которые выглядят как ваша проблема как фрейм данных 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')
0 голосов
/ 15 мая 2018

Попробуйте запустить модель, не сохраняя каждый столбец в векторе.Я думаю, 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 
...