【问题标题】:loop to run model on subset dataframe循环在子集数据帧上运行模型
【发布时间】:2018-08-19 01:49:27
【问题描述】:

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

 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]
  }
 }

我尝试了几个选项(即不使用嵌套循环),但我没有得到任何结果。 任何帮助将不胜感激!谢谢。

【问题讨论】:

  • 也许这篇文章可以提供帮助:stackoverflow.com/questions/51796317/…。如果您仍然遇到问题,请发布一些数据(可能是 3 个月),这样会更容易提供帮助。
  • 感谢您的帮助!是的,我可以使用 tidyverse 进行子集化和建模工作,但是输出太长了,我必须手动将每个 672 个参数复制到另一个表中。我不知道如何用 tidyverse 自动化它,所以我认为循环会做所有事情?我将编辑我的问题以发布更多数据,干杯!
  • 当你用更多数据更新帖子时,我会看看是否能提供帮助。

标签: r loops nested subset


【解决方案1】:

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

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

首先,我们根据您的组(在本例中为年份和月份)嵌套数据,然后我们为每个组映射模型,然后我们为每个组映射系数,最后我们取消嵌套系数并将数据从长变宽。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2013-11-21
    • 2016-08-24
    • 2015-06-20
    • 2015-07-14
    相关资源
    最近更新 更多