我的数据包含两列(时间,结果)。对于每一秒,我对'结果'有不同的价值。如果超过给定条件,我想每秒检查一次'结果'的值。根据先前的平均值,“结果”的每个值都会发生变化。先前的均值是根据以下指数加权移动平均值(EWMA)计算得出的:
μn = μn−1 + (1 − lambda)Xn ,
lambda is the EWMA factor (for this example use 0.2)
μn−1 is the mean value calculated from measurements prior to record n.
μn is the mean.
Xn is the value of 'Result' in the nth record.
n is number of records in the df
条件是:
g是变量,每当条件为真时递增。
if (Xn > (1.5)μn−1) {
g<-g+1
}
必须对数据中的所有记录执行此逻辑。
这是MWE:
readFile<- read.table("data.tr",header=F, stringsAsFactor=F)
colnames(readFile)<-c("time","Results")
df<-data.frame(Time=readFile$time,Results=readFile$Results)
#The data looks like (df);
Time Results
1 10
2 15
3 15
4 10
5 10
6 30
7 15
8 25
9 40
10 22
11 48
12 50
13 30
14 40
15 64
16 46
17 30
18 10
19 17
20 53
#define variables
g<-0
result<-0
previousAverage<-0
for(i in df){
result<-df&Results[i]
# Here I'm confused how to make the recursive call !!
#I'm assuming the average should be returned from a separate method
#(i.e AverageCalculation) and use in the condition
condition <- (1.5) * previousAverage
if ( result > condition){
g<-g+1
}
}
我发现“qcc”包计算EWMA,这应该简化计算。但是,我想使用上面的等式。对我来说困难的部分是如何计算从第一个记录到第n个记录的平均值并继续转移?我怎么能保持当前的记录值。
有什么建议吗?!!!
答案 0 :(得分:0)
在你的循环之外,初始化mu和一列滞后。
mu = 0
df$prevmu <- 0
然后遍历行,
for(i in 1:nrow(df)) {
df$prevmu[i] <- mu
mu <- mu + (1 - lambda) * df$Result[i]
}
现在你可以计算g:
g <- with(df, sum(Results > 1.5 * prevmu))