-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 对象的操作会产生一个没有观察的 zoo 对象,通过运行 for 循环的一次迭代可以很容易地观察到。

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 回答