示例数据在这里:
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-在他的回答中指出。
答案 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