"Аппроксимирующая" производная от точек даты в R

Итак, у меня есть временной ряд значений MODIS NDVI (значения растительности от 0-1 для негеографических вундеркиндов), и я пытаюсь приблизить производную с помощью 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 - это NDVI, растянутый от 0 до 1 (это метод нормализации, поскольку 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=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 ответа

Решение

Ну, посмотрев (намного) больше в 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),
  • убедившись, что промежуточные переменные не перезаписывают вывод.

Попробуйте поставить "возврат" на новой строке.

    } 
    return(deriv.func$coef[[2]])
}
Другие вопросы по тегам