alguien que me pueda ayudar a interpretar y modificar este código?
Tengo un conjunto de datos y quieres reservar los últimos 100 retornos para el análisis de la muestra. Después de especificar y ajustar el garch-spd-cópula, en el bucle para solucionar una condición para $i=1$ y otro por $i=2,...,100$, y calcular estos primeros cálculos (presigma, preR, preQ, ...). Ahora, quiero R para hacer el 1 paso delante de previsión simulado 1000 veces (n.sim=1 y m.sim=1000 en cgarchsim
comando), mientras que de forma incremental en cuenta la "extendida" del conjunto de datos (considerar T para la previsión de T+1, considere la posibilidad de T+1, para la previsión de T+2, ...). Me gustaría que el resultado final sea un 100x3x1000 array (100: observaciones, 3: activos, 1000 simulaciones) de 1-paso por delante de las previsiones.
install.packages("rmgarch")
library(rmgarch)
data(dji30retw)
Dat = dji30retw[, 1:3, drop = FALSE]
uspec17 = ugarchspec(mean.model = list(armaOrder = c(0,0)),
variance.model = list(garchOrder = c(1,1), model = "sGARCH", variance.targeting=FALSE),
distribution.model = "norm")
spec17 = cgarchspec(uspec = multispec( replicate(3, uspec17) ), asymmetric = FALSE,
distribution.model = list(copula = "mvnorm", method = "Kendall",
time.varying = TRUE, transformation = "spd"))
fit17 <- cgarchfit(spec17, Dat, out.sample=100, spd.control=list(upper=0.95, lower=0.05, type="mle", kernel="normal"),
cluster=NULL, fit.control=list(eval.se=FALSE))
T = dim(Dat)[1]-100
simMu = simS = filtMu = filtS = matrix(NA, ncol = 3, nrow = 100)
simCor = simC = filtC = filtCor = array(NA, dim = c(3,3,100))
colSd = function(x) apply(x, 2, "sd")
specx17 = spec17
for(i in 1:3) specx17@umodel$fixed.pars[[i]] = as.list(fit17@model$mpars[fit17@model$midx[,i]==1,i])
setfixed(specx17)<-as.list(fit17@model$mpars[fit17@model$midx[,4]==1,4])
for(i in 1:100){
if(i==1){
presigma = matrix(tail(sigma(fit17), 1), ncol = 3)
prereturns = matrix(unlist(Dat[T, ]), ncol = 3, nrow = 1)
preresiduals = matrix(tail(residuals(fit17),1), ncol = 3, nrow = 1)
preR = last(rcor(fit17))[,,1]
diag(preR) = 1
preQ = fit17@mfit$Qt[[length(fit17@mfit$Qt)]]
preZ = tail(fit17@mfit$Z, 1)
tmp = cgarchfilter(specx17, Dat[1:(T+1), ], filter.control = list(n.old = T))
filtMu[i,] = tail(fitted(tmp), 1)
filtS[i,] = tail(sigma(tmp), 1)
filtC[,,i] = last(rcov(tmp))[,,1]
filtCor[,,i] = last(rcor(tmp))[,,1]
}
else{
presigma = matrix(tail(sigma(tmp), 1), ncol = 3)
prereturns = matrix(unlist(Dat[(T+i-1), ]), ncol = 3, nrow = 1)
preresiduals = matrix(tail(residuals(tmp),1), ncol = 3, nrow = 1)
preR = last(rcor(tmp))[,,1]
diag(preR) = 1
preQ = tmp@mfilter$Qt[[length(tmp@mfilter$Qt)]]
preZ = tail(tmp@mfilter$Z, 1)
tmp = cgarchfilter(specx17, Dat[1:(T+i-1), ], filter.control = list(n.old = T))
filtMu[i,] = tail(fitted(tmp), 1)
filtS[i,] = tail(sigma(tmp), 1)
filtC[,,i] = last(rcov(tmp))[,,1]
filtCor[,,i] = last(rcor(tmp))[,,1]
}
sim17 = cgarchsim(fit17, n.sim = 1, m.sim = 1000, startMethod = "sample", preR = preR, preQ = preQ, preZ = preZ,
prereturns = prereturns, presigma = presigma, preresiduals = preresiduals, cluster = NULL)
simx = t(sapply(sim17@msim$simX, FUN = function(x) x[1,]))
simMu[i,] = colMeans(simx)
simC[,,i] = sim17@msim$simH[[1]][,,1]
simCor[,,i] = sim17@msim$simR[[1]][,,1]
simS[i,] = sqrt(diag(simC[,,i]))
}
Sin embargo, si ejecuto esta, como condicional de rendimientos (sim17@msim$simX
) puedo obtener tres 1 paso delante previsiones simulado 1000 veces, no hay rastro de el resto de los 99 valores que ser estimado. Alguna idea de por qué, y cómo modificar el código para tener 100 estimaciones?