如何计算模拟数据10个实现的协方差数值?stepR包报错排查
问题描述
在R中使用stepR包的DepSMUCE方法估计变点数量时,因协方差参数格式不符合要求报错:
Error in .familyMDependentPS(data = data, y = y, ...) :
covariances have to be a finite numeric vector.
已生成模拟数据并通过公式计算协方差数值向量,但执行变点估计时触发上述错误,尝试代码如下:
library(stepR) set.seed(1234) f <- rep(c(0, 2, -2, 2, -2), c(200, 200, 200, 200, 200)) y <- as.data.frame( replicate(10, f + arima.sim(list(ar=c(.9)), n=1000, sd=.4358899)) ) correlations <- function(x) { (acf(arima.sim(list(ar=c(.9), ma=c()), n=1000, sd=.4358899), lag.max=1))$acf } cor <- sapply(y, correlations) covar <- function(cor) .4358899^2 * cor cova <- lapply(cor, covar) covariances <- lapply(cova, as.numeric) x <- seq(.001, 1, .001) fit <- function(X) { stepFit(X, x=x, alpha=.1, family="mDependentPS", covariances=covariances, jumpint=TRUE, confband=TRUE)$rightIndex } cp <- sapply(y, fit)
问题原因
- 协方差格式不符:
covariances被处理成了列表(lapply返回列表),但stepFit的mDependentPS家族要求传入单一有限数值向量,而非列表。 - 协方差计算冗余且随机:
correlations函数每次重新模拟AR(1)序列计算自相关,既浪费资源又引入随机误差,还可能导致协方差值出现异常。 - 循环逻辑错误:
sapply(y, fit)对每列数据调用fit时,传入了对应所有列的协方差列表,不符合函数单向量的要求。
解决方案
1. 用理论值计算AR(1)模型的协方差
对于AR(1)模型$Y_t = \phi Y_{t-1} + \epsilon_t$($\phi=0.9$,$\sigma_\epsilon=0.4358899$),滞后1阶的自协方差理论值为:
$\gamma(1) = \sigma^2 \frac{\phi}{1-\phi^2}$
2. 修正协方差格式与代码逻辑
修正后的代码:
library(stepR) set.seed(1234) # 生成模拟数据 f <- rep(c(0, 2, -2, 2, -2), c(200, 200, 200, 200, 200)) y <- as.data.frame( replicate(10, f + arima.sim(list(ar=c(.9)), n=1000, sd=.4358899)) ) # 计算AR(1)模型的理论滞后1阶协方差 phi <- 0.9 sigma_epsilon <- 0.4358899 covariances <- c((sigma_epsilon^2 * phi) / (1 - phi^2)) x <- seq(.001, 1, .001) fit <- function(X) { stepFit(X, x=x, alpha=.1, family="mDependentPS", covariances=covariances, jumpint=TRUE, confband=TRUE)$rightIndex } # 对每列数据估计变点 cp <- sapply(y, fit)
额外说明
- 若需考虑更高阶依赖(如m>1),只需扩展
covariances向量,加入对应滞后阶数的理论自协方差即可。 - 使用理论值替代模拟计算,既保证准确性,又避免随机波动导致的协方差值异常。
内容的提问来源于stack exchange,提问作者Tare
相关产品推荐
相关产品推荐

