如何处理不存在或缺失的数据?


12

我尝试了一种预测方法,并想检查我的方法是否正确。

我的研究正在比较不同种类的共同基金。我想使用GCC指数作为其中一个的基准,但问题是GCC指数于2011年9月停止,我的研究时间是2003年1月至2014年7月。因此,我尝试使用另一个指数MSCI指数,进行线性回归,但问题在于MSCI指数缺少2010年9月以来的数据。

为了解决这个问题,我做了以下工作。这些步骤有效吗?

  1. MSCI指数缺少2010年9月到2012年7月的数据。我通过应用五个观察值的移动平均值来“提供”该数据。这种方法有效吗?如果是这样,我应该使用多少个观测值?

  2. 在估计了缺失的数据之后,我对相互可用期间(从2007年1月到2011年9月)的GCC指数(作为因变量)与MSCI指数(作为自变量)进行了回归,然后针对所有问题对模型进行了校正。对于每个月,我将其余时间段的x替换为MSCI索引中的数据。这有效吗?

以下是逗号分隔值格式的数据,其中包含按行的年和按列的月。也可以通过此链接获得数据 。

系列GCC:

,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
2002,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,117.709
2003,120.176,117.983,120.913,134.036,145.829,143.108,149.712,156.997,162.158,158.526,166.42,180.306
2004,185.367,185.604,200.433,218.923,226.493,230.492,249.953,262.295,275.088,295.005,328.197,336.817
2005,346.721,363.919,423.232,492.508,519.074,605.804,581.975,676.021,692.077,761.837,863.65,844.865
2006,947.402,993.004,909.894,732.646,598.877,686.258,634.835,658.295,672.233,677.234,491.163,488.911
2007,440.237,486.828,456.164,452.141,495.19,473.926,492.782,525.295,519.081,575.744,599.984,668.192
2008,626.203,681.292,616.841,676.242,657.467,654.66,635.478,603.639,527.326,396.904,338.696,308.085
2009,279.706,252.054,272.082,314.367,340.354,325.99,326.46,327.053,354.192,339.035,329.668,318.267
2010,309.847,321.98,345.594,335.045,311.363,299.555,310.802,306.523,315.496,324.153,323.256,334.802
2011,331.133,311.292,323.08,327.105,320.258,312.749,305.073,297.087,298.671,NA,NA,NA

系列MSCI:

,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
2007,NA,NA,NA,NA,1000,958.645,1016.085,1049.468,1033.775,1118.854,1142.347,1298.223
2008,1197.656,1282.557,1164.874,1248.42,1227.061,1221.049,1161.246,1112.582,929.379,680.086,516.511,521.127
2009,487.562,450.331,478.255,560.667,605.143,598.611,609.559,615.73,662.891,655.639,628.404,602.14
2010,601.1,622.624,661.875,644.751,588.526,587.4,615.008,606.133,NA,NA,NA,NA
2011,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA
2012,NA,NA,NA,NA,NA,NA,NA,609.51,598.428,595.622,582.905,599.447
2013,627.561,619.581,636.284,632.099,651.995,651.39,687.194,676.76,694.575,704.806,727.625,739.842
2014,759.036,787.057,817.067,824.313,857.055,805.31,873.619,NA,NA,NA,NA,NA

数据


上段提到的x是什么?
Nick Cox

y是gcc指数的收盘价,x是msci指数的收盘价
TG Zain

您可能对这篇文章感兴趣,该文章显示了有关如何通过在ARIMA时间序列模型的框架中应用的卡尔曼滤波器来填补时间序列中的空白的示例。
javlacalle 2014年

谢谢javlacalle是否可以处理我丢失的数据?这是我丢失数据的文件4shared.com/file/qR0UZgfGba/missing_data.html
TG Zain

我无法下载文件。您可以发布数据,例如按行显示年份,按列显示月份,并用逗号分隔值。
javlacalle 2014年

Answers:


9

我的建议与您的建议类似,除了我将使用时间序列模型而不是移动平均值。ARIMA模型的框架也适用于获取预测,不仅包括MSCI系列作为回归变量,而且还包括GCC系列的滞后时间,后者也可能捕获数据的动态。

首先,您可以为MSCI系列拟合ARIMA模型,然后对本系列中缺失的观测值进行插值。然后,您可以使用MSCI作为外生回归变量来拟合GCC系列的ARIMA模型,并基于此模型获得GCC的预测。在执行此操作时,您必须小心处理以图形方式观察到的断裂,这些断裂可能会扭曲ARIMA模型的选择和拟合。


这是我在中进行此分析的结果R。我使用该函数forecast::auto.arima选择ARIMA模型,并tsoutliers::tso检测可能的电平偏移(LS),临时更改(TC)或加法异常值(AO)。

这些是一旦加载的数据:

gcc <- structure(c(117.709, 120.176, 117.983, 120.913, 134.036, 145.829, 143.108, 149.712, 156.997, 162.158, 158.526, 166.42, 180.306, 185.367, 185.604, 200.433, 218.923, 226.493, 230.492, 249.953, 262.295, 275.088, 295.005, 328.197, 336.817, 346.721, 363.919, 423.232, 492.508, 519.074, 605.804, 581.975, 676.021, 692.077, 761.837, 863.65, 844.865, 947.402, 993.004, 909.894, 732.646, 598.877, 686.258, 634.835, 658.295, 672.233, 677.234, 491.163, 488.911, 440.237, 486.828, 456.164, 452.141, 495.19, 473.926, 
492.782, 525.295, 519.081, 575.744, 599.984, 668.192, 626.203, 681.292, 616.841, 676.242, 657.467, 654.66, 635.478, 603.639, 527.326, 396.904, 338.696, 308.085, 279.706, 252.054, 272.082, 314.367, 340.354, 325.99, 326.46, 327.053, 354.192, 339.035, 329.668, 318.267, 309.847, 321.98, 345.594, 335.045, 311.363, 
299.555, 310.802, 306.523, 315.496, 324.153, 323.256, 334.802, 331.133, 311.292, 323.08, 327.105, 320.258, 312.749, 305.073, 297.087, 298.671), .Tsp = c(2002.91666666667, 2011.66666666667, 12), class = "ts")
msci <- structure(c(1000, 958.645, 1016.085, 1049.468, 1033.775, 1118.854, 1142.347, 1298.223, 1197.656, 1282.557, 1164.874, 1248.42, 1227.061, 1221.049, 1161.246, 1112.582, 929.379, 680.086, 516.511, 521.127, 487.562, 450.331, 478.255, 560.667, 605.143, 598.611, 609.559, 615.73, 662.891, 655.639, 628.404, 602.14, 601.1, 622.624, 661.875, 644.751, 588.526, 587.4, 615.008, 606.133, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 609.51, 598.428, 595.622, 582.905, 599.447, 627.561, 619.581, 636.284, 632.099, 651.995, 651.39, 687.194, 676.76, 694.575, 704.806, 727.625, 739.842, 759.036, 787.057, 817.067, 824.313, 857.055, 805.31, 873.619), .Tsp = c(2007.33333333333, 2014.5, 12), class = "ts")

步骤1:将ARIMA模型拟合到MSCI系列

尽管图形显示存在一些中断,但并未检测到异常值tso。这可能是由于在样本中间存在一些缺失的观察结果。我们可以分两步处理。首先,拟合一个ARIMA模型,并使用它对缺失的观测值进行插值;第二,为插入的序列拟合一个ARIMA模型,以检查可能的LS,TC,AO并在发现变化的情况下优化插入的值。

为MSCI系列选择ARIMA模型:

require("forecast")
fit1 <- auto.arima(msci)
fit1
# ARIMA(1,1,2) with drift         
# Coefficients:
#           ar1     ma1     ma2    drift
#       -0.6935  1.1286  0.7906  -1.4606
# s.e.   0.1204  0.1040  0.1059   9.2071
# sigma^2 estimated as 2482:  log likelihood=-328.05
# AIC=666.11   AICc=666.86   BIC=678.38

按照我对本文回答中讨论的方法,填写缺少的意见 :

kr <- KalmanSmooth(msci, fit1$model)
tmp <- which(fit1$model$Z == 1)
id <- ifelse (length(tmp) == 1, tmp[1], tmp[2])
id.na <- which(is.na(msci))
msci.filled <- msci
msci.filled[id.na] <- kr$smooth[id.na,id]

将ARIMA模型拟合到填充系列msci.filled。现在发现一些异常值。但是,使用其他选项可以检测到不同的异常值。我将保留在大多数情况下发现的那种,即在2008年10月进行一次级别转换(观察18)。您可以尝试例如这些和其他选项。

require("tsoutliers")
tso(msci.filled, remove.method = "bottom-up", tsmethod = "arima", 
  args.tsmethod = list(order = c(1,1,1)))
tso(msci.filled, remove.method = "bottom-up", args.tsmethod = list(ic = "bic"))

现在选择的模型是:

mo <- outliers("LS", 18)
ls <- outliers.effects(mo, length(msci))
fit2 <- auto.arima(msci, xreg = ls)
fit2
# ARIMA(2,1,0)                    
# Coefficients:
#           ar1     ar2       LS18
#       -0.1006  0.4857  -246.5287
# s.e.   0.1139  0.1093    45.3951
# sigma^2 estimated as 2127:  log likelihood=-321.78
# AIC=651.57   AICc=652.06   BIC=661.39

使用先前的模型来完善缺失观测值的插值:

kr <- KalmanSmooth(msci, fit2$model)
tmp <- which(fit2$model$Z == 1)
id <- ifelse (length(tmp) == 1, tmp[1], tmp[2])
msci.filled2 <- msci
msci.filled2[id.na] <- kr$smooth[id.na,id]

初始和最终插值可以在图中进行比较(此处未显示,以节省空间):

plot(msci.filled, col = "gray")
lines(msci.filled2)

步骤2:使用msci.filled2作为外生回归变量,将ARIMA模型拟合到GCC

我忽略了开头的遗漏观察msci.filled2。在这一点上,我发现了一些困难,使用auto.arimatso,所以我试图用手在几个ARIMA模型tso,并最终选择了ARIMA(1,1,0)。

xreg <- window(cbind(gcc, msci.filled2)[,2], end = end(gcc))
fit3 <- tso(gcc, remove.method = "bottom-up", tsmethod = "arima",  
  args.tsmethod = list(order = c(1,1,0), xreg = data.frame(msci=xreg)))
fit3
# ARIMA(1,1,0)                    
# Coefficients:
#           ar1    msci     AO72
#       -0.1701  0.5131  30.2092
# s.e.   0.1377  0.0173   6.7387
# sigma^2 estimated as 71.1:  log likelihood=-180.62
# AIC=369.24   AICc=369.64   BIC=379.85
# Outliers:
#   type ind    time coefhat tstat
# 1   AO  72 2008:11   30.21 4.483

GCC的图在2008年初发生了变化。但是,似乎它已被回归器MSCI捕获,除了2008年11月的一个异常值外,没有其他回归器被包括在内。

残差图未显示任何自相关结构,但该图显示了2008年11月的水平移动和2011年2月的累加离群值。但是,添加相应的干预措施对该模型的诊断更糟。此时可能需要进一步分析。在这里,我将继续基于上一个模型获得预测fit3

95

newxreg <- data.frame(msci=window(msci.filled2, start = c(2011, 10)), AO72=rep(0, 34))
p <- predict(fit3$fit, n.ahead = 34, newxreg = newxreg)
head(p$pred)
# [1] 298.3544 298.2753 298.0958 298.0641 297.6829 297.7412
par(mar = c(3,3.5,2.5,2), las = 1)
plot(cbind(gcc, msci), xaxt = "n", xlab = "", ylab = "", plot.type = "single", type = "n")
grid()
lines(gcc, col = "blue", lwd = 2)
lines(msci, col = "green3", lwd = 2)
lines(window(msci.filled2, start = c(2010, 9), end = c(2012, 7)), col = "green", lwd = 2)
lines(p$pred, col = "red", lwd = 2)
lines(p$pred + 1.96 * p$se, col = "red", lty = 2)
lines(p$pred - 1.96 * p$se, col = "red", lty = 2)
xaxis1 <- seq(2003, 2014)
axis(side = 1, at = xaxis1, labels = xaxis1)
legend("topleft", col = c("blue", "green3", "green", "red", "red"), lwd = 2, bty = "n", lty = c(1,1,1,1,2), legend = c("GCC", "MSCI", "Interpolated values", "Forecasts", "95% confidence interval"))

结果


非常感谢javlacalle,我非常感谢您的帮助,这正是我所需要的。我不知道如何使用它....谢谢你再次感谢您
TG Zain公司

很高兴看到您发现它有用。
javlacalle 2014年

我是RI的新手,所以在Eviews中找不到答案...所以我开始使用R,我有一些问题,我应该如何导入数据..我的意思是所有带有na vableable的数据或仅用于msci到R +没有关于没有kalmansmooth或运行的错误消息,我已经下载了kalman过滤器的程序包,我该怎么办?..谢谢您-TG
Zain

与软件使用相关的问题不在此站点内。堆栈溢出更适合此类问题。如果这是我的回答的特定内容,您可以给我发送电子邮件。
javlacalle 2014年

1
  1. 如果值随机丢失,则推算(即“由移动平均值提供”)有效。如果这是一段很长的时间,那么就不太可能了。问题的第二部分尚不清楚。
  2. 根据问题,将模型用于数据范围之外的预测,从次优到无效,都被认为是什么:例如,如果两个指数之间的关系在2012-2014年发生变化,该怎么办?您可以对缺失的数据点使用回归估计值(但不能直接用另一个索引的原始值替换),但这仅在两个索引之间存在强关系时才有意义,并且至关重要的是,明确标记为估算值。“从所有问题中纠正模型”是什么意思?

2
时间序列分析中有很大一部分专用于预测未来。对于某些人来说,这是统计的主要原因!因此,#2是一个完美的顾问,将胆小的人与时间序列的预测者分开。
尼克·考克斯

公平地说,我同意/立场已纠正。我仍然想知道,选择中间梯度与梯度末尾缺少值的预测变量是否更为谨慎。如果它们是相关的。
卡蒂亚2014年

很抱歉,我尝试上传我的文件,但我不知道如何或在何处:( ... ...我的意思是从异方差和序列相关性更正了该模型
TG Zain 2014年


1

2似乎很好。我会同意的。

至于1.我建议您使用数据集中的所有可用特征(在2011年9月之后不是NA)训练模型来预测GCC(在训练时,请省略在sep2011之前具有任何NA值的行)。模型应该非常好(使用K折交叉验证)。现在预测2011年9月及以后的GCC。

或者,您可以训练一个预测MSCI的模型,然后使用它来预测缺失的MSCI值。现在使用MSCI训练模型来预测GCC,然后预测2011年9月及以后的GCC


谢谢nar ..您的回答使我开始思考var模型...这行得通吗?
TG Zain 2014年

从理论上讲,VAR模型应该可以工作,但是当您在以后很晚才开始进行预测时,累积误差会变得很高。即,如果您站在y(t)处并且想要y(t + 10)的值,则需要递归预测10次。首先,您将预测y(t + 1),然后使用预测的值预测y(t + 2),依此类推。
show_stopper 2014年

我感谢您的帮助...所以您是说您训练amodel所建议的方法要比var更好吗...但是我对此一无所知...请您说明一下如何或您有任何教程和我应该使用哪种模型?
TG Zain 2014年

好。因此,既然我已经看到了您的数据集,请执行以下操作。设计一个使用MSCI预测GCC的简单模型。现在预测2012年8月及以后的GCC。在2011年10月至2012年7月的时间段内,使用VAR或简单的AR模型来预测GCC值
show_stopper 2014年

1
我所说的简单模型是线性或对数线性回归模型。K折验证很简单。将总数据集拆分为k折。k可以是任何数字。使用k-1个分割训练模型,在最后一个分割上测试模型。重复此过程,直到测试完所有唾液为止。现在计算RMSE值。进行上述操作的原因是要确保您选择的模型具有良好的预测能力
show_stopper
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.