循环以在子集数据帧上运行模型

时间:2018-08-19 01:49:27

标签: r loops nested subset

我对循环的经验不是很丰富,所以不确定在哪里出错了... 我有一个看起来像这样的数据框:

 month year day mean.temp mean.temp.year.month
     1 1961   1      4.85             4.090323
     1 1961   2      4.90             4.090323
     1 1961   3      2.95             4.090323
     1 1961   4      3.40             4.090323
     1 1961   5      2.90             4.090323

显示2年3个月的数据集可以在这里找到: https://drive.google.com/file/d/1w7NVeoEh8b7cAkU3cu1sXx6yCh75Inqg/view?usp=sharing

,我想按年和月对这个数据框进行子集化,这样我就可以每年和月运行一个nls模型。由于我的数据集包含56年(每年有12个月),因此将提供672个模型。然后,我想将参数估计值存储在单独的表中。

我已经创建了这段代码,但是我无法弄清楚为什么它只给我12个月(所有56年,但只有12个月)的参数估计值:

table <- matrix(99999, nrow=672, ncol=4)
YEARMONTHsel <- unique(df_weather[c("year", "month")])
YEARsel <- unique(df_weather$year)
MONTHsel <- unique(df_weather$month)
for (i in 1:length(YEARsel))  {
  for (j in 1:length(MONTHsel)) {
  temp2 <-  df_weather[df_weather$year==YEARsel[i] & df_weather$month==MONTHsel[j],]
   mn <- nls(mean.temp~mean.temp.year.month+alpha*sin(day*pi*2/30+phi), 
          data = temp2, control=nlc,
          start=list(alpha=-6.07043, phi = -10))
   cr <- as.vector(coef(mn))
   nv <-length(coef(mn))
   table[i,1:nv] <- cr 
   table[i,nv+1]<- YEARsel[i]
   table[i,nv+2]<- MONTHsel[j]
  }
 }

我尝试了几种选择(即不使用嵌套循环),但是我什么都没得到。 任何帮助将不胜感激!谢谢。

1 个答案:

答案 0 :(得分:0)

根据您的循环,您似乎想运行按年和月分组的回归,然后在新数据框中提取系数(如果那是错的,请纠正我)

library(readxl)
library(tidyverse)

df <- read_excel("~/Downloads/df_weather.xlsx")

df %>% nest(-month, -year) %>% 
  mutate(model = map(data, ~nls(mean.temp~mean.temp.year.month+alpha*sin(day*pi*2/30+phi), 
                                data = .x, control= "nlc",
                                start=list(alpha=-6.07043, phi = -10))),
         coeff = map(model, ~coefficients(.x))) %>%
  unnest(coeff %>% map(broom::tidy)) %>%
  spread(names, x) %>%
  arrange(year)

#> # A tibble: 6 x 4
#>   month  year  alpha    phi
#>   <dbl> <dbl>  <dbl>  <dbl>
#> 1     1  1961  0.561 -10.8 
#> 2     2  1961 -1.50  -10.5 
#> 3     3  1961 -2.06   -9.77
#> 4     1  1962 -3.35   -5.48
#> 5     2  1962 -2.27   -9.97
#> 6     3  1962  0.959 -10.8

首先,我们根据您的组(在本例中为年和月)嵌套数据,然后为每个组映射模型,然后为每个组映射系数,最后我们对系数进行嵌套并从长数据中分散数据宽。