【问题标题】:For each loop with regex对于每个带有正则表达式的循环
【发布时间】:2021-01-27 07:32:41
【问题描述】:

我有一个这样的数据集:

y_post = c(0,1,2,3) 
y_pre = c(0,1,5,3) 
x_post = c(0,1,4,3) 
x_pre = c(0,1,4,3) 
x_time_pre = c(0,4,2,3) 
x_time_post = c(0,4,2,3) 
y_time_pre = c(0,1,5,3) 
y_time_post = c(0,1,4,3)
strata = c(1,2,2,1)
df = data.frame(strata, y_post, y_pre, x_post, x_pre,x_time_pre,x_time_post, y_time_pre, y_time_post) 

我想要做的是创建一个循环来为每个包含“时间”一词的变量运行回归,这样

fit <- lm(var_contains_"time"_post ~ same_var_contains_"time"_pre +strata) 

我不确定如何指定? 例如我想运行

lm (y_time_post ~y_time_pre+strata) 

并对所有包含时间一词的变量(我有 20 个)执行此操作

【问题讨论】:

    标签: r regression lm


    【解决方案1】:

    我们可以创建显示'time_pre'、'time_post'的列名向量并使用Map循环相应的元素,使用reformulate创建公式并应用lm

    nm1 <- grep('time_pre', names(df), value = TRUE)
    nm2 <- grep('time_post', names(df), value = TRUE)
    
    Map(function(x, y) lm(reformulate(c(x, 'strata'), 
              response = y), data = df), nm1, nm2)
    

    -输出

    #$x_time_pre
    
    #Call:
    #lm(formula = reformulate(c(x, "strata"), response = y), data = df)
    
    #Coefficients:
    #(Intercept)   x_time_pre       strata  
    #  4.441e-16    1.000e+00    0.000e+00  
    
    
    #$y_time_pre
    
    #Call:
    #lm(formula = reformulate(c(x, "strata"), response = y), data = df)
    
    #Coefficients:
    #(Intercept)   y_time_pre       strata  
    #       0.50         0.84        -0.26  
    

    提取系数

    library(broom)
    do.call(rbind, Map(function(x, y) tidy(lm(reformulate(c(x, 'strata'), 
              response = y)), data = df), nm1, nm2))
    

    -输出

    # A tibble: 6 x 5
    #  term         estimate std.error statistic  p.value
    #* <chr>           <dbl>     <dbl>     <dbl>    <dbl>
    #1 (Intercept)  4.44e-16     0       Inf       0     
    #2 x_time_pre   1.00e+ 0     0       Inf       0     
    #3 strata       0.           0       NaN     NaN     
    #4 (Intercept)  5.00e- 1     0.671     0.745   0.592 
    #5 y_time_pre   8.40e- 1     0.12      7.00    0.0903
    #6 strata      -2.60e- 1     0.461    -0.564   0.673 
    

    如果列名不同,使用bind_rowsmap2_dfr

    library(dplyr)
    library(purrr)
    map2_dfr(nm1, nm2, ~ tidy(lm(reformulate(c(.x, 'strata'), 
           response = .y), data = df)))
    

    【讨论】:

    • 谢谢,但不幸的是,这并没有存储系数和标准误差。我试着把它放到一个列表中,但它只会生成一个巨大的列表,你知道我该如何改进吗? @akrun
    • @Lola1993 如果需要提取所有系数,请使用tidy from broom
    • 不幸的是它没有用!即使我在我的数据中清楚地看到这个 var 并且您之前的公式(没有 rbind)有效,我也收到一条错误消息“评估错误(predvars,数据,env):对象 'fox_cnn_time_wave_4' 未找到”!!!!所以我很困惑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多