如何有条件地 select 时间序列
How to select time series conditionally
假设我有一个时间序列对象,B_ts。有些系列可能需要差分才能使它们平稳,而其他系列可能不需要。我想对所有系列执行增强的 Dickey-Fuller 测试,并将 diff(x) 仅应用于那些产生测试统计数据的系列,其 p 值从 D-F 测试 > 0.05。 p 值已经 < 0.05 的系列我希望保留 "untouched".
有没有办法在 R 中做到这一点?
到目前为止,我有以下时间序列对象代码,B_ts:
B_ts <- ts(B)
tseries::adf.test(B_ts)
f1 = function(x){return(diff(x))}
C <- apply(B_ts,1, f1) #but only to rows that require differencing!
tseries::adf.test(C) #to see whether p value for all time series is now < 0.05 after differencing
非常感谢!
这是使用 lapply
进行一次的方法,请注意,第二个系列的最终 p 值为 0.065,因此根据您遇到的问题和您的数据,您可能希望滞后超过一次。
# To choose example ts data
# data()
tseries <- list("t1" = AirPassengers, "t2" = BJsales) ;
# apply your test to the list of series
adf <- lapply(tseries, function(x) tseries::adf.test(x)$p.value)
# index only series that need diff
diff_index <- which(adf > 0.05)
tseries_diff <- tseries ;
tseries_diff[diff_index] <- lapply(tseries_diff[diff_index], diff) ;
# verify
adf <- lapply(tseries_diff, function(x) tseries::adf.test(x)$p.value)
adf
# choose if you want to iterate again / or if your want to find a smarter lag
假设我有一个时间序列对象,B_ts。有些系列可能需要差分才能使它们平稳,而其他系列可能不需要。我想对所有系列执行增强的 Dickey-Fuller 测试,并将 diff(x) 仅应用于那些产生测试统计数据的系列,其 p 值从 D-F 测试 > 0.05。 p 值已经 < 0.05 的系列我希望保留 "untouched".
有没有办法在 R 中做到这一点?
到目前为止,我有以下时间序列对象代码,B_ts:
B_ts <- ts(B)
tseries::adf.test(B_ts)
f1 = function(x){return(diff(x))}
C <- apply(B_ts,1, f1) #but only to rows that require differencing!
tseries::adf.test(C) #to see whether p value for all time series is now < 0.05 after differencing
非常感谢!
这是使用 lapply
进行一次的方法,请注意,第二个系列的最终 p 值为 0.065,因此根据您遇到的问题和您的数据,您可能希望滞后超过一次。
# To choose example ts data
# data()
tseries <- list("t1" = AirPassengers, "t2" = BJsales) ;
# apply your test to the list of series
adf <- lapply(tseries, function(x) tseries::adf.test(x)$p.value)
# index only series that need diff
diff_index <- which(adf > 0.05)
tseries_diff <- tseries ;
tseries_diff[diff_index] <- lapply(tseries_diff[diff_index], diff) ;
# verify
adf <- lapply(tseries_diff, function(x) tseries::adf.test(x)$p.value)
adf
# choose if you want to iterate again / or if your want to find a smarter lag