Как прогнозировать после lm.wfit новые данные? - PullRequest
2 голосов
/ 16 мая 2019

lm.wfit.lm.fit) имеет значительные преимущества в скорости перед lm, если мы можем обойтись без дополнительных вычислений последнего.

fo <- mpg ~ hp
X <- model.matrix(fo, mtcars)

microbenchmark::microbenchmark(flm=lm <- 
                                 lm(fo, mtcars[mtcars$am == 1, ], 
                                    weights=rep(1, 13)),
                               flmw=lmw <- 
                                 lm.wfit(X[mtcars$am == 1, ], mtcars$mpg[mtcars$am == 1], 
                                         w=rep(1, 13)))
# Unit: microseconds
# expr     min       lq     mean   median       uq      max neval cld
#  flm 935.328 951.2735 994.7719 957.2695 1006.128 1333.339   100   b
# flmw  56.895  60.3400  66.2028  64.2940   66.463  186.250   100  a 
stopifnot(lm$coefficients == lmw$coefficients)

Часто все идет хорошо, но теперь мне нужно применить predict со всеми данными, как в этом примере.

predict(lm, mtcars)
# [...]
predict(lmw, mtcars)
# Error in UseMethod("predict") : 
#   no applicable method for 'predict' applied to an object of class "list"

Возможно ли это даже после использования этого ограниченного lm.wfit? Если так, то как?

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Ну, страница справки для ?lm.wfit предостерегает от ее использования, и это, вероятно, именно по этой причине. Он не хранит информацию о формулах и именах столбцов, которую predict() обычно использует, чтобы убедиться, что ваши новые данные соответствуют типам переменных старых данных.

Вместо этого вы можете самостоятельно выполнить некоторое умножение матриц, если выполните ту же самую процедуру model.matrix().

model.matrix(fo, mtcars) %*% lmw$coefficients

Вы можете видеть, что это то же самое, что и базовый прогноз с

all((model.matrix(fo, mtcars) %*% lmw$coefficients) == predict(lm, mtcars))
# [1] TRUE
2 голосов
/ 16 мая 2019

lm медленнее, чем lm.fit и lm.wfit, потому что он использует эти функции для внутреннего использования. Вы выполнили некоторые другие внутренние работы, создав матрицу модели вне эталонного теста. Это нормально, если вы собираетесь повторно использовать матрицу модели, но в противном случае это вводящий в заблуждение тест.

Что касается predict, это универсальный метод. Поскольку нет predict.list метода, он не работает. Если вы хотите, вы можете написать метод для пользовательского класса, а затем присвоить этому классу возвращаемое значение lm.wfit.

например:.

my_lm_wfit <- function(...) {
  fit <- lm.wfit(...)
  class(fit) <- "my_lm_wfit"
  fit
}

predict.my_lm_wfit <- function(...) {
  # Do something...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...