使用筛选器调用特定行的线性回归For循环

af7jpaap  于 2023-03-15  发布在  其他
关注(0)|答案(3)|浏览(105)

我有一个不同地点、年份和最高温度的数据框架。我想对每个特定地点的温度和年份进行线性回归。如果我可以编写一个for循环,将相同的线性回归模型分别应用于所有地点,并提供一个包含地点名称的输出,而不是对每个地点进行线性回归,那就更好了。我制作了一些虚拟数据,我有25个网站在实际的df。

data<- data.frame(site= c('alder','alder','alder','alder','alder','alder','alder','alder', 'oak','oak','oak','oak','oak','oak','oak','oak' ),
                  year= c('2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015','2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015'),
                  temp= c(0.5,3, 12, 42, 67, 8, 12, 22, 11, 4, 3, 6, 76, 1, 11, .9))

到目前为止,我是这么做的:

output<- vector("list", length(unique(data$site)))

sites<- unique(data$site)

for (i in sites) {
  data %>% filter(site=i) =j
   lm(formula = temp~year, data = j)=k
  output[[i]]=k
  }

我不确定让for循环调用对应于一个站点的行的子集的最佳方法是什么。

Error in data %>% filter(site = i) <- j : 
  could not find function "%>%<-"

我已经确定了tidyverse在我的图书馆里
谢谢你的帮忙!

h5qlskok

h5qlskok1#

这里有几处错别字,=应该是==,并且执行->而不是=。第三个问题是对[[i]]的赋值-这里i是每个站点的值。因此,我们可能需要命名output以获得正确的赋值

names(output) <- sites
for (i in sites) {
  data %>% filter(site==i) -> j
   lm(formula = temp~year, data = j)-> k
  output[[i]]=k
  }
  • 输出
> output
$alder

Call:
lm(formula = temp ~ year, data = j)

Coefficients:
(Intercept)     year2009     year2010     year2011     year2012     year2013     year2014     year2015  
        0.5          2.5         11.5         41.5         66.5          7.5         11.5         21.5  

$oak

Call:
lm(formula = temp ~ year, data = j)

Coefficients:
(Intercept)     year2009     year2010     year2011     year2012     year2013     year2014     year2015  
  1.100e+01   -7.000e+00   -8.000e+00   -5.000e+00    6.500e+01   -1.000e+01   -3.263e-15   -1.010e+01

使用tidyverse,我们可以通过几种方式来实现这一点

library(dplyr)
library(tidyr)
data %>% 
    nest_by(site) %>%
    mutate(model = list(lm(temp ~ year, data = data))) %>% 
    ungroup
# A tibble: 2 × 3
  site                data model 
  <chr> <list<tibble[,2]>> <list>
1 alder            [8 × 2] <lm>  
2 oak              [8 × 2] <lm>

或者使用reframe # dplyr版本〉= 1.1.0

data %>%
   reframe(model = list(lm(temp  ~year)), .by = site) %>%
   as_tibble
  • 输出
# A tibble: 2 × 2
  site  model 
  <chr> <list>
1 alder <lm>  
2 oak   <lm>
ylamdve6

ylamdve62#

使用碱基R:

lapply(split(data[, c("year", "temp")], data[, "site"]), 
       function(x) lm(temp ~ year, data=x))
xtfmy6hx

xtfmy6hx3#

显示的数据太小,无法估计sd,但假设您实际上有更多数据,请使用lmList

library(nlme) # comes with R so does not need to be installed

lmList(temp ~ year | site, data)

给予

Call:
  Model: temp ~ year | site 
   Data: data 

Coefficients:
      (Intercept) year2009 year2010 year2011 year2012 year2013      year2014 year2015
alder         0.5      2.5     11.5     41.5     66.5      7.5  1.150000e+01     21.5
oak          11.0     -7.0     -8.0     -5.0     65.0    -10.0 -3.263376e-15    -10.1

Error in pooledSD(x) : no degrees of freedom for estimating std. dev.

相关问题