变化点分析中反映均方误差估计的Dplyr工作流 背景

变化点分析中反映均方误差估计的Dplyr工作流 背景,r,time-series,dplyr,panel-data,mean-square-error,R,Time Series,Dplyr,Panel Data,Mean Square Error,您好,我想检查所提供的工作流程是否反映了所述的均方误差估计器的计算 问题 我希望工作流能够反映以下等式: 其中: 24反映了泰勒数据集中的观察总数。在提供数据的情况下,这将对应于每组10个观察值 资料 使用的数据相当简单,与摘录相似: set.seed(123) dta <- data.frame(group = rep(LETTERS[1:3], 10), year = rep(2001:2010, 3), v

您好,我想检查所提供的工作流程是否反映了所述的均方误差估计器的计算

问题 我希望工作流能够反映以下等式:

其中:

  • 24反映了泰勒数据集中的观察总数。在提供数据的情况下,这将对应于每组10个观察值
资料 使用的数据相当简单,与摘录相似:

set.seed(123)
dta <- data.frame(group = rep(LETTERS[1:3], 10),
                  year = rep(2001:2010, 3),
                  value = round(runif(30),2))
set.seed(123)
dta%
分组依据(分组)%>%
变异(X1=总和(值)/行数())%>%
变异(X2=cumsum(lead(value))/(length(value)-行号())%>%
突变(MSEe=cumsum((值-X1)^2+(值-X2)^2))

参考文献
Taylor,2010,《变化点分析:检测变化的强大新工具》:

这就是我目前所拥有的。。。希望能学到更好的方法

dta %>%
    arrange(group, year) %>% 
    group_by(group) %>% 
    mutate(cmX1=cummean(value), cmX2=(sum(value)-cumsum(value)) / (length(value) - row_number())) %>%
    do(data.frame(m=1:nrow(.), 
        MSE=sapply(1:nrow(.), function(n) sum((.$value[1:n] - .$cmX1[n])^2) + 
                sum((.$value[(n+1):length(.$value)] - .$cmX2[n])^2)))) %>% 
    ungroup()
数字检查:

mse <- function(x, m) { 
    meanX1 <- sum(x[1:m]) / m 
    meanX2 <- sum(x[(m+1):length(x)]) / (length(x)-m) 
    sum((x[1:m] - meanX1)^2) + sum((x[(m+1):length(x)] - meanX2)^2) 
} #mse 

dta <- dta[order(dta$group, dta$year),]
sapply(1:10, function(n) mse(dta$value[dta$group=="A"], n))

mse Hi Konrad,似乎缺少m?如果我没有错的话,你需要分成上m组和下m组group@chinsoon12谢谢你表现出兴趣。对不起,我应该在他的原始示例中更详细地解释Taylor使用每月数据,因此m值对应于每个月。如果提供的数据是年度数据,m将反映每年的情况。由于每个组中的数据是按年份排序的,所以我考虑使用
row\u number()
调用来引用当前行。关于拆分,我希望工作流能够拆分每一行的数据并返回MSE(m)以找到最小值,因此
cumsum()
calls.MSE@chinsoon12非常感谢您的贡献。如果您愿意,请随意建议作为答案,可能没有人会对代码的
dplyr
方面发表评论。它并没有真正回答您的问题,因此我不想将其作为答案发布。非常感谢,这是一个开始。我还考虑在中嵌入一个函数。理想情况下,我认为问题可以归结为使用in
dplyr
mse <- function(x, m) { 
    meanX1 <- sum(x[1:m]) / m 
    meanX2 <- sum(x[(m+1):length(x)]) / (length(x)-m) 
    sum((x[1:m] - meanX1)^2) + sum((x[(m+1):length(x)] - meanX2)^2) 
} #mse 

dta <- dta[order(dta$group, dta$year),]
sapply(1:10, function(n) mse(dta$value[dta$group=="A"], n))