如何用新数据预测 lm.wfit 之后?

How to predict after lm.wfit with new data?

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 之后,这甚至可能吗?如果是这样,如何?

好吧,?lm.wfit 的帮助页面确实警告不要使用它,这可能正是出于这个原因。它不存储 predict() 通常用于确保您的新数据与旧数据的变量类型匹配的任何有关公式和列名的信息。

相反,如果您执行相同的 model.matrix() 过程,您可以自己进行一些矩阵乘法运算。

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

您可以看到这些与

的基础预测相同
all((model.matrix(fo, mtcars) %*% lmw$coefficients) == predict(lm, mtcars))
# [1] TRUE

lmlm.fitlm.wfit 慢,因为它在内部使用这些函数。通过在基准之外创建模型矩阵,您已经完成了一些其他内部工作。如果您希望重用模型矩阵,那很好,但否则它就是一个误导性基准。

至于predict,是泛型方法。因为没有 predict.list 方法,所以它失败了。如果需要,您可以为自定义 class 编写一个方法,然后将 class 分配给 lm.wfit.

的返回值

例如:

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

predict.my_lm_wfit <- function(...) {
  # Do something...
}