我对循环的经验不是很丰富,所以不确定在哪里出错了... 我有一个看起来像这样的数据框:
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]
}
}
我尝试了几种选择(即不使用嵌套循环),但是我什么都没得到。 任何帮助将不胜感激!谢谢。
答案 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
首先,我们根据您的组(在本例中为年和月)嵌套数据,然后为每个组映射模型,然后为每个组映射系数,最后我们对系数进行嵌套并从长数据中分散数据宽。