Как использовать исходное имя аргумента в функции при использовании функции apply в R?

Всякий раз, когда я использую функцию apply, использование фиктивной переменной в анонимной функции приводит к тому, что имя этой фиктивной переменной используется внутри. Как использовать исходное имя переменной внутри, чтобы избежать осложнений при обработке полученного списка?

Ниже приведен пример, описывающий, что я имею в виду:

set.seed(314)

df <- data.frame(response = rnorm(500),
                Col1 = rnorm(500),
                Col2 = rnorm(500),
                Col3 = rnorm(500),
                Col4 = rnorm(500))

> apply(df[, 2:5], 2, function(x) lm(response ~ x, data = df))
$Col1

Call:
lm(formula = response ~ x, data = df)

Coefficients:
(Intercept)            x  
   0.074452     0.007713  


$Col2

Call:
lm(formula = response ~ x, data = df)

Coefficients:
(Intercept)            x  
    0.06889      0.07663  


$Col3

Call:
lm(formula = response ~ x, data = df)

Coefficients:
(Intercept)            x  
    0.07401      0.03512  


$Col4

Call:
lm(formula = response ~ x, data = df)

Coefficients:
(Intercept)            x  
   0.073668    -0.001059  

Я хотел бы, чтобы каждая линейная регрессия выше использовала именаCol1Col2, и т.д. вместо xкаждой регрессии. Кроме того, я ищу общий способ использования оригинальных имен в любой ситуации (а не только линейной регрессии), когда я использую функцию apply.

Метки

1 ответ

  1. Один подход состоит в том, чтобы сделать это в два этапа следующим образом:

    1) сначала запустите регрессии, как вы делаете
    2) заменить название коэффициента, а также формулу

    l <- lapply(df[, 2:5], function(x) lm(response ~ x, data = df))
    for (i in 1:length(l)) {
      names(l[[i]]$coefficients)[2] <- names(l)[i]
      l[[i]]$call <- gsub('x', names(l)[i], l[[i]]$call)
    }
    

    Полученный результат выглядит следующим образом:

    $Col1
    
    Call:
    c("lm", "response ~ Col1", "df")
    
    Coefficients:
    (Intercept)         Col1  
       -0.04266     -0.07508  
    
    
    $Col2
    
    Call:
    c("lm", "response ~ Col2", "df")
    
    Coefficients:
    (Intercept)         Col2  
       -0.04329      0.02403  
    
    
    $Col3
    
    Call:
    c("lm", "response ~ Col3", "df")
    
    Coefficients:
    (Intercept)         Col3  
       -0.04519     -0.03300  
    
    
    $Col4
    
    Call:
    c("lm", "response ~ Col4", "df")
    
    Coefficients:
    (Intercept)         Col4  
       -0.04230     -0.04506