如何用新数据预测 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
lm
比 lm.fit
和 lm.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...
}
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
lm
比 lm.fit
和 lm.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...
}