我在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
这是一个完整的问题,纯粹而简单。有谁知道我做错了什么?
答案 0 :(得分:5)
即使你的问题中的对象不能成为动物园对象,我也用它来创建一个......并创建一个reproducible example。
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
在执行操作之前首先按索引对齐。因此,对没有重叠索引的动物园对象的操作会产生一个没有观察的动物园对象,这可以通过运行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)
答案 1 :(得分: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”条目的起始值位于序列的错误末尾。