如何在函数内部使用 lm()?
How do I use lm() from inside a function?
似乎从函数内部或通过 lapply
调用 lm()
搞砸了与匹配关联的 $call
。最小工作示例:
> library(MASS)
> dat <- data.frame(x = 1:100, y=1:100)
> dat <- within(dat, z <- x + log(y) + rnorm(100))
> fits <- lapply(list(z ~ x + y, z ~ x + log(y)), lm, dat)
> stepAIC(fits[[1]]) # <-- error when I try to use the fit in other functions
Error in eval(expr, envir, enclos) : could not find function "FUN"
> fits[[1]]$call
FUN(formula = X[[i]], data = ..1) # Aha -- this must be why -- $call is screwed up
如何解决这个问题并防止出现上述错误?
有时最好为 lapply
提供一个匿名函数:
fits <- lapply(list(z ~ x + y, z ~ x + log(y)),
function(f) lm(f, data = dat))
stepAIC(fits[[1]])
#works
请注意,这(通常是我首选的明确范围界定方式)不起作用,因为 DF
未被 stepAIC
找到:
fits <- lapply(list(z ~ x + y, z ~ x + log(y)),
function(f, DF) lm(f, data = DF), DF = dat)
注意逐步回归is a bad method anyway。
另一种方法是直接在 lapply
中应用 stepAIC
:
AICs <- lapply(list(z ~ x + y, z ~ x + log(y)),
function(x) stepAIC(lm(x,dat)))
这为您提供了所有模型的 stepAIC
输出列表。
尝试将此用作 lapply 中的函数。这会在 fits
中生成漂亮的公式,显示实际公式并且 stepAIC
有效:
fun <- function(fo) do.call("lm", list(fo, quote(dat)))
fits <- lapply(list(z ~ x + y, z ~ x + log(y)), fun)
给予:
> fits[[1]]
Call:
lm(formula = z ~ x + y, data = dat)
Coefficients:
(Intercept) x y
2.154 1.031 NA
> stepAIC(fits[[1]])
Start: AIC=-3.34
z ~ x + y
Step: AIC=-3.34
z ~ x
Df Sum of Sq RSS AIC
<none> 93 -3.34
- x 1 88600 88693 680.78
Call:
lm(formula = z ~ x, data = dat)
Coefficients:
(Intercept) x
2.154 1.031
似乎从函数内部或通过 lapply
调用 lm()
搞砸了与匹配关联的 $call
。最小工作示例:
> library(MASS)
> dat <- data.frame(x = 1:100, y=1:100)
> dat <- within(dat, z <- x + log(y) + rnorm(100))
> fits <- lapply(list(z ~ x + y, z ~ x + log(y)), lm, dat)
> stepAIC(fits[[1]]) # <-- error when I try to use the fit in other functions
Error in eval(expr, envir, enclos) : could not find function "FUN"
> fits[[1]]$call
FUN(formula = X[[i]], data = ..1) # Aha -- this must be why -- $call is screwed up
如何解决这个问题并防止出现上述错误?
有时最好为 lapply
提供一个匿名函数:
fits <- lapply(list(z ~ x + y, z ~ x + log(y)),
function(f) lm(f, data = dat))
stepAIC(fits[[1]])
#works
请注意,这(通常是我首选的明确范围界定方式)不起作用,因为 DF
未被 stepAIC
找到:
fits <- lapply(list(z ~ x + y, z ~ x + log(y)),
function(f, DF) lm(f, data = DF), DF = dat)
注意逐步回归is a bad method anyway。
另一种方法是直接在 lapply
中应用 stepAIC
:
AICs <- lapply(list(z ~ x + y, z ~ x + log(y)),
function(x) stepAIC(lm(x,dat)))
这为您提供了所有模型的 stepAIC
输出列表。
尝试将此用作 lapply 中的函数。这会在 fits
中生成漂亮的公式,显示实际公式并且 stepAIC
有效:
fun <- function(fo) do.call("lm", list(fo, quote(dat)))
fits <- lapply(list(z ~ x + y, z ~ x + log(y)), fun)
给予:
> fits[[1]]
Call:
lm(formula = z ~ x + y, data = dat)
Coefficients:
(Intercept) x y
2.154 1.031 NA
> stepAIC(fits[[1]])
Start: AIC=-3.34
z ~ x + y
Step: AIC=-3.34
z ~ x
Df Sum of Sq RSS AIC
<none> 93 -3.34
- x 1 88600 88693 680.78
Call:
lm(formula = z ~ x, data = dat)
Coefficients:
(Intercept) x
2.154 1.031