如何在R中用lm()为1900-1923年太阳黑子数据拟合10.4年周期正弦曲线
用R的lm()拟合周期10.4年的正弦曲线步骤
先把数据整理成便于处理的格式,你提供的观测值对应1900-1923年,先把年份和太阳黑子指数整合到数据框:
# 构造1900-1923年的年份向量 year <- 1900:1923 # 你的太阳黑子指数数据 values <- c(113.5,32.9, 60.3,92.6,503.4,761.6,646.3,744.4, 582.5,526.6,223.0, 68.4, 43.1,17.3, 115.1,568.4,684.8, 1246.7,966.9,763.3,451.7,313.6,170.9,69.3) # 整合为数据框 sunspot_data <- data.frame(year = year, index = values)
核心:构造10.4年周期的正弦回归项
正弦函数的周期控制靠弧度转换,公式为 sin(2 * pi * 时间变量 / 周期)。这里我们先计算每个年份相对于1900年的偏移年数,作为时间变量:
# 计算相对于1900年的年数 sunspot_data$t <- sunspot_data$year - 1900
拟合周期模型
如果只拟合纯正弦项(固定相位),可以直接用:
# 仅正弦项的回归模型 model_sin <- lm(index ~ sin(2 * pi * t / 10.4), data = sunspot_data) # 查看拟合结果 summary(model_sin)
但实际数据的相位通常不确定,加上余弦项能覆盖任意相位的周期函数,拟合效果更准确:
# 包含正弦+余弦项的完整周期模型 model_full <- lm(index ~ sin(2 * pi * t / 10.4) + cos(2 * pi * t / 10.4), data = sunspot_data) summary(model_full)
可视化拟合效果
可以画图对比观测值和拟合曲线:
# 计算拟合值 sunspot_data$fitted <- predict(model_full) # 绘图 plot(sunspot_data$year, sunspot_data$index, pch = 16, col = "blue", main = "太阳黑子指数与10.4年周期正弦拟合", xlab = "年份", ylab = "太阳黑子指数") lines(sunspot_data$year, sunspot_data$fitted, col = "red", lwd = 2) legend("topright", legend = c("观测值", "拟合曲线"), col = c("blue", "red"), pch = c(16, NA), lty = c(NA, 1))
关键逻辑:2 * pi * t / 10.4 把时间t转换成以10.4年为周期的弧度值——每过10.4年,这个值增加2π,正好对应正弦函数一个完整周期,以此固定周期为10.4年。
内容的提问来源于stack exchange,提问作者NoaMi
相关产品推荐
相关产品推荐

