[英]Time series in R: How do I calculate percent change from a fixed year for multiple time series variables in R?
For multiple time series variables, how do I calculate the percent change over time relative to a fixed year?对于多个时间序列变量,我如何计算相对于固定年份随时间变化的百分比?
structure(list(haiarYear = 2009:2012,
anyInf = c(25914L, 23601L, 22713L, 22654L),
haiarPatDays = c(10402161L, 10289079L, 10212208L, 10033090L),
rate = c(2.49121312388839,
2.29379131018432,
2.22410276014746,
2.25792851454537)),
.Names = c("haiarYear", "anyInf", "haiarPatDays", "rate"),
row.names = c(NA, -4L),
class = "data.frame")
tsInfPatDays <- ts(tInfPatDays[,-1], start=2009)
options(digits=2)
Produces a time-series structure that looks like this:生成如下所示的时间序列结构:
Time Series:
Start = 2009
End = 2012
Frequency = 1
anyInf haiarPatDays rate
2009 25914 10402161 2.49
2010 23601 10289079 2.29
2011 22713 10212208 2.22
2012 22654 10033090 2.26
I want to calculate the percent change relative to 2009 for each of the variables: anyInf
, haiarPatDays
and rate
.我想计算每个变量相对于 2009 年的百分比变化: anyInf
、 haiarPatDays
和rate
。
For one variable, I can calculate percent change as:对于一个变量,我可以将百分比变化计算为:
transform(tsInfPatDays, since2009 = (rate-rate[1])/rate[1]*100)
Yielding:产量:
anyInf haiarPatDays rate since2009
25914 10402161 2.49 0.00
23601 10289079 2.29 -7.92
22713 10212208 2.22 -10.72
22654 10033090 2.26 -9.36
The following calculates percent change relative to the previous year and operates on each variable:以下计算相对于上一年的百分比变化并对每个变量进行操作:
100*(tsInfPatDays/lag(tsInfPatDays, -1)-1)
Giving:给予:
Time Series:
Start = 2010
End = 2012
Frequency = 1
tsInfPatDays.anyInf tsInfPatDays.haiarPatDays tsInfPatDays.rate
2010 -8.93 -1.087 -7.92
2011 -3.76 -0.747 -3.04
2012 -0.26 -1.754 1.52
Using this as a model, I expected to be able to perform the calculation by I needed by indexing the 2009 reference data tsInfPatDays[1,]
以此为模型,我希望能够通过索引 2009 年参考数据tsInfPatDays[1,]
来执行我需要的计算
anyInf haiarPatDays rate
2.59e+04 1.04e+07 2.49e+00
Then:然后:
(tsInfPatDays-tsInfPatDays[1,])/tsInfPatDays[1,]*100
The first row appears to be calculated properly, however subsequent rows are clearly wrong.第一行似乎计算正确,但随后的行显然是错误的。
I have seen a transposed matrix approach for row subtraction.我已经看到了行减法的转置矩阵方法。 Although not a percentage, as a proof of concept, I tried subtracting the values of the reference row from the time series rows.虽然不是百分比,但作为概念证明,我尝试从时间序列行中减去参考行的值。 I got the following error:我收到以下错误:
t(tsInfPatDays-t(tsInfPatDays[1,]))
Error in `-.default`(tsInfPatDays, t(tsInfPatDays[1, ])) :
non-conformable arrays
I get the same error if I try to extract the data before using the transposed matrix approach:如果我在使用转置矩阵方法之前尝试提取数据,我会得到同样的错误:
t(tsInfPatDays-t(drop(coredata(tsInfPatDays[1,]))))
Error in `-.default`(tsInfPatDays, t(drop(coredata(tsInfPatDays[1, ])))) :
non-conformable arrays
You can loop over columns:您可以遍历列:
ts(sapply(tsInfPatDays,function(x)(x-x[1])/x[1]*100), start= 2009)
Time Series:
Start = 2009
End = 2012
Frequency = 1
anyInf haiarPatDays rate
2009 0.000000 0.000000 0.000000
2010 -8.925677 -1.087101 -7.924726
2011 -12.352396 -1.826092 -10.722100
2012 -12.580073 -3.548022 -9.364298
An easier way to calculate it:更简单的计算方法:
#check if exist the packages installed
if(!require('tfplot')) {
install.packages('tfplot')
library('tfplot')
}
#create a time series randomly
z <- ts(matrix(100 + rnorm(200),100,2), start=c(1990,1), frequency=12)
z[z == 0] <- 1
#Convert level data to year over year percent change.
zyypc <- ytoypc(z)
zpc <- percentChange(z)
plot(zpc)
print(zpc)
You can learn more at this link: tfplot documentation您可以在此链接了解更多信息: tfplot 文档
There is another package very useful too (using the same data bellow):还有另一个非常有用的包(使用下面相同的数据):
if(!require('dse')) {
install.packages('dse')
library('dse')
}
y <- percentChange(z)
You can learn more at this link: dse documentation您可以在此链接了解更多信息: dse 文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.