Повторное использование модели для прогнозирования новых наблюдений
Если модель не требует больших вычислительных затрат, я стараюсь документировать весь процесс построения модели в сценарии R, который я повторно запускаю при необходимости. Если в подгонке модели участвует случайный элемент, я обязательно устанавливаю известное случайное начальное число.
Если вычисление модели требует больших вычислительных затрат, я все равно использую сценарий, как указано выше, но сохраняю объекты модели, используя save()
объект into и rda. Затем я стараюсь изменить сценарий таким образом, чтобы, если сохраненный объект существует, загрузить его или, если нет, переустановить модель, используя простое if()...else
предложение, обернутое вокруг соответствующих частей кода.
При загрузке сохраненного объекта модели обязательно перезагрузите все необходимые пакеты, хотя в вашем случае, если модель logit была подходящей glm()
, не будет никаких дополнительных пакетов для загрузки, кроме R.
Вот пример:
> set.seed(345)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
>
> m1 <- lm(y ~ x, data = df)
>
> save(m1, file = "my_model1.rda")
>
>
> newdf <- data.frame(x = rnorm(20))
>
> load("my_model1.rda")
>
> predict(m1, newdata = newdf)
1 2 3 4 5 6
6.1370366 6.5631503 2.9808845 5.2464261 4.6651015 3.4475255
7 8 9 10 11 12
6.7961764 5.3592901 3.3691800 9.2506653 4.7562096 3.9067537
13 14 15 16 17 18
2.0423691 2.4764664 3.7308918 6.9999064 2.0081902 0.3256407
19 20
5.4247548 2.6906722
Если бы я хотел автоматизировать это, я бы, вероятно, сделал в скрипте следующее:
df <- data.frame(x = rnorm(20))
df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
if(file.exists("my_model1.rda")) {
load("my_model1.rda")
} else {
m1 <- lm(y ~ x, data = df)
}
newdf <- data.frame(x = rnorm(20))
predict(m1, newdata = newdf)
Конечно, код генерации данных будет заменен кодом, загружающим ваши фактические данные.
Обновление ранее подобранной модели новыми наблюдениями
Если вы хотите обновить модель, используя дополнительные новые наблюдения. Тогда update()
это полезная функция. Все, что он делает, это обновляет модель, обновляя один или несколько аргументов модели. Если вы хотите включить новые наблюдения в данные, используемые для соответствия модели, добавьте новые наблюдения во фрейм данных, переданный в аргумент 'data'
, а затем выполните следующие действия:
m2 <- update(m1, . ~ ., data = df)
где m1
- исходная, сохраненная подгонка модели, . ~ .
- изменения формулы модели, что в данном случае означает включение всех существующих переменных как с левой, так и с правой стороны ~
(другими словами, не вносить изменений в формулу модели), и df
является фрейм данных, используемый для соответствия исходной модели, расширенный для включения недавно доступных наблюдений.
Вот рабочий пример:
> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
>
> m1 <- lm(y ~ x, data = df)
> m1
Call:
lm(formula = y ~ x, data = df)
Coefficients:
(Intercept) x
4.960 2.222
>
>
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
>
> df <- rbind(df, newdf)
>
>
> m2 <- update(m1, . ~ ., data = df)
> m2
Call:
lm(formula = y ~ x, data = df)
Coefficients:
(Intercept) x
4.928 2.187
Другие упомянули в комментариях formula()
, которые извлекают формулу из подобранной модели:
> formula(m1)
y ~ x
>
>
> m3 <- lm(formula(m1), data = df)
Однако, если подгонка модели включает дополнительные аргументы, например 'family'
, или 'subset'
аргументы в более сложных функциях подгонки модели. Если update()
для вашей функции подгонки модели доступны методы (которые используются для многих распространенных функций подгонки, например glm()
), это обеспечивает более простой способ обновления подгонки модели, чем извлечение и повторное использование формулы модели.
Если вы намереваетесь выполнять все моделирование и прогнозирование будущего в R, на самом деле нет особого смысла абстрагироваться от модели с помощью PMML или подобного.
data
аргументе ... при условии, что я вас правильно понял ...