Как запустить модель с переменными из разных фреймов данных несколько раз с lapply в R

У меня 2 фрейма данных

#dummy df for examples:
set.seed(1)
df1 <- data.frame(t = (1:16), 
                 A = sample(20, 16),
                 B = sample(30, 16),
                 C = sample(30, 16))

df2 <- data.frame(t = (1:16),
                  A = sample(20, 16),
                  B = sample(30, 16),
                  C = sample(30, 16))

Я хочу сделать это для каждого столбца в обоих фреймах данных (кроме столбца t):

model <- lm(df2$A ~ df1$A, data = NULL)

Я пробовал что-то вроде этого:

model <- function(yvar, xvar){
  lm(df1$as.name(yvar) ~ df2$as.name(xvar), data = NULL)
}
lapply(names(data), model)

но это явно не работает. Что я делаю неправильно?

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

результат, который мне нужен, я думаю, он должен выглядеть примерно так:

# [[1]]
# Call:
#   lm(df1$as.name(yvar) ~ df2$as.name(xvar), data = NULL)
# 
# Residuals:
#   Min      1Q  Median      3Q     Max 
# -0.8809 -0.2318  0.1657  0.3787  0.5533 
# 
# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept)    -0.013981   0.169805  -0.082    0.936    
# predmodex[, 2]  1.000143   0.002357 424.351   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 0.4584 on 14 degrees of freedom
# Multiple R-squared:  0.9999,  Adjusted R-squared:  0.9999 
# F-statistic: 1.801e+05 on 1 and 14 DF,  p-value: < 2.2e-16
# 
# [[2]]
# Call:
#   lm(df1$as.name(yvar) ~ df2$as.name(xvar), data = NULL)
# 
# Residuals:
#   Min      1Q  Median      3Q     Max 
# -0.8809 -0.2318  0.1657  0.3787  0.5533 
# 
# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept)    -0.013981   0.169805  -0.082    0.936    
# predmodex[, 2]  1.000143   0.002357 424.351   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 0.4584 on 14 degrees of freedom
# Multiple R-squared:  0.9999,  Adjusted R-squared:  0.9999 
# F-statistic: 1.801e+05 on 1 and 14 DF,  p-value: < 2.2e-16
# 
# [[3]]
# Call:
#   lm(df1$as.name(yvar) ~ df2$as.name(xvar), data = NULL)
# 
# Residuals:
#   Min      1Q  Median      3Q     Max 
# -0.8809 -0.2318  0.1657  0.3787  0.5533 
# 
# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept)    -0.013981   0.169805  -0.082    0.936    
# predmodex[, 2]  1.000143   0.002357 424.351   <2e-16 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 0.4584 on 14 degrees of freedom
# Multiple R-squared:  0.9999,  Adjusted R-squared:  0.9999 
# F-statistic: 1.801e+05 on 1 and 14 DF,  p-value: < 2.2e-16

Отвечает ли это на ваш вопрос? Подбор нескольких регрессионных моделей путем изменения только одной независимой переменной внутри mutate ()   —  person Simón Pérez    schedule 22.04.2021

См. также:  Сопоставление с образцом списка эликсира ~ получить x после константы с сопоставлением с образцом списка

@jared_mamrot Думаю, я мог бы адаптировать часть этого поста к тому, что я хотел. Но я думаю, что цель этого поста отличалась от моей, поэтому я скажу, что он не отвечает на мой вопрос. Также я хотел сделать это с lapply. Как вы можете видеть из ответа @Ronak Shah, то, что я хотел, было довольно простым. Спасибо за предложение.   —  person Simón Pérez    schedule 22.04.2021

Великолепно — спасибо за разъяснения :)   —  person Simón Pérez    schedule 23.04.2021

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Simón Pérez

    Поскольку df1 и df2 имеют одинаковые имена, вы можете сделать это следующим образом:

    model <- function(var){
      lm(df1[[var]] ~ df2[[var]])
    }
    result <- lapply(names(df1)[-1], model)
    result
    
    #[[1]]
    
    #Call:
    #lm(formula = df1[[var]] ~ df2[[var]])
    
    #Coefficients:
    #(Intercept)   df2[[var]]  
    #    15.1504      -0.4763  
    
    
    #[[2]]
    
    #Call:
    #lm(formula = df1[[var]] ~ df2[[var]])
    
    #Coefficients:
    #(Intercept)   df2[[var]]  
    #     3.0227       0.6374  
    
    
    #[[3]]
    
    #Call:
    #lm(formula = df1[[var]] ~ df2[[var]])
    
    #Coefficients:
    #(Intercept)   df2[[var]]  
    #    15.4240       0.2411  
    

    Чтобы получить сводную статистику модели, вы можете использовать broom::tidy:

    purrr::map_df(result, broom::tidy, .id = 'model_num')
    
    #  model_num term        estimate std.error statistic  p.value
    #  <chr>     <chr>          <dbl>     <dbl>     <dbl>    <dbl>
    #1 1         (Intercept)   15.2       3.03      5.00  0.000194
    #2 1         df2[[var]]    -0.476     0.248    -1.92  0.0754  
    #3 2         (Intercept)    3.02      4.09      0.739 0.472   
    #4 2         df2[[var]]     0.637     0.227     2.81  0.0139  
    #5 3         (Intercept)   15.4       4.40      3.50  0.00351 
    #6 3         df2[[var]]     0.241     0.272     0.888 0.390   
    

    о, чувак, так просто !, я был так близко, еще несколько дней, и я бы там оказался, ха-ха. Большое спасибо, это именно то, что я пытался сделать. Извините, я недостаточно крут, чтобы проголосовать за вас. person Simón Pérez; 22.04.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: