首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线性回归斜率综述

线性回归斜率综述
EN

Stack Overflow用户
提问于 2022-10-21 18:37:48
回答 2查看 57关注 0票数 0

新的R用户在这里。

我有一个大约400个站点的数据集,我试图得到每个站点的p和回归斜率的标准差。

我已经用下面的方法获得了一部分,但我不知道如何接近问题的最后一部分,以拟合一个线性回归到每个站点,得到直线的斜率,并创建另一个列与每一个站点的斜率。

我很感激你的帮助!

代码语言:javascript
复制
# Sample df
df <- data.frame(site.id=c("1", "1", "2", "2", "3", "3"), year=c("2019", "2020", "2019", "2020", "2019", "2020"), p=c(107, 101, 114, 117, 97, 89)
    print(df)

# Summarize
    df.sum <- df %>%
    group_by(site.id) %>%
      summarise(p.sd=sd(p))
    print(df.sum)
EN

回答 2

Stack Overflow用户

发布于 2022-10-21 19:36:11

尝试以下两种方法之一:

代码语言:javascript
复制
# 1
df %>%
  mutate(year = as.numeric(year)) %>%
  group_by(site.id) %>%
  summarise(p.sd = sd(p), slope = cov(p, year) / var(year))

# 2
df %>%
  mutate(year = as.numeric(year)) %>%
  group_by(site.id) %>%
  summarise(p.sd = sd(p), slope = coef(lm(p ~ year))[[2]])

如果我们知道每个site.id都有2行,这在示例数据中是这样的,那么这也可以:

代码语言:javascript
复制
# 3 - only if every site.id has exactly 2 rows
df %>%
  mutate(year = as.numeric(year)) %>%
  group_by(site.id) %>%
  summarise(p.sd = sd(p), slope = diff(p) / diff(year))

如果我们知道每个site.id正好有2行和连续的年份,那么diff(年份)等于1,这在示例数据中是这样的,那么它可以简化为:

代码语言:javascript
复制
# 4 - only if every site.id has exactly 2 rows & consecutive years
df %>%
  group_by(site.id) %>%
  summarise(p.sd = sd(p), slope = diff(p))

备注

我们使用了这个问题上的输入:

代码语言:javascript
复制
df <- data.frame(site.id=c("1", "1", "2", "2", "3", "3"), 
  year = c("2019", "2020", "2019", "2020", "2019", "2020"),
  p = c(107, 101, 114, 117, 97, 89))
票数 2
EN

Stack Overflow用户

发布于 2022-10-21 19:14:44

代码语言:javascript
复制
# Sample df
df <- data.frame(site.id = c(1, 1, 2, 2, 3, 3), 
                 year = c(2019, 2020, 2019, 2020, 2019, 2020), 
                 p = c(107, 101, 114, 117, 97, 89))

# split by site.id, fit lm and extract slope coefficient
regression_slopes_list <- split(df, df$site.id) |> 
  lapply(function(x) { 
    lm(p ~ year, data = x)$coefficients[ 2 ] |> 
      as.numeric() 
  })

# transform list to data.frame
slopes_df <- data.frame(slope = unlist(regression_slopes_list), 
                        site.id = names(regression_slopes_list))

# get sd by site.id
sd_df <- tapply(df$p, df$site.id, sd) |> 
  as.data.frame() |> 
  `colnames<-`('sd')
sd_df$site.id <- rownames(sd_df)

# merge data.frame with slope data with sample df
df <- merge(df, slopes_df, by = 'site.id') |> 
  merge(sd_df, by = 'site.id')

print(df)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74157924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档