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
后,是否有可能?如果是这样,怎么办?
答案 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)
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...
}