Сначала мы заимствуем функцию из этого другого вопроса , который уменьшает размер объекта lm
.
clean_model = function(cm) {
# just in case we forgot to set
# y=FALSE and model=FALSE
cm$y = c()
cm$model = c()
cm$residuals = c()
cm$fitted.values = c()
cm$effects = c()
cm$qr$qr = c()
cm$linear.predictors = c()
cm$weights = c()
cm$prior.weights = c()
cm$data = c()
# also try and avoid some large environments
attr(cm$terms,".Environment") = c()
attr(cm$formula,".Environment") = c()
cm
}
Затем напишем простую оболочку, которая уменьшает модель и возвращает функция прогнозирования:
prediction_function <- function(model) {
stopifnot(inherits(model, 'lm'))
model <- clean_model(model)
function (...) predict(model, ...)
}
Пример:
set.seed(1234)
df <- data.frame(x = 1:9, y = 2 * 1:9 + 3 + rnorm(9, sd = 0.5))
fit <- lm(y ~ x, df)
f <- prediction_function(fit)
f(data.frame(x = 5:6))
1 2
12.83658 14.83351
Проверить размеры:
object.size(fit)
# 16648 bytes
object.size(prediction_function)
# 8608 bytes
Для этого небольшого примера мы сэкономим половину места.
Давайте использовать более крупные данные:
data(diamonds, package = 'ggplot2')
fit2 <- lm(carat ~ price, diamonds)
predict(fit2, data.frame(price = 200))
f2 <- prediction_function(fit2)
f2(data.frame(price = 200))
print(object.size(fit2), units = 'Mb');
object.size(f2)
Теперь мы go с 13 Мб до 5376 байт.