У меня есть устаревшая модель 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. Я еще не проверял их на скорость и т. Д., Но они здесь для справки других с этими проблемами!