Повторне використання моделі для прогнозування нових спостережень
Якщо модель не є обчислювально обчислюваною, я схильний документувати весь процес побудови моделі сценарієм R, який я повторюю за необхідності. Якщо у підгонці моделі бере участь випадковий елемент, я обов’язково встановлюю відоме випадкове насіння.
Якщо модель обчислювально обчислювальна, тоді я все ще використовую сценарій, як зазначено вище, але зберігаю об'єкти моделі, використовуючи save()
in і 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
аргументі ... припускаючи, що я вас правильно зрозумів ...