Как запустить GLM на data.frame с именами столбцов, отличными от тех, на которых обучался GLM? - PullRequest
1 голос
/ 02 мая 2019

У меня есть устаревшая модель GLM, которая была обучена на данных о погоде много лет назад. Современные данные о погоде имеют названия столбцов, отличные от исходных данных.

КОНТЕКСТ: Я предсказываю события, основываясь на погоде.

ПРИМЕР ИЗМЕНЕНИЯ ИМЕНИ КОЛОННЫ: более новый файл data.frame имеет разные имена столбцов. В исходном файле data.frame (на котором GLM был помещен / обучен) был столбец с именем «ливень», а в новом файле data.frame он называется «RAIN_M40».

ВОПРОС: Есть ли способ использовать существующий GLM без изменения имени нового столбца ("RAIN_M40") на более старое имя ("rainfall") "?

# 1) Generate some random example data

original_data <- data.frame(events = rbinom(500, 1, 0.1), rainfall = runif(500))

current_data <- data.frame(RAIN_M40 = original_data$rainfall)



# 2) build the model on the original data

model_name <- glm(events ~ rainfall, family = poisson(), data = original_data)



# 3) predict the model using the original data (this works fine)


original_data$predicted_events <- predict((model_name), newdata = original_data, type = "response")



# 3) predict the model using the current data.frame  (does not work)

current_data$predicted_events <- predict((model_name), newdata = current_data, type = "response")

# returns the following error as column "rainfall" is now called "RAIN_M40": Error in eval(predvars, data, env) : object 'rainfall' not found








## CURRENT WORK AROUND ---------------


# 4) duplicating the column, giving it the new name so the model runs (but I don't want to have to do this!)

current_data$rainfall <- current_data$RAIN_M40




# 5) predict the model using the current data.frame  (this works fine, but the data is twice as big)

current_data$predicted_events <- predict((model_name), newdata = current_data, type = "response")


# ===================
 # My brother's solution:

library(data.table)
library(magrittr)

fr1 <- data.table(x = 1:3, y = 1:3)
fr2 <- data.table(X = 1:3, Y = 1:3)

fit <- lm(y ~ x, data = fr1)

predict(fit, newdata = within(fr2, x <- X))

predict(fit, newdata = copy(fr2) %>% setnames("X", "x"))

# =========================

ТЕКУЩЕЕ РЕШЕНИЕ. В настоящее время мой обходной путь состоит в том, чтобы реплицировать столбцы, чтобы включить по одному для каждого имени, но это некрасиво и, поскольку данные очень большие, неэффективны. Модель не может быть изменена / переобучена по причинам отчетности.

Буду признателен за любые ваши предложения. Большое спасибо.

РЕДАКТИРОВАТЬ: благодаря моему брату в конце предоставлен ряд подходов к решению этой проблемы. Некоторые используют data.table. Я еще не проверял их на скорость и т. Д., Но они здесь для справки других с этими проблемами!

...