将顺序数据点拟合到R中的季节性曲线

时间:2015-02-23 10:05:47

标签: r nls

我正在尝试将描述短时间内温度变化的数据点拟合为一年内的季节性曲线。另外,我想衡量它们的合适程度。

我使用现代温度数据构建正弦曲线:

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)之间的差异:

  1. b告诉我有关贝壳个体生长率的信息
  2. c,采样开始的一年中的时间(它与y轴的交叉方式)。
  3. d告诉我同位素数据的一般浓缩(如何 高或低它在y轴上)
  4. 而且我对每个新参数的确定性如何。 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
    

    enter image description here

    我可以看到数据集中发生了季节性变化。但是R没有认识到它。也许是因为曲线太浅了?

    对于其他不太清晰的序列,我也会收到错误消息single gradientstep factor 0.000488281 reduced below 'minFactor'of 0.000976562。我想把它算作“失败”,但后来我不确定,R如何决定做什么。

    季节性曲线本身只是温度变化的粗略拟合(相当正弦曲线),但我找不到更好的方法来测量拟合度。壳的生长速度也不同,无论如何都会扭曲季节性曲线。 也许我只是使用了错误的功能? 有任何改进的想法吗?

0 个答案:

没有答案