我正在寻找最好的方法来测试在已知时间发生的干预对时间序列数据的影响的重要性。
以玩具数据集为例,我提出了两种方法。
数据
y <- c(rnorm(10, 10, 0.12), 9.6, 9.4, 9.3, 9.2, 9.15)
x <- seq(1:15)
df <- data.frame(y = y, x = x)
ggplot(df, aes(x,y)) + geom_point() +
geom_vline(xintercept = 10.5) +
scale_x_continuous(breaks=df$x)
1. 分段回归
将两个线性回归模型拟合到干预前后的数据子集。
df1 <- subset(df, x <= 10)
m1 <- lm(y ~ x, data = df1)
summary(m1) #Obviously non-significant
df2 <- subset(df, x > 10)
m2 <- lm(y ~ x, data = df2)
summary(m2) #Obviously significant
使用公式来比较这个答案的斜率。
b1 <- coef(summary(m1))[2, 1]
b2 <- coef(summary(m2))[2, 1]
SEb1 <- coef(summary(m1))[2, 2]
SEb2 <- coef(summary(m2))[2, 2]
Z <- (b1-b2)/sqrt(SEb1^2+SEb2^2)
并计算相应的P值。
2*pnorm(-abs(Z))
[1] 1.395998e-08
(顺便问一下,有没有更优雅的功能可以做到以上几点?)
该 P 值非常显着,是要报告干预效果的值。
结果通过绘制前后两条回归线以图形方式显示。(由于lm表明 处的关系斜率与x=1:100 没有显着差异,因此线位于 处y=mean(1:10))
ggplot(df, aes(x,y)) + geom_point() +
geom_vline(xintercept = 10.5) +
scale_x_continuous(breaks=df$x) +
stat_smooth(method="lm", data=df2, se=F, colour="royalblue1", size = 0.75) +
geom_segment(x = 1, xend = 10, y = mean(df1$y), yend = mean(df1$y),colour="royalblue1", size=0.75)
2. 使用 ARIMA 进行动态回归
拟合两个 ARIMA 模型,一个没有,一个带有回归量,用于编码干预。
library(forecast)
y <- ts(y)
intervention <- c(rep(0,10), rep(1,5))
a1 <- auto.arima(y)
summary(a1)
总结表明auto.arima选择 ARIMA(0,1,0) 作为最佳模型。因此,使用该函数将 ARIMA(0,1,0) 与回归量拟合Arima。
a2 <- Arima(y, order=c(0,1,0), xreg=intervention)
然后使用 LRT 检验比较两个模型,以获得与干预效果相关的 P 值。
library(lmtest)
lrtest(a1, a2)
显然,P 值非常显着。
动态回归的一个优点是它可以用来获得预测。
intf <- c(rep(1,5))
autoplot(forecast(a2, h=5, xreg=intf))
问题
- 这两种方法是否充分且充分执行?
- 还有其他方法吗?
- 哪种方法是首选?


