为 Dataframe 中的每一行添加新行,其中包含线性模型的截距、斜率、r平方和p值

6g8kf2rb  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(153)

我有一个数据框架,其中包含xy坐标和30年来约1,000个雨量器的年降水量(下面的df与之相似,但经过简化)。每行是一个雨量器。
我需要在每个计量表的记录周期内拟合线性模型,并创建新列来保存每行回归的截距、斜率、r平方和p值。我知道如何使用lm()生成这些值的摘要,但我在如何高效地将它们添加到 Dataframe 上遇到了麻烦。
我很感激你给我的任何建议!-杰姆
数据框架:

x <- c(40.2732, 41.5801, 41.4109, 41.8240)
y <- c(76.8867, 71.4774, 71.3128, 71.4128)
Year.2000 <- c(105, 108, 129, 99)
Year.2001 <- c(114, 114, 180, 94)
Year.2002 <- c(111, 125, 129, 104)
Year.2003 <- c(101, 96, 121, 103)
Year.2004 <- c(118, 116, 118, 97)

df <- data.frame(x, y, Year.2000, Year.2001, Year.2002, Year.2003, Year.2004)
5sxhfpxr

5sxhfpxr1#

previous question中,样本数据由每个站点每年一次观测组成。如果我们将上述数据放入类似的“长”结构(一次观测/行)中,我们可以在broom包的整理帮助下为每个站点添加一个回归。

x <- c(40.2732, 41.5801, 41.4109, 41.8240)
y <- c(76.8867, 71.4774, 71.3128, 71.4128)
Year.2000 <- c(105, 108, 129, 99)
Year.2001 <- c(114, 114, 180, 94)
Year.2002 <- c(111, 125, 129, 104)
Year.2003 <- c(101, 96, 121, 103)
Year.2004 <- c(118, 116, 118, 97)

df <- data.frame(x, y, Year.2000, Year.2001, Year.2002, Year.2003, Year.2004)

library(tidyverse)
library(broom)

lm_fit <- df %>%
  pivot_longer(
    cols = starts_with('Year.'),
    names_to = 'Year',
    names_prefix = 'Year.',
    values_to = 'p'
    ) %>%
  mutate(Year = as.numeric(Year)) %>%
  nest(data = c(-x,-y)) %>%
  mutate(
    fit = map(data, ~ lm(p ~ Year, data = .x)),
    tidied = map(fit, tidy))

lm_fit %>% unnest(tidied)
#> # A tibble: 8 × 9
#>       x     y data             fit    term      estimate std.e…¹ stati…² p.value
#>   <dbl> <dbl> <list>           <list> <chr>        <dbl>   <dbl>   <dbl>   <dbl>
#> 1  40.3  76.9 <tibble [5 × 2]> <lm>   (Interce… -2.49e+3  4.76e3 -0.523    0.637
#> 2  40.3  76.9 <tibble [5 × 2]> <lm>   Year       1.30e+0  2.38e0  0.546    0.623
#> 3  41.6  71.5 <tibble [5 × 2]> <lm>   (Interce…  5.12e+2  7.84e3  0.0653   0.952
#> 4  41.6  71.5 <tibble [5 × 2]> <lm>   Year      -2.00e-1  3.92e0 -0.0511   0.962
#> 5  41.4  71.3 <tibble [5 × 2]> <lm>   (Interce…  1.64e+4  1.60e4  1.02     0.383
#> 6  41.4  71.3 <tibble [5 × 2]> <lm>   Year      -8.10e+0  8.01e0 -1.01     0.386
#> 7  41.8  71.4 <tibble [5 × 2]> <lm>   (Interce… -9.02e+2  2.99e3 -0.302    0.782
#> 8  41.8  71.4 <tibble [5 × 2]> <lm>   Year       5.00e-1  1.49e0  0.335    0.759
#> # … with abbreviated variable names ¹​std.error, ²​statistic

创建于2022年11月28日,使用reprex v2.0.2
如果这种方法看起来有用,那么值得进一步研究broom文档。

相关问题