我正在尝试将描述短时间内温度变化的数据点拟合为一年内的季节性曲线。另外,我想衡量它们的合适程度。
我使用现代温度数据构建正弦曲线:
y=0.77*sin(-0.45*x)-1.5
顺序数据点是来自碳酸盐壳的同位素值(这就是为什么y值看起来与任何温度标度不同),并且分析的壳体每年生长约13 mm,这解释了奇怪的x值。
拟合数据是10-15分的序列,可以涵盖6周到半年之间的任何数据。所以记录的温度变化并不总是很多。一些点的准确性也可能很差。 这些问题对我来说没问题,因为我想测量一下他们最适合的程度。
我使用这个nls()
函数:
fit=nls(y~-0.77*sin(b*x+c)+d, start=list(b=-0.45,c=0,d=-1.5))
(之所以我不想找到振幅的新值,是因为R试图将正弦曲线的最大值和最小值拟合到我的有限数据集中,从而扭曲其他所有值)
这里有一些效果很好的值:
x=c(0.00, 0.16, 0.32, 0.37, 0.81, 1.30, 1.70, 1.95, 2.16, 2.43, 2.57, 2.86, 3.23, 3.57, 4.06, 4.16, 4.52, 4.87, 4.91, 5.27, 5.71, 6.20, 6.75, 7.31, 7.94, 8.50, 9.02, 9.46, 9.93, 10.47, 10.82, 11.13, 11.36, 11.78, 12.25, 12.70, 13.00)
y=c(-1.20, -1.49, -1.37, -1.50, -0.75, -0.80, -0.60, -0.75, -0.70, -1.07, -1.20, -0.70, -0.60, -0.84, -0.76, -0.80, -1.10, -0.88, -1.30, -1.10, -1.40, -1.70, -1.90, -2.10, -2.10, -1.90, -2.60, -2.30, -2.10, -1.80, -1.80, -2.80, -2.10, -1.90, -2.20, -1.90, -1.40)
Formula: y ~ -0.77 * sin(b * x + c) + d
Parameters:
Estimate Std. Error t value Pr(>|t|)
b -0.73227 0.01978 -37.02 <2e-16 ***
c 3.60132 0.17710 20.34 <2e-16 ***
d -1.02625 0.05027 -20.41 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2549 on 25 degrees of freedom
Number of iterations to convergence: 12
Achieved convergence tolerance: 7.375e-06
我还绘制了值并为它们拟合了一条线来显示结果。
xyear=c(0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0)
bb=coef(fit)[1]
cc=coef(fit)[2]
dd=coef(fit)[3]
lines(xyear,-0.77*sin(bb*xyear+cc)+dd, col=c("blue"))
lines(xyear,-0.77*sin(-0.45*xyear+cc)-1.55)
我在这里感兴趣的是残差(我没有遇到任何问题)和起点(b,c,d)和新参数(bb,cc,dd)之间的差异:
而且我对每个新参数的确定性如何。 nls()可以给我所有的东西。大! 但这组数据也很好。 如果我使用像这样的较短的
x8t4= 0.447702, 0.788084, 1.214854, 1.669275, 1.947880, 2.422088, 3.539721, 4.654005, 6.709839, 7.000000
y8t4=-1.09, -1.08, -1.23, -1.21, -1.29, -1.33, -1.45, -1.47, -1.35, -1.35
我得到的结果不太可能:
Formula: y ~ -0.77 * sin(b * x + c) + d
Parameters:
Estimate Std. Error t value Pr(>|t|)
b -0.3493 0.1221 -2.860 0.028798 *
c -1.8694 0.7101 -2.633 0.038914 *
d -1.7227 0.2870 -6.002 0.000963 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.05984 on 6 degrees of freedom
Number of iterations to convergence: 7
Achieved convergence tolerance: 7.59e-07
我可以看到数据集中发生了季节性变化。但是R没有认识到它。也许是因为曲线太浅了?
对于其他不太清晰的序列,我也会收到错误消息single gradient
或step factor 0.000488281 reduced below 'minFactor'of 0.000976562
。我想把它算作“失败”,但后来我不确定,R如何决定做什么。
季节性曲线本身只是温度变化的粗略拟合(相当正弦曲线),但我找不到更好的方法来测量拟合度。壳的生长速度也不同,无论如何都会扭曲季节性曲线。 也许我只是使用了错误的功能? 有任何改进的想法吗?