2016-03-31 2 views
0

Кажется, что вызов lm() из функции или через lapply закручивает $call, связанный с посадкой. Минимальный рабочий пример:Как использовать функцию lm() внутри функции?

> 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 

Как устранить эту проблему и предотвратить вышеуказанную ошибку?

+0

@coffeinjunky Нет, вещи простой только для этого игрушечного примера – mchen

+0

Вот подобный вопрос, для ссылка http://stackoverflow.com/q/7666807/210673 – Aaron

ответ

6

Иногда лучше поставить анонимную функцию 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.

2

Альтернативой yould быть, чтобы применить stepAIC внутри lapply непосредственно:

AICs <- lapply(list(z ~ x + y, z ~ x + log(y)), 
       function(x) stepAIC(lm(x,dat))) 

Это дает вам список вывода stepAIC для всех моделей.

2

Попробуйте использовать это как функцию в лапке. Это создает приятный глаз формулы в 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 
Смежные вопросы