-6

私はパーセント変化のRに動物園のオブジェクトを持っています。1 または 100 から始まるこれらのパーセント変化を合成して、拡大/減衰が合成されているかどうかを確認したいと思います。

Lines <- "obs     date   pctchng comgrowth  
  1   2010-10-04 NA        100
  2   2010-10-01 .15       NA
  3   2010-09-30 .14       NA
  4   2010-09-29 -.05      NA
  5   2010-09-28 -.12      NA
  6   2010-09-27 .07       NA
  7   2010-09-24 -.15      NA
  8   2010-09-23 .186      NA
  9   2010-09-22 .01       NA
  10  2010-09-21 .03       NA
  11  2010-09-20 -.03      NA"
data <- read.zoo(textConnection(Lines), header=TRUE, index=2)
startobs <- 1
for (i in 1:100) {
  data[startobs+i,"comgrowth"] <- data[startobs+i-1,"comgrowth"] *
    (1+data[startobs+i,"pctchng"])
}

簡単に表示できるようにデータを単純化していますが、これが私がやろうとしている考えです。足し算/引き算/割り算/掛け算のときに問題があることに気付きました。なんとなく言えるdata[startobs+i,"comgrowth"]=data[startobs+i-1,"comgrowth"]けど…

とは言えませんdata[startobs+i,"comgrowth"]=data[startobs+i-1,"comgrowth"]+data[startobs+i-2,"comgrowth"]。R では +/-/* などを追加できず、このエラーが発生します

Error in NextMethod("[<-") : replacement has length zero

これは純粋で単純な構文の問題です。私が間違っていることを誰かが知っていますか?

4

2 に答える 2

5

あなたの質問のオブジェクトは動物園のオブジェクトではあり得ないと思っていましたが、私はそれを使用して作成し、再現可能な例を作成しました。

library(zoo)
z <- structure(c(-0.03, 0.03, 0.01, 0.186, -0.15, 0.07, -0.12, -0.05, 
  0.14, 0.15, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 100),
  .Dim = c(11L, 2L), .Dimnames = list(NULL, c("pctchng", "comgrowth")),
  index = structure(c(14872, 14873, 14874, 14875, 14876, 14879, 14880,
  14881, 14882, 14883, 14886), class = "Date"), class = "zoo")
sobs <- 1
for (i in 1:10) {
  z[sobs+i,"comgrowth"]=z[sobs+i-1,"comgrowth"]*(1+z[sobs+i,"pctchng"])
}

エラーはOps、zoo オブジェクトが操作を実行する前にまずインデックスによって整列されるためです。したがって、インデックスが重複していない動物園オブジェクトを操作すると、観察のない動物園オブジェクトが生成されます。これは、for ループの 1 回の反復を実行することで簡単に観察できたはずです。

i <- 1
sobs <- 1
z[sobs+i-1,"comgrowth"]*(1+z[sobs+i,"pctchng"])

答えは、ベクトル化された関数を使用し、for ループをまとめて回避することです。

z <- structure(c(-0.03, 0.03, 0.01, 0.186, -0.15, 0.07, -0.12, -0.05,
  0.14, 0.15), .Dim = c(10L, 1L), .Dimnames = list(NULL, "pctchng"),
  index = structure(c(14872, 14873, 14874, 14875, 14876, 14879, 14880,
  14881, 14882, 14883), class = "Date"), class = "zoo")
z$comgrowth <- 100*cumprod(1+z$pctchng)
于 2013-01-06T20:01:58.623 に答える
2

Ops.zoo での登録の問題に加えて、データ レイアウトには別のセマンティクスの問題があります。操作data後のオブジェクトを見てください。read.zoo

> data
           obs pctchng comgrowth
2010-09-20  11  -0.030        NA
2010-09-21  10   0.030        NA
2010-09-22   9   0.010        NA
2010-09-23   8   0.186        NA
2010-09-24   7  -0.150        NA
2010-09-27   6   0.070        NA
2010-09-28   5  -0.120        NA
2010-09-29   4  -0.050        NA
2010-09-30   3   0.140        NA
2010-10-01   2   0.150        NA
2010-10-04   1      NA       100

日付インデックスの順序が逆になり、「comgrowth」エントリの開始値がシーケンスの間違った末尾にあります。

于 2013-01-06T20:34:54.210 に答える