R语⾔时变向量⾃回归(TV-VAR)模型分析时间序列和可视化
原⽂链接:tecdat/?p=22350
在⼼理学研究中,个⼈主体的模型正变得越来越流⾏。原因之⼀是很难从⼈之间的数据推断出个⼈过程。另⼀个原因是,由于移动设备⽆处不在,从个⼈获得的时间序列变得越来越多。所谓的个⼈模型建模的主要⽬标是挖掘潜在的内部⼼理现象变化。考虑到这⼀⽬标,许多研究⼈员已经着⼿分析个⼈时间序列中的多变量依赖关系。对于这种依赖关系,最简单和最流⾏的模型是⼀阶向量⾃回归(VAR)模型,其中当前时间点的每个变量都是由前⼀个时间点的所有变量(包括其本⾝)预测的(线性函数)。
标准VAR模型的⼀个关键假设是其参数不随时间变化。然⽽,⼈们往往对这种随时间的变化感兴趣。例如,⼈们可能对参数的变化与其他变量的关系感兴趣,例如⼀个⼈的环境变化。可能是⼀份新的⼯作,季节,或全球⼤流⾏病的影响。在探索性设计中,⼈们可以研究某些⼲预措施(如药物或)对症状之间的相互作⽤有哪些影响。
在这篇博⽂中,我⾮常简要地介绍了如何⽤核平滑法估计时变VAR模型。这种⽅法是基于参数可以随时间平滑变化的假设,这意味着参数不能从⼀个值 "跳 "到另⼀个值。然后,我重点介绍如何估计和分析这种类型的时变VAR模型。
通过核平滑估计时变模型
核平滑法的核⼼思想如下。我们在整个时间序列的持续时间内选择间隔相等的时间点,然后在每个时间点估计 "局部 "模型。所有的局部模型加在⼀起就构成了时变模型。对于 "局部 "模型,我们的意思是,这些模型主要是基于接近研究时间点的时间点。这是通过在参数估计过程中对观测值进⾏相应的加权来实现的。这个想法在下图中对⼀个数据集进⾏了说明。
这⾥我们只说明在t=3时对局部模型的估计。我们在左边的⾯板上看到这个时间序列的10个时间点。红⾊的⼀列w\_t\_e=3表⽰我们在t=3时估计局部模型可能使⽤的⼀组权重:接近t=3的时间点的数据得到最⾼的权重,⽽更远的时间点得到越来越⼩的权重。定义这些权重的函数显⽰在右图中。左图中的蓝⾊柱⼦和右边相应的蓝⾊函数表⽰另⼀种可能的加权。使⽤这种加权,我们结合了更少的时间上接近的观测
值。这使我们能够在参数中检测到更多的 "时间可变性",因为我们对更少的时间点进⾏了平滑处理。然⽽,另⼀⽅⾯,我们使⽤的数据较少,这使得我们的估计值不太可靠。因此,选择⼀个加权函数,在对 "时变性 "的敏感性和稳定的估计之间取得良好的平衡是很重要的。在这⾥介绍的⽅法中,我们使⽤了⼀个⾼斯加权函数(也称为核),它是由其标准差(或带宽)定义的。我们将在下⾯讨论如何选择⼀个好的带宽参数。
加载和检查数据
为了说明估计时变VAR模型,我使⽤了12个情绪相关变量的ESM时间序列,这些变量每天最多测量10次,连续测量238天。这些问题是 "我感到放松"、"我感到沮丧"、"我感到烦躁"、"我感到满意"、"我感到孤独"、"我感到焦虑"、"我感到热情"、"我感到怀疑"、"我感到⾼兴"、"我感到内疚"、"我感到犹豫不决"、"我感到坚强"。每个问题都⽤7分的李克特量表回答,范围从 "不 "到 "⾮常"。
我们看到数据集有1476个观察样本:
## \[1\] 1476 12head(data)
time_data包含每个测量的时间信息。我们将利⽤测量发⽣的⽇期、测量提⽰和时间戳(time)。
选择最佳带宽
选择好的带宽参数的⽅法之⼀是在训练数据集上⽤不同的候选带宽参数拟合时变模型,并在测试数据集上评估它们的预测误差。此外,数据驱动的带宽选择可能需要相当长的时间来运⾏。因此,在本⽂中,我们只是将带宽固定为已经选择的最佳值。
bandwidth <- .26
估计时变var模型
我们现在可以指定时间变化的VAR模型的估计。我们提供数据作为输⼊,并通过type和level参数指定变量的类型以及它们有多少个类别。在我们的例⼦中,所有的变量都是连续的,因此我们设置type = rep("g")表⽰连续⾼斯。我们选择⽤lambdaSel = "CV "的交叉验证法来选择正则化参数,并且我们指定VAR模型应该包括⼀个滞后期=1的单滞后期。参数bee和day提供了每个测量的⽇期和某⼀天的通知数量。
此外,我们还提供了所有测量的时间戳,时间点=time,来说明缺失的测量。然⽽,请注意,我们仍然假设滞后期⼤⼩为1。时间戳只是⽤来确保加权确实给那些最接近当前估计点的时间点最⾼的权重。
对于时变模型,我们需要指定两个额外的参数。⾸先,⽤ seq(0, 1, length = 20)我们指定我们想在整个时间序列的持续时间内估计20个局部模型(被归⼀化为[0,1])。估计点的数量可以任意选择,但在某些时候,增加更多的估计点意味着增加了不必要的计算成本,因为后续的局部模型基本上是相同的。最后,我们⽤带宽参数指定带宽。
# 完整数据集的估算模型
tvvar(data, type = rep("g"), lambdaSel = "CV", lags = 1, estpoints = seq(0, 1, length = 20), bandwidth = bandwidth,我们可以输出对象
# 检查使⽤了多少数据obj
其中提供了模型的摘要,也显⽰了VAR设计矩阵中的⾏数(876)与数据集中的时间点数量(1476)。前者的数量较少,因为只有在给定的时间点也有滞后1年的时间点时,才能估计VAR(1)模型。
计算时变预测误差
与标准VAR模型类似,我们可以计算预测误差。从模型对象中提供新数据和变量可以计算新样本的预测误差。
参数errorCon = c("R2", "RMSE")指定解释⽅差的⽐例(R^2)和均⽅根误差(RMSE)作为预测误差。最后⼀个参数Method指定了如何计算时间变化的预测误差。选项Method = "closestModel "使⽤最接近的局部模型对⼀个时间点进⾏预测。这⾥选择的选项tvMethod = "weighted",提供了所有局部模型预测的加权平均值,使⽤以当前时间点的位置为中⼼的加权函数进⾏加权。通常情况下,这两种⽅法得到的结果⾮常相似。
pred_obj <- predict(object = obj, data = data, errorCon = c("R2", "RMSE"), Method = "weighted")
主要的输出是以下两个对象。
tverrors是⼀个列表,包括每个估计点局部模型的估计误差;errors包含整个估计点的平均误差。
正则化的回归分析
将模型的部分内容可视化
在这⾥,我们选择了两种不同的可视化⽅式。⾸先,我们来检查估计点1、10和20的VAR交互参数。
for(tp in c(1,10,20))igraph(wadj\[, , 1,tp \], layout = "circle", paste0("估计点 = "))
我们看到,VAR 模型中的⼀些参数随时间变化很⼤。例如,"放松 "的⾃相关效应似乎随着时间的推移⽽减少,"强烈 "对 "满意 "的正效应只出现在估计点20,"满意 "对"有罪 "的负效应也只出现在估计点20。
我们可以通过绘制这些单个参数与时间的函数来放⼤它们。
# 画图title(xlab = "估计点", cex.lab = 1.2)title(ylab = "参数估计", cex.lab = 1.2)for(i in 1:nrow(display)) { lines(1:20, ests\[par_row\[1\], \], lty = i) legend<- c(expression("轻松"\["t-1"\] %->% "轻松"\["t"\]), expression("强烈"\["t-1"\] %->% "满意"\["t"\]), expression("满意"\["t-1"\] %->% "惭愧"\["t"\]))
我们看到,在时间序列的开始阶段,"放松 "对其本⾝的影响是⽐较强的,但随后会向零下降,并在估计点13左右保持零。“强烈”对“满意”对下⼀个时间点的交叉滞后效应在估计点9之前等于零,但随后似乎单调地增加。最后,"满意 "对 "惭愧 "的交叉滞后效应也等于零,直到估计点13附近,然后单调地减少了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论