在用R语言做TERGM的时候,怎么把时变二元协变量放进模型里?

在用R语言做TERGM的时候,怎么把时变二元协变量放进模型里?

我有三个年份的因变量矩阵,和三个年份的经济距离矩阵、技术距离矩阵等。目前只看到了GEO地理矩阵这种非时变的矩阵怎么放进去,不太清楚时变矩阵怎么放进去。

目前尝试将时变矩阵做列表,
Eco_distance <- list(Eco_distance1,Eco_distance2,Eco_distance3)
Inst_distance <- list(Inst_distance1,Inst_distance2,Inst_distance3)
Tec_distance <- list(Tec_distance1,Tec_distance2,Tec_distance3)

导入到边的属性上

for (i in 1:length(link)) {
  link[[i]] <- network(link[[i]])
  link[[i]] <- set.edge.value(link[[i]], "Eco", Eco_distance[[i]])
  link[[i]] <- set.edge.value(link[[i]], "Inst", Inst_distance[[i]])
  link[[i]] <- set.edge.value(link[[i]], "Tec", Tec_distance[[i]])
}

最终模型这样写的

mode3 <- mtergm(link ~ edges + mutual + 
                  nodematch("PGDP") + nodematch("PEOPLE") + nodematch("GOV") + nodematch("SEC") + nodematch("OPEN") + nodematch("PINNO") + 
                  edgecov("Eco") + edgecov("Inst") + edgecov("Tec") + edgecov(Geo_distance) + 
                  delrecip,
                control = control.ergm(MCMC.samplesize = 1000, MCMC.interval = 1000))
summary(mode3)

但是报错
Error in ergm_Init_abort():
! In term ‘edgecov’ in package ‘ergm’: There is no network attribute named ‘Eco’ or it is not a matrix.
Run rlang::last_trace() to see where the error occurred.

【以下回答由 GPT 生成】

首先,根据你的描述,我了解到你正在使用TERGM模型进行时间变化分析,并希望将时间变化的二元协变量加入模型中。你已经准备好了三个年份的因变量矩阵以及经济距离矩阵、技术距离矩阵等。

你尝试将时间变化的矩阵存储为列表的形式,这是一个很好的开始。然后,你将列表中的矩阵导入到边的属性中,但是你在设置边属性时遇到了错误。

根据错误提示,问题出在设置边属性时没有找到名为"Eco"的网络属性。这是因为你试图在网络对象上设置边属性,但网络对象上没有名为"Eco"的属性。在TERGM模型中,边属性应该被作为独立于网络的矩阵进行处理。因此,你需要将时间变化的二元协变量作为矩阵导入到TERGM模型中。

为了解决这个问题,你可以使用函数get.matrix来将时间变化的二元协变量转换为矩阵形式,并将其作为模型的边属性。

下面是一个可能的解决方案的代码示例:

# 将时间变化的二元协变量转换为矩阵形式
Eco_matrix <- do.call(cbind, Eco_distance)
Inst_matrix <- do.call(cbind, Inst_distance)
Tec_matrix <- do.call(cbind, Tec_distance)

# 创建TERGM模型
mode3 <- mtergm(link ~ edges + mutual + 
                  nodematch("PGDP") + nodematch("PEOPLE") + nodematch("GOV") + nodematch("SEC") + nodematch("OPEN") + nodematch("PINNO") + 
                  edgecov(Eco_matrix) + edgecov(Inst_matrix) + edgecov(Tec_matrix) + edgecov(Geo_distance) + 
                  delrecip,
                control = control.ergm(MCMC.samplesize = 1000, MCMC.interval = 1000))
summary(mode3)

在这个解决方案中,我使用do.call(cbind, ...)函数将时间变化的二元协变量列表转换为矩阵形式。然后,我将这些矩阵作为边属性(使用edgecov)传递给TERGM模型,以便将它们加入模型中。

请注意,这只是一个示例代码,具体实现取决于你的数据结构和需要。确保你将你的矩阵转换为正确的格式,并将它们与其他模型输入一起设置正确。

如果你还遇到其他问题,请提供更多信息,我将尽力帮助你解决。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^