R语言计算时间序列各时点趋势值及玉米产量组分分离方法
是否可以通过线性模型完成?
完全可以。你提到的产量分解逻辑本质就是通过拟合长期趋势得到趋势产量,再用实际产量减去趋势产量得到气候产量,线性回归是这类需求最常用的实现方案之一。如果你的数据长期趋势存在明显非线性特征,也可以切换为多项式回归、局部加权回归等方案适配。
R语言实现步骤
1. 数据导入
你可以直接读取本地存储的产量数据,也可以手动构造数据框,样例代码如下:
# 手动构造样例数据,实际使用时替换为read.csv/read.table读取本地文件即可 corn_prod <- data.frame( year = 1979:2020, production = c(1061, 1900, 1701, 1180, # 这里替换为你1983-2019年的实际产量数据 1245) )
2. 线性回归拟合趋势产量
# 以年份为自变量拟合线性模型 lm_fit <- lm(production ~ year, data = corn_prod) # 提取模型拟合值作为趋势产量Yt corn_prod$Yt <- fitted(lm_fit) # 按公式计算气候产量Yc = 实际产量 - 趋势产量 corn_prod$Yc <- corn_prod$production - corn_prod$Yt
3. 可选:非线性趋势适配
如果线性拟合效果不佳,可改用二阶多项式回归拟合更灵活的趋势:
poly_fit <- lm(production ~ poly(year, 2), data = corn_prod) corn_prod$Yt_poly <- fitted(poly_fit) corn_prod$Yc_poly <- corn_prod$production - corn_prod$Yt_poly
4. 结果验证与导出
你可以通过绘图直观查看拟合效果:
# 绘制实际产量和趋势产量对比图 plot(corn_prod$year, corn_prod$production, type = "o", xlab = "年份", ylab = "玉米年产量") lines(corn_prod$year, corn_prod$Yt, col = "red", lwd = 2) legend("topleft", legend = c("实际产量", "线性趋势产量"), col = c("black", "red"), lty = 1) # 导出结果到本地csv write.csv(corn_prod, "玉米产量分解结果.csv", row.names = FALSE)
内容的提问来源于stack exchange,提问作者Amrit
相关产品推荐
相关产品推荐

