列出两个Arima模型时,R中的可疑数据结构发生更改

时间:2019-05-18 22:20:45

标签: r list data-structures data.table

示例数据在这里:

err <- ts(c(0.6100, 1.3500, 1.0300, 0.9600, 1.1100, 0.8350 , 0.8800 , 1.0600 , 1.3800 , 1.6200,  1.5800 , 1.2800 , 1.3000 , 1.4300 , 2.1500 , 1.9100 , 1.8300 , 1.9500  ,1.9999, 1.8500 , 1.5500 , 1.9800  ,1.7044  ,1.8593 , 1.9900 , 2.0400, 1.8950,  2.0100 , 1.6900 , 2.1800 ,2.2150,  2.1293 , 2.1000 , 2.1200 , 2.0500 , 1.9000,  1.8350, 1.9000 ,1.9500 , 1.7800 , 1.5950,  1.8500 , 1.8400,  1.5800, 1.6100 , 1.7200 , 1.8500 , 1.6700,  1.8050,  1.9400,  1.5000 , 1.3100 , 1.4864,  1.2400 , 0.9300 , 1.1400, -0.6100, -0.4300 ,-0.4700 ,-0.3450), frequency = 7, start = c(23, 1), end = c(31, 4))

我将创建两个arima模型并列出一个列表  以及两个模型的数据表:

m1 <- arima(x = err, order=c(0,0,5), include.mean=F)
m2 <- arima(x = err, order=c(0,1,1), include.mean=F)
m.list <- list(m1, m2)
m.comb <- c(m1, m2)
m.dt <- data.table(a=m1, b=m2)

现在m.list[1]m.list$coef给出了第一个模型的系数;而且这对我来说没有意义,我希望m.list[1]能给我完整的第一个模型,而m.list$coef甚至不应该存在。当然,我假设R至少表现出与其他语言(如python或C ++)相似的一点点,更不用说其他语言了。我可能是错的。

m.dt似乎完全失去了结构,变得有些奇怪:

m.a <- m.dt[, "a"]
m.a
# output
                                                                                                                                                                                                                                                                                 a
 1:                                                                                                                                                                                                                                                                                             1.105733,1.221225,1.215059,0.939646,0.570557
 2:                                                                                                                                                                                                                                                                                                                                  0.18465
 3:  0.019905835, 0.012235097,-0.002690923,-0.018219027,-0.018363215, 0.012235097, 0.020627900, 0.007399694,-0.003498485, 0.001069299,-0.002690923, 0.007399694, 0.027766607, 0.042303357, 0.033649641,-0.018219027,-0.003498485, 0.042303357, 0.097345388, 0.071969149,-0.018363215, 0.001069299, 0.033649641, 0.071969149, 0.068308454,...
 4:                                                                                                                                                                                                                                                                                                                 TRUE,TRUE,TRUE,TRUE,TRUE
 5:                                                                                                                                                                                                                                                                                                                                -36.47995
 6:                                                                                                                                                                                                                                                                                                                                 82.95989
 7:                                                                                                                                                                                                                                                                                                                          0,5,0,0,7,0,...
 8:                                                                                                                                                                                                                                                         0.241144876, 0.672481832,-0.319954235, 0.066421765, 0.378785306, 0.003550614,...
 9:                                                                                                                                                                                                                                                                                                                                   <call>
10:                                                                                                                                                                                                                                                                                                                                        x
11:                                                                                                                                                                                                                                                                                                                                        0
12:                                                                                                                                                                                                                                                                                                                                        0
13:                                                                                                                                                                                                                                                                                                                                       60

14:                                                                                                                                                                                                                                                                                                                                   <list>

上面从字面上看只是一个摘要,如果我们打算访问m.dt[, "a"][14],它实际上只是打印“列表”而没有其他内容。

如何列出保留其原始结构的两个模型? (对于任何编程语言来说,这似乎都是实现数据一致性的非常基本的实现)

编辑

我想说m.comb[1]m.comb$coef仅产生系数,我标记了m.list,这是一个错误,@ 42-在他的回答中指出。

2 个答案:

答案 0 :(得分:1)

与其直接创建一列,不如将其包装在list环境中以维护models

的结构
m.dt <- data.table(a=list(m1), b=list(m2))
m.dt
#        a       b
#1: <Arima> <Arima>

也可以从“ m.list”中创建

m.dt <- as.data.table(lapply(setNames(m.list, c('a', 'b')), list))

现在,我们将模型提取为

m.dt$a[[1]]

提取系数

coef(m.dt$a[[1]])

答案 1 :(得分:1)

您说m.list [1]只是给您系数。这并不是一个正确的理解。 R解释器的REPL正在显示在第一个模型上完成的print.arima的结果。

> m.list[1]
    [[1]]

    Call:
    arima(x = err, order = c(0, 0, 5), include.mean = F)

    Coefficients:
             ma1     ma2     ma3     ma4     ma5
          1.1057  1.2212  1.2151  0.9396  0.5706
    s.e.  0.1411  0.1436  0.1666  0.3120  0.2614

    sigma^2 estimated as 0.1846:  log likelihood = -36.48,  aic = 84.96

如果将m.list[1]的结果分配给另一个名称,您会发现它是一个列表,其第一个元素与m1相同。

> m3 <- m.list[1]
> identical( m3[[1]], m1)
[1] TRUE