Performing lm() and segmented() on multiple columns in R

前端 未结 2 1202
[愿得一人]
[愿得一人] 2021-02-02 04:33

I am trying to perform lm() and segmented() in R using the same independent variable (x) and multiple dependent response variables (Curve1, Curve2, etc.) one by one. I wish to e

2条回答
  •  时光说笑
    2021-02-02 05:33

    Here's an approach using tidyverse and broom to return a data frame containing the results for each Curve column:

    library(broom)
    library(tidyverse)
    
    model.results = setNames(names(dat[,-1]), names(dat[,-1])) %>% 
      map(~ lm(paste0(.x, " ~ x"), data=dat) %>% 
            segmented(seg.Z=~x) %>%
            list(model=tidy(.), 
                 psi=data.frame(term="breakpoint", estimate=.[["psi.history"]][[5]]))) %>%
      map_df(~.[2:3] %>% bind_rows, .id="Curve")
    
    model.results
    
        Curve        term   estimate  std.error   statistic      p.value
    1  Curve1 (Intercept)  95.866127 0.14972382  640.286416 1.212599e-42
    2  Curve1           x -12.691455 0.05220412 -243.112130 1.184191e-34
    3  Curve1        U1.x  10.185816 0.11080880   91.922447 1.233602e-26
    4  Curve1      psi1.x   0.000000 0.02821843    0.000000 1.000000e+00
    5  Curve1  breakpoint   5.595706         NA          NA           NA
    6  Curve2 (Intercept)  94.826309 0.45750667  207.267599 2.450058e-33
    7  Curve2           x  -9.489342 0.11156425  -85.057193 5.372730e-26
    8  Curve2        U1.x   6.532312 1.17332640    5.567344 2.275438e-05
    9  Curve2      psi1.x   0.000000 0.23845241    0.000000 1.000000e+00
    10 Curve2  breakpoint   7.412087         NA          NA           NA
    11 Curve3 (Intercept) 100.027990 0.29453941  339.608175 2.069087e-37
    12 Curve3           x  -8.931163 0.08154534 -109.523900 4.447569e-28
    13 Curve3        U1.x   2.807215 0.36046013    7.787865 2.492325e-07
    14 Curve3      psi1.x   0.000000 0.26319757    0.000000 1.000000e+00
    15 Curve3  breakpoint   6.362132         NA          NA           NA
    

提交回复
热议问题