ARIMA 的 R 和 Stata 之间的主要差异

Posted

技术标签:

【中文标题】ARIMA 的 R 和 Stata 之间的主要差异【英文标题】:Major discrepancies between R and Stata for ARIMA 【发布时间】:2014-04-22 00:15:22 【问题描述】:

使用历史 Lynx Pelt 数据 (https://www.dropbox.com/s/v0h9oywa4pdjblu/Lynxpelt.csv),这里有两个 AIC 值表,来自 R 和 Stata,用于 ARIMA(p,q) 模型,0

AIC calculations from R for ARIMA(p,q)
          q0        q1       q2       q3       q4
p0 145.25613 100.20123 87.45927 77.57073 85.86376
p1 101.54847  84.91691 82.11806 77.15318 74.26392
p2  63.41165  49.42414 44.14899 40.96787 44.33848
p3  52.26069  49.19660 52.00560 43.50156 45.17175
p4  46.19617  48.19530 49.50422 42.43198 45.71375

R 参数估计:http://pastie.org/8942238

    AIC ( Stata )   FOR   LOG   MODELS  
    q               
p   0   1   2   3   4
0               100.2012    87.45929    77.57074    83.86378
1   101.5485    84.91692    82.11809    86.44413    74.26394
2   63.41167    49.42417    44.14902    40.96633    40.76029
3   52.26072    49.19663    52.00562    40.37268    42.20399
4   46.19619    48.19532    40.39699    43.12795    na

Stata 参数估计:http://pastie.org/8942232

以下是在R中创建AIC表的代码。注意我强制使用最大似然,不转换参数,并增加了最大迭代次数。

pelts <- read.csv("Lynxpelt.csv")
pelts$log <- log(pelts$W7)
models <- array(list(),5)
aic <- data.frame(q0=rep(NA,5), q1=rep(NA,5), q2=rep(NA,5), q3=rep(NA,5), q4=rep(NA,5), row.names=c("p0", "p1", "p2", "p3", "p4"))

makeModel <- function(p,q) 
    arima(pelts$log, order=c(p,0,q), transform.pars=FALSE, method="ML", optim.control=list(maxit=1000))


options(warn=1)

for (p in 0:4) 
    for (q in 0:4) 
        model <- makeModel(p,q)
        models[[p+1]][[q+1]] <- model
        aic[p+1,q+1] <- model$aic
        print(cat("p=",p,", q=",q))
    


aic

这是Stata的代码:

insheet using Lynxpelt.csv
save Lynxpelt, replace

tsset year
tsline w7

gen logw7=log(w7)
label var logw7 "logarithm of w7"

mat A=J(5,5,0) /*This matrix is a 5*5 matrix with 0s*/
mat list A /*show the matrix A*/

forvalues i=0/4 
forvalues j=0/4 
set more off
quietly arima logw7, arima(`i',0,`j')
estat ic
matrix list r(S)
matrix s=r(S)
scalar alpha=s[1,5]
mat A[`i'+1,`j'+1]=alpha




* ARMA(4,4) cannot be done since stata cannot choose an initial value - we give one manually *
* I will use the estimates from ARMA(3,4) *
* Let's run ARMA(3,4) again *
quietly arima logw7, ar(1/3) ma(1/4)
matrix list e(b)
mat B=e(b)

*Now, let's run ARMA(4,4) with initial values from ARMA(3,4) *
quietly arima logw7, ar(1/4) ma(1/4) from(B)
estat ic
matrix s=r(S)
scalar alpha=s[1,5]
mat A[5,5]=alpha

编辑:添加到参数估计的链接并在 R 代码中添加行以修复“未找到模型”错误

编辑 2:根据 iacobus 的建议,手动强制 Stata 使用 BFGS 作为优化方法。 (4,3) & (3,3) 有了很大的改进。其他值仍然存在很大差异。 (3,2) 的例子曾经匹配和现在非常不同。

STATA results with technique(bfgs):
           c1         c2         c3         c4         c5
r1  145.25614  100.20123   87.45929  77.570744  85.863777
r2  101.54848  84.916921   82.11809  86.444131  74.263937
r3  63.411671  49.424167  44.149023  40.966325  42.760294
r4  52.260723  49.196628  40.442078  43.498413  43.622292
r5  46.196192  48.195322  42.396986  42.289595          0

R results from above for easy comparison:

AIC calculations from R for ARIMA(p,q)
          q0        q1       q2       q3       q4
p0 145.25613 100.20123 87.45927 77.57073 85.86376
p1 101.54847  84.91691 82.11806 77.15318 74.26392
p2  63.41165  49.42414 44.14899 40.96787 44.33848
p3  52.26069  49.19660 52.00560 43.50156 45.17175
p4  46.19617  48.19530 49.50422 42.43198 45.71375

【问题讨论】:

我不使用Stata,但也许从R中提取每个模型的对数似然和每个模型的参数数量并自己计算AIC。然后检查您的 AIC 值是否与 R 报告的值匹配。这可能是第一步。 感谢马克的建议。 AIC 计算正确。确实,R 和 Stata 之间的参数估计不同,因此导致 AIC 不同。我将 AIC 用于表格,因为它更容易一目了然地注意到某些 p,q 的回归结果中的巨大差异 @tbenst 您介意添加参数估计比较吗?我目前无法访问 Stata。 请使示例可重现。我在尝试复制时收到Error in models[[p + 1]][[q + 1]] &lt;- model (from #4) : object 'models' not found @user12202013:添加了参数估计的链接。在每个链接中使用特定的 aic 执行 control-f 以查看比较。 【参考方案1】:

我认为您的数据会产生数值不稳定的似然函数,尤其是对于高阶模型。 R(至少对我而言)在某些高阶模型上向我发出警告,并且您在使用 Stata 使用不受限制的 MLE 来拟合它们时遇到问题,这一事实表明可能存在一些数值问题。 SAS 还警告我左右收敛。

如果可能性存在数值问题,这可能会影响优化步骤。默认情况下,Stata 似乎使用 Berndt-Hall-Hall-Hausman 算法使用 5 步,然后使用 BFGS 算法使用 10 步,根据需要重复组合直到收敛。另一方面,R 默认使用 BFGS。您可以使用 optim.method 参数更改它,但 R 并不像 Stata 那样轻松支持使用 BHHH 或在 BHHH 和 BFGS 之间移动。

在 R 中使用各种不同的优化器处理您的数据表明,通过在优化器之间进行更改,产生的 AIC 会发生相当大的变化。我怀疑这是导致 Stata 和 R 的估计值不同的原因。

我建议去 Stata 并设置最大化选项 BFGS(有关如何执行此操作的详细信息,请参阅http://www.stata.com/help.cgi?arima#maximize_options)。如果 Stata 的估计在做出改变后与 R 的估计一致,我不会感到惊讶。

【讨论】:

这非常有用。最好(1)可视化似然面和(2)找出哪个答案实际上最接近正确 - 即BFGS或BHHH(或其他东西)是否给出最佳答案? [在同一平台/包中比较可能性/AIC 值很容易,但比较起来可能会很棘手......] 通过arma 调试并提取@987654324 可能会更深入地解决这个问题@函数进一步探索... 有见地,谢谢。编辑 2 中的新结果。 (4,3) 和 (3,3) 得到了很大改进。其他值仍然存在很大差异。 (3,2) 例如曾经匹配和现在非常不同。 当您更改方法时,某些估计值收敛,这表明优化存在数值问题。有些价值观仍然不一致,这很有趣。我怀疑这仍然是由于该数据的似然函数的数值不稳定性。如果函数是平坦的或数值不稳定,则结果可能很大程度上取决于起始值和其他参数。我对 STATA 的了解还不够,无法了解它们与 R 的默认值相比如何,但我敢打赌这是问题所在。

以上是关于ARIMA 的 R 和 Stata 之间的主要差异的主要内容,如果未能解决你的问题,请参考以下文章

R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据

stata如何调用R软件有没有办法用stata调

时间序列分析之预测中国GDP走势(STATA版)

组间差异检验,终于有人讲清楚了!

基础方法 | 数据管理:Stata与R语言的应用

R中magrittr和arima的兼容性问题