学习 R 语言 - 我知道如何计算移动平均线,但我需要做更多 - 但我不是统计学家 - 不幸的是,所有文档似乎都是为统计学家编写的。
我经常用excel做这个,它对于分析运营事件真的很方便。
以下是每行的字段,用于生成 bollinger bands :
值(value)可以是电话数量、投诉率等
时间戳 |值(value) |移动平均线 |移动 STDEVP |下控制 |上控制
简而言之,移动 avg 和 stdevP 指向系列中的前 8 个左右的值。给定时间点的下控制 = 移动平均 - 2*移动 stdevP 和上控制 = 移动平均 + 2*移动 stdevP
这可以很容易地在单个文件的 excel 中完成,但如果我能找到一种方法让 R 工作 R 将更好地满足我的需求。希望在自动化时也能更快、更可靠。
链接或提示将不胜感激。
最佳答案
您可以使用 rollapply()
包中的 zoo
函数,为您提供一个动物园系列:
TimeSeries <- cumsum(rnorm(1000))
ZooSeries <- as.zoo(TimeSeries)
BollLines <- rollapply(ZooSeries,9,function(x){
M <- mean(x)
SD <- sd(x)
c(M,M+SD*2,M-SD*2)
})
现在您必须记住
rollapply
使用居中框架,这意味着它采用当天左侧和右侧的值。与您采用 x 先前值的建议相比,这也更方便且更符合布林带的定义。如果您不想转换为动物园,您也可以使用向量并编写自己的函数。我添加了一个基于 S3 的绘图功能,让您也可以轻松地绘制计算图。使用这些功能,您可以执行以下操作:
TimeSeries <- cumsum(rnorm(1000))
X <- BollingerBands(TimeSeries,80)
plot(X,TimeSeries,type="l",main="An Example")
要得到 :
功能代码:
BollingerBands <- function(x,width){
Start <- width +1
Stop <- length(x)
Trail <- rep(NA,ceiling(width/2))
Tail <- rep(NA,floor(width/2))
Lines <- sapply(Start:Stop,function(i){
M <- mean(x[(i-width):i])
SD <- sd(x[(i-width):i])
c(M,M+2*SD,M-2*SD)
})
Lines <- apply(Lines,1,function(i)c(Trail,i,Tail))
Out <- data.frame(Lines)
names(Out) <- c("Mean","Upper","Lower")
class(Out) <- c("BollingerBands",class(Out))
Out
}
plot.BollingerBands <- function(x,data,lcol=c("red","blue","blue"),...){
plot(data,...)
for(i in 1:3){
lines(x[,i],col=lcol[i])
}
}
关于R 时间序列 - 在制作布林线时遇到问题 - 请需要简单的例子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3672761/