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

时间:2019-05-16 20:26:54

标签: r lm

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 个答案:

答案 0 :(得分:3)

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

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

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

您可以看到它们与

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

答案 1 :(得分:2)

lmlm.fitlm.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...
}