将 R 输出保存为对象

Save R output as an object

假设,我已将我的数据拟合到多变量 DCC 模型并进行预测以获得均值 returns。以下是我的可重现代码。

# load libraries
library(rugarch)
library(rmgarch)
library(FinTS)
library(tseries)
library(fPortfolio)
data(dji30retw)

for (i in 1:2)
{ Dat.Initial = dji30retw[, 1:8, drop = FALSE]
  Dat <- Dat.Initial[1:(1000+(i-1)), ] 

#Fitting the data
uspec = ugarchspec(mean.model = list(armaOrder = c(0,0)), variance.model = list(garchOrder = c(1,1), model = "sGARCH"), distribution.model = "norm")
spec1 = dccspec(uspec = multispec( replicate(8, uspec)), dccOrder = c(1,1), distribution = "mvnorm")
fit1 <- list()
fit1[[i]] = dccfit(spec1, data = Dat, out.sample = 120, fit.control = list(eval.se=T))

#Out of sample forecasting
dcc.focast <- list()
dcc.focast[[i]]=dccforecast(fit1[[i]], n.ahead = 1, n.roll = 0)
#print(dcc.focast[[i]])

#Mean returns 
mean.focast <- list()
mean.focast[[i]] = fitted(dcc.focast[[i]] )
print(mean.focast[[i]])

#Var-Cov 
covmat.focast[[i]]= rcov(dcc.focast[[i]])
print(covmat.focast[[i]])
}

R 以这种形式给了我输出:-

, , 2004-01-30

             AA         AXP         BA         BAC           C         CAT         CVX          DD
T+1 0.002903173 0.003462776 0.00295735 0.003485212 0.004442807 0.002986181 0.002069151 0.002367464

, , 2004-02-06

         AA         AXP         BA         BAC           C       CAT        CVX          DD
T+1 0.002933206 0.003511235 0.00300817 0.003510005 0.004436862 0.0029913 0.00205337 0.002382313

有没有什么方法可以将输出保存为一个 object/xts 使其看起来像这样?

               AA              AXP         ..........  DD
 30-01-2004    0.002903173   0.003462776   ........... 0.002367464
 06-02-2004    0.002933206   0.003511235   ........... 0.002382313

还有一个问题,为什么如果我只输入 'mean.focast' ,它会给我以下输出?

[[1]]
NULL

[[2]]
, , 2004-02-06

             AA         AXP         BA         BAC           C       CAT        CVX          DD
T+1 0.002933206 0.003511235 0.00300817 0.003510005 0.004436862 0.0029913 0.00205337 0.002382313

[[1]] 的值在哪里?

让我们看看。你的"troubles"来自这部分代码

#Mean returns 
mean.focast <- list()
mean.focast[[i]] = fitted(dcc.focast[[i]] )
print(mean.focast[[i]])

您要求打印每次迭代的输出(这就是您获得输出的原因),但请注意,您在迭代的每个步骤中都重新实例化了列表 mean.focast。这就是第一个列表元素得到 NULL 的原因,因为您创建了一个新列表并且只填充元素 2(对于迭代 2)。 mean.focast <- list() 应该移到循环外。

至于mean.focast的结果。您可以通过多种方式将列表元素组合到一个数据框中。这是一个使用 reshape2.

library(reshape2)
res <- dcast(melt(mean.focast), Var3 ~ Var2)
res
        Var3          AA         AXP         BA         BAC           C
1 2004-01-30 0.002903173 0.003462776 0.00295735 0.003485212 0.004442807
2 2004-02-06 0.002933206 0.003511235 0.00300817 0.003510005 0.004436862
          CAT         CVX          DD
1 0.002986181 0.002069151 0.002367464
2 0.002991300 0.002053370 0.002382313

所以你的最终代码变成了

mean.focast <- list()

for (i in 1:2)
{ Dat.Initial = dji30retw[, 1:8, drop = FALSE]
  Dat <- Dat.Initial[1:(1000+(i-1)), ] 

#Fitting the data
uspec = ugarchspec(mean.model = list(armaOrder = c(0,0)), variance.model = list(garchOrder = c(1,1), model = "sGARCH"), distribution.model = "norm")
spec1 = dccspec(uspec = multispec( replicate(8, uspec)), dccOrder = c(1,1), distribution = "mvnorm")
fit1 <- list()
fit1[[i]] = dccfit(spec1, data = Dat, out.sample = 120, fit.control = list(eval.se=T))

#Out of sample forecasting
dcc.focast <- list()
dcc.focast[[i]]=dccforecast(fit1[[i]], n.ahead = 1, n.roll = 0)
#print(dcc.focast[[i]])

#Mean returns 
mean.focast[[i]] = fitted(dcc.focast[[i]] )
print(mean.focast[[i]])}

res <- dcast(melt(mean.focast), Var3 ~ Var2)
res