2012-04-22 7 views
2

私はMODIS NDVI値の時系列を持っています(非地理的なオタクの0-1からの植生値)、私は近似を試みていますforループ。日付ポイントの派生物を近似するR

これは私のデータのサンプルである:

> 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
  • 3列生NDVI値で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 

アイデアはありますか?ありがとう、トン。

答えて

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)に割り当てられたスペースを持っていたことを確認すること


  • 違いを作ったアイデア。
  • 中間変数 が出力を上書きしていないことを確認してください。
1

新しい行に「return」を入れてみてください。

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

よく部分的に解決します!ありがとうございました!今度はエラーなしで入力しますが、実行すると '> deriv(m2001 $ date、m2001 $ valnorm)' 私はこれを得ます: 'lm.fit(x、y、offset = offset、singular.ok =外部関数呼び出し(arg 1)のNA/NaN/Inf ' データ型またはループのいずれかと関係があると感じています。 – forestman