“近似”R中日期点的导数

时间:2012-04-22 08:13:09

标签: r function for-loop time-series derivative

所以我有一个MODIS NDVI值的时间序列(非地理极客的植被值从0到0),我试图通过使用for循环来近似导数。

这是我的数据样本:

> m2001
   date  value    valnorm
1     1 0.4834 0.03460912
2    17 0.4844 0.03664495
3    33 0.5006 0.06962541
4    49 0.4796 0.02687296
5    65 0.5128 0.09446254
6    81 0.4915 0.05109935
7    97 0.4664 0.00000000
8   113 0.5345 0.13864007
9   129 0.8771 0.83611564
10  145 0.9529 0.99043160
11  161 0.9250 0.93363192
12  177 0.9450 0.97434853
13  193 0.9491 0.98269544
14  209 0.9434 0.97109121
15  225 0.9576 1.00000000
16  241 0.8992 0.88110749
17  257 0.9115 0.90614821
18  273 0.8361 0.75264658
19  289 0.5725 0.21600163
20  305 0.5188 0.10667752
21  321 0.5467 0.16347720
22  337 0.5484 0.16693811
23  353 0.5427 0.15533388
  • 第1列是像素值的朱利安日
  • 第2列是原始NDVI值
  • 第3列是从0-1拉伸的NDVI(这是一种标准化技术,因为NDVI实际上很少达到1或0)。

我对编程和R仍然很陌生,但我想我已经成功地把它拼凑起来。我要做的是创建一个新的列,其值可以让我对数据点的局部斜率有所了解。

我提出的功能是:

deriv <- function(x1=1:23, x2=1){
    for (i in x1){
    i1 <- c(x1[i-1], x1[i], x1[i+1])
    i2 <- c(x2[i-1], x2[i], x2[i+1])
        deriv.func <- lm(i2~i1, na.action=NULL)
    } return(deriv.func$coef[[2]])
}

运行时会发生什么:

> deriv <- function(x1=1:23, x2=1){
+ for (i in x1){
+     i1 <- c(x1[i-1], x1[i], x1[i+1])
+     i2 <- c(x2[i-1], x2[i], x2[i+1])
+ deriv.func <- lm(i2~i1, na.action=NULL)
+ } return(deriv.func$coef[[2]])
Error: unexpected symbol in:
"deriv.func <- lm(i2~i1, na.action=NULL)
} return"
> }
Error: unexpected '}' in "}"
>

我不确定我做错了什么,因为当我为i填写一个值时我可以解析它

> i=6
> x1=m2001$date
> x2=m2001$valnorm
>     i1 <- c(x1[i-1], x1[i], x1[i+1])
>     i2 <- c(x2[i-1], x2[i], x2[i+1])
> i1
[1] 33 49 65
> i2
[1] 0.06962541 0.02687296 0.09446254
> lm(i2 ~ i1)

Call:
lm(formula = i2 ~ i1)

Coefficients:
(Intercept)           i1  
  0.0256218    0.0007762  

> func <- lm(i2 ~ i1)
> func$coef[[2]]
[1] 0.0007761604

有什么想法吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

尝试将'return'放在新行上。

    } 
    return(deriv.func$coef[[2]])
}

答案 1 :(得分:0)

好吧,在查看(很多)for循环之后,我得到它做我想要的。

deriv <- function(x1=1:23, x2=1){
  n=length(x1)
  deriv.func <- character(length = n)
    for (i in 1:n) {
    i1 <- c(x1[i-1], x1[i], x1[i+1])
    i2 <- c(x2[i-1], x2[i], x2[i+1])
        derivate <- lm(i2~i1)
        deriv.func[i] <- derivate$coef[[2]]*
    }
  return(deriv.func)
}

感谢您的帮助,以及正确方向的提示,@ dbaseman!
有意义的想法:

  • 确保我为迭代器deriv.func <- character(length = n)分配了空间。
  • 确保中间变量 没有覆盖输出。