我遇到错误当我尝试做以下工作时:
# generate random integrals #
data <- xts(floor(runif(100, 1,101)),as.Date("1973-02-01") + c(1:100) - 1)
apply.monthly(data, diff,1,1)
,虽然这个有效:
apply.monthly(data,mean)
我已经检查了类似的问题,但似乎它们不适用于此处的情况。
有什么建议吗?
进一步说明:
我需要这个的原因是我得到了如下的时间序列数据集,
1990-05 100
1990-04 80
1990-03 60
1990-02 20
1990-01 5
1989-12 110
1989-11 89
1989-10 78
...
每年y(t)=y_(t-1)+dy
,其中dt
是期间t的价值变化。但这种模式只发生在每年和每年分开。所以基本上,我想检索每个特定年份每个月之间的差异,即:
1990-05 20 #100-80
1990-04 20 #80-60
1990-03 40 #60-20
1990-02 15 #20-5
1990-01 5 #5
1989-12 21 #110-89
1989-11 11 #89-78
...
希望我已经说清楚了。
谢谢,
答案 0 :(得分:4)
apply.monthly
和period.apply
用于将数据汇总到指定的时间段。 diff
不起作用,因为diff.xts
返回与输入长度相同的向量。 mean
有效,因为它为给定的输入向量返回一个值。
我不清楚你期望apply.monthly(data, diff)
做什么。这与调用diff(data)
然后将NA
添加到每个月的第一个值相同。
通过编辑,我现在明白你要做什么了。你想要差异,但你希望每年的1月份是那个月的水平,而不是与去年12月的差异。
这是一种方法:
# Load your data as an example
Lines <-
"1990-05 100
1990-04 80
1990-03 60
1990-02 20
1990-01 5
1989-12 110
1989-11 89
1989-10 78"
con <- textConnection(Lines)
# Ensure the timezone of your non-intraday xts object is UTC,
# or bad things can happen
x <- as.xts(read.zoo(con, FUN=as.yearmon), tzone="UTC")
close(con)
# Create a helper function
f <- function(x) {
y <- diff(x)
if (.indexmon(y)[1] == 0)
y[1] <- x[1]
y
}
# apply the function to each year subset and rbind the results
do.call(rbind, lapply(split(x,'years'), f))
这是另一种方式,你可能会觉得更有吸引力。
colnames(x) <- "level"
# calculate all differences
x$diff <- diff(x$level)
# set January differences to their respective level
jan <- .indexmon(x) == 0
x[jan, "diff"] <- x[jan, "level"]