ARIMA 的对数或平方根转换

机器算法验证 r 预测 有马
2022-03-24 20:02:28

使用下面的数据集,我有一个需要转换的系列。很容易。但是,您如何确定 SQRT 或 LOG 转换哪个更好?你如何得出这个结论?

x<-c(75800,54700,85000,74600,103900,82000,77000,103600,62900,60700,58800,134800,81200,47700,76200,81900,95400,85400,84400,103400,63000,65500,59200,128000,74400,57100,75600,88300,111100,95000,91500,111400,73700,72800,64900,146300,83100,66200,101700,100100,120100,100200,97000,120600,88400,83500,73200,141800,87700,82700,106000,103900,121000,98800,96900,115400,87500,86500,81800,135300,88900,77100,109000,104000,113000,99000,104500,109400,92900,88700,90500,140200,91700,78800,114700,100700,113300,122800,117900,122200,102900,85300,92800,143800,88400,75400,111200,96300,114600,108300,113400,116600,103400,87300,88200,149800,90100,78800,108900,126300,122000,125100,119600,148800,114600,101600,108800,174100,101100,89900,126800,126400,141400,144700,132800,149000,124200,101500,106100,168100,104200,79900,126100,121600,139500,143100,144100,154500,129500,109800,116200,171100,106700,85500,132500,133700,135600,149400,157700,144500,165400,122700,113700,175000,113200,94400,138600,132400,129200,165700,153300,141900,170300,127800,124100,206700,131700,112700,170900,153000,146700,197800,173800,165400,201700,147000,144200,244900,146700,124400,168600,193400,167900,209800,198400,184300,214300,156200,154900,251200,127900,125100,171500,167000,163900,200900,188900,168000,203100,169800,171900,241300,141400,140600,172200,192900,178700,204600,222900,179900,229900,173100,174600,265400,147600,140800,171900,189900,185100,218400,207100,178800,228800,176900,170300,251500,149900,150300,192000,185100,184500,228800,219000,180000,241500,184300,174600,264500,166100,151900,194600,214600,201700,229400,233600,197500,254600,194000,201100,279500,175800,167200,235900,207400,215900,261800,236800,222400,281500,214100,218200,295000,194400,180200,250400,212700,251300,280200,249300,240000,304200,236900,232500,300700,207300,196900,246600,262500,272800,282300,271100,265600,313500,268000,256500,318100,232700,198500,268900,244300,262400,289200,286600,281100,330700,262000,244300,309300,246900,211800,263100,307700,284900,303800,296900,290400,356200,283700,274500,378300,263100,226900,283800,299900,296000,327600,313500,291700,333000,246500,227400,333200,239500,218600,283500,267900,294500,318600,318700,283400,351600,268400,251100,365100,249100,216400,245500,232100,236300,275600,296500,296900,354300,277900,287200,420200,299700,268200,329700,353600,356200,396500,379500,349100,437900,350600,338600,509100,342300,288800,378400,371200,395800,450000,414100,387600,486600,355300,358800,526800,346300,295600,361500,415300,402900,484100,412700,395800,491300,391000,374900,569200,369500,314900,422500,436400,439700,509200,461700,449500,560600,435000,429900,633400,417900,365700,459200,466500,488500,531500,483500,485400,575700,458000,433500,642600,409600,363100,430100,503900,500400,557400,565500,526700,628900,547700,520400,731200,494400,416800,558700,537100,556200,686700,616600,582600,725800,577700,552100,806700,554200,455000,532600,693000,619400,727100,684700)
y<-ts(x,frequency=12, start=c(1976,1))
#Transforming the data to log or sqrt and plotting it
log.y<-log(y)
plot(log.y)
sqrt.y<-sqrt(y)
plot(sqrt.y)
3个回答

这个问题通过扩展与水平图得到了很好的回答:立方根变换将稳定数据的扩展,为进一步的探索和分析提供有用的基础。


数据显示出明显的季节性:

plot(y)

数据

通过将数据分成年度(或可能是两年一次)组来利用这一点。在每个组中计算其典型值及其分布的抗性描述符。好的选择基于 5 个字母的摘要,包括中位数(将数据分成上下两部分)、两半的中位数(“铰链”或“第四部分”)和极值。因为极值对异常值没有抵抗力,所以使用铰链的差异来表示散布。(这个“第四次传播”是一个正确构建的盒须图中的盒子的长度。)

spread <- function(x) {
  n <- length(x)
  n.med <- (n + 1)/2
  n.fourth <- (floor(n.med) + 1)/2
  y <- sort(x)[c(floor(n.fourth), ceiling(n.fourth), 
               floor(n+1 - n.fourth), ceiling(n+1 - n.fourth))]
  return( y %*% c(-1,-1,1,1)/2 )
}
years <- floor((1:length(x) - 1) / 12)
z <- split(x, years)
boxplot(z, names=(min(years):max(years))+1976, ylab="y")

原始箱线图

随着数据水平的提高,箱线图显然会随着时间的推移而变长。这种异方差性使分析和解释变得复杂。通常,幂变换可以完全减少或消除异方差性。

散布与水平图显示幂变换(包括对数)是否有助于稳定组内散布并建议适当的幂值:它与散布与水平的斜率直接相关在对数刻度上绘制。

z.med <- unlist(lapply(z, median))
z.spread <- unlist(lapply(z, spread))
fit <- lm(log(z.spread) ~ log(z.med))
plot(log(z.med), log(z.spread), xlab="Log Level", ylab="Log Spread", 
     main="Spread vs. Level Plot")
abline(fit, lwd=2, col="Red")

价差与水平图

该图显示出良好的线性并且没有大的异常值,证明了整个时间段内价差和水平之间的相当规律的关系。

当拟合斜率为p, 使用的权力是λ=1p. 在应用建议的功率变换后,无论水平如何(因此无论年份如何),价差都是(大约)恒定的:

lambda <- 1 - coef(fit)[2]
boxplot(lapply(z, function(u) u^lambda), names=(min(years):max(years))+1976, 
        ylab=paste("y^", round(lambda, 2), sep=""),
        main="Boxplots of Re-expressed Values")

重新表达值的箱线图

plot(y^lambda, main= "Re-expressed Values", ylab=paste("y^", round(lambda, 2), sep=""))

重新表达值的图

通常,作为小整数倒数的幂具有有用或自然的解释。这里,λ=0.32如此接近1/3它也可能是立方根。在实践中,人们可能会选择使用立方根,或者将其四舍五入到更简单的分数1/2并取平方根,或者有时一直到对数(对应于λ=0)。


结论

在这个例子中,传播与水平图(由于其近似线性和没有异常值)表明,幂变换将有效地稳定数据的传播,并自动建议使用的幂。尽管可以使用各种方法计算功效,但没有一种标准方法能够提供传播与水平图所提供的洞察力或诊断能力。这应该在每个数据分析师的工具包中。


参考

Tukey, John W. 探索性数据分析。 艾迪生-卫斯理,1977 年。

Hoaglin、David C.、Frederick Mosteller 和 John W. Tukey,了解稳健和探索性数据分析。 约翰威利父子,1983 年。

变身就像毒品!有些对你有好处,有些则不是!应刻意避免随意选择转换。

a) 进行必要的有效统计检验的要求之一是,来自提议模型的误差方差不能被证明是非恒定的。如果误差的方差在离散的时间点发生变化,则可以求助于广义最小二乘法或 GLM。

b) 如果误差的方差与观测序列的水平线性相关,那么对数变换可能是合适的。如果误差方差的平方根与原始序列的水平线性相关,则平方根变换是合适的。更一般地,通过找到最佳 lambda 的 Box-Cox 检验找到适当的功率变换。请注意,Box-Cox 检验是普遍适用的,并不只需要时间序列或 spatail 数据。

所有上述( a 和 b )都要求不能证明所有点的误差均值与零有显着差异。如果您的数据本质上不是时间序列或空间数据,那么您可以检测到的唯一异常是脉冲。但是,如果您的数据是时间序列或空间数据,则可能建议使用 Level Shifts 、Seasonal Pulses 和/或 Local Time Trends 以使误差项的平均值在任何地方都为 0.0 或至少与 0.0 没有显着差异。

在我看来,除非为了满足(部分)高斯假设,否则永远不应该随意转换数据。一些计量经济学家出于简单且完全错误的原因记录日志,以便获得弹性的直接估计值,而不是评估最佳模型中 x 变化百分比的 Y 变化百分比。

现在有一个警告,如果一个人从理论中知道,或者至少有人认为一个人从理论中知道转换是必要的,即由先前有充分记录的研究证明,那么一定要遵循该范式,因为它可能被证明比经验主义更有益我在这里列出的程序。

最后使用原始数据,通过无意识的转换最小化结果的任何扭曲,测试所有假设并在晚上睡个好觉。像医生这样的统计学家永远不应该伤害他们的数据/患者 y 提供具有令人讨厌和无根据的副作用的药物/转化。

希望这可以帮助 。

使用时间序列技术对时间序列数据进行数据分析:

一个情节在此处输入图像描述暗示了一个具有结构变化的系列。Chow 测试产生了一个重要的突破点在此处输入图像描述在此处输入图像描述. 对从 1999/5 开始的 modt 最近 147 个值的分析产生了带有以下 ACF在此处输入图像描述 的残差图预测图为最终模型的所有参数都具有统计显着性,并且没有无根据的功率转换,不幸的是,这通常会导致疯狂的爆炸性和不切实际的预测。如果通过 Box-Cox 测试证明 ERRORS 的可变性与此处详述的预期值相关,则功率变换是合理的。注意,不是使用原始序列的可变性,而是模型误差的可变性。在此处输入图像描述在此处输入图像描述在此处输入图像描述在此处输入图像描述

在此处输入图像描述

@digdeep,像往常一样,@whuber 从统计的角度提供了出色而全面的答案。我没有接受过统计学方面的培训,所以对此回应持保留态度。我在我的真实世界练习数据中使用了下面的响应,所以我希望这会有所帮助。

我将尝试为 Arima 建模提供时间序列数据转换的非统计学家观点。没有直接的答案。由于您有兴趣知道要使用哪种转换,因此回顾一下我们为什么进行转换可能会有所帮助。我们进行转换有 3 个主要原因,可能还有很多其他原因:

  1. 转换使数据的线性结构更适用于
    ARIMA 建模。
  2. 如果数据的方差在增加或变化,那么数据的转换可能有助于稳定数据的方差。
  3. 转换也使 ARIMA 模型中的误差/残差呈正态分布,这是 Box-Jenkins 提出的 ARIMA 建模的要求。

有几种数据转换,包括 Box-Cox、Log、平方根、四次和逆以及@irishstat 提到的其他转换。与所有统计方法一样,对于为特定数据集选择哪种转换,没有很好的指导/答案。

正如著名的统计学家 GEP Box 所说“所有模型都是错误的,但有些是有用的”,这也适用于转换,“所有的转换都是错误的,但有些是有用的”。

选择转换的最佳方法是进行实验。由于您的时间序列很长,我会坚持过去 12 到 24 个月,并使用所有转换构建模型,看看特定转换是否有助于准确预测您的样本外数据。还要检查模型的正态假设残差。希望这将指导您选择适当的转换。您可能还想将其与未转换的数据进行比较,看看转换是否有助于您的模型。

@whuber 对您的数据的出色图形表示促使我使用分解方法以图形方式探索这些数据。我可能会补充一点,R 有一个出色的分解方法,称为 STL,它有助于识别您通常不会注意到的模式。对于这样的数据集,STL 分解不仅有助于选择合适的方法来分析数据,还可能有助于识别异常值/水平偏移/季节性变化等异常,见下文。请注意,数据的剩余(不规则)分量看起来存在随机季节性并且变化不是随机的,似乎存在模式。另请参阅@whuber 引用的 2004/2005 年之后趋势成分水平的变化。

希望这会有所帮助。

g <- stl(y,s.window = "periodic")
plot(g)

在此处输入图像描述