时间序列中具有标准差的离群值检测Stata

问题描述 投票:0回答:2

我有一个包含 10 个参与者的数据集。这些参与者进行了不同的步行测试,并收集了生理反应(即心率、呼吸频率)。

我想在 Stata 中使用 3 个标准差规则检测异常值。 通常使用的是30秒的移动窗口。对于时间 t 的数据点,计算 t-15 到 t+15 的值的平均值和标准偏差。如果时间 t 的值高于平均值 + 3 SD 或低于平均值 - 3 SD,则认为是异常值。

命令是什么?另外,我该如何处理异常值,我该如何处理它们?

我试过这个命令:

egen stdvar = std(var)

statistics time-series stata standard-deviation
2个回答
1
投票

summarize
命令可以得到均值和标准差,然后你可以用它来定义异常值。听起来您想重新计算每个时间点的均值和标准差;这可以通过循环来完成。这是一个 Stata 内置数据集的示例,因此您可以重现它:

sysuse sp500.dta
gen t=_n
gen outlier=0
*Getting averages and standard deviations for each block of 10 observations:
forv i=10(10)240 {
*Replace volume with the variable you are using
summarize volume if `i'>=t & `i'<t+10
gen avg`i' = r(mean)
gen stddev`i' = r(sd)
*Replace 2*stddev... with 3*stddev. In the example dataset, there were no outliers that were more than 3 standard deviations from the mean
replace outlier=1 if volume>avg`i'+2*stddev`i' & `i'>=t & `i'<t+10
replace outlier=1 if volume<avg`i'-2*stddev`i' & `i'>=t & `i'<t+10
}

0
投票

感谢@matthewSwilson 的有用回答,这更接近您的要求。我使用了 2 SD 而不是 3 SD,因为否则这个沙盒数据集没有识别出异常值。 (显然,我们不能使用您的数据。)

sysuse sp500.dta, clear 

gen t = _n

* ssc install rangestat 
rangestat (mean) mean=volume (sd) sd=volume, int(t -5 5)

gen outlier = (volume > mean + 2*sd) | (volume < mean - 2*sd) 

line volume t || scatter volume t if outlier, legend(order(2 "outliers?") ring(0) pos(1)) 

这个规则是否好(如果你需要一个规则,我会建议一些基于中位数和 IQR 的东西)以及你应该如何处理异常值是更广泛的问题,更适合交叉验证。

© www.soinside.com 2019 - 2024. All rights reserved.