我正在尝试复制“最大强连通分量(LSCC)”测量,这似乎在通用网络分析 R 'igraph' 包代码中不存在。我能找到的最好的方法是“igraph”包中的“largest_component”命令,但这只提供了银行名称列表,没有我需要的数字。所以我想这只是对公司名称进行排序,而不是像论文快照中的红色框(如下)那样给我需要的值。
如何使用 R 程序复制此 LSCC 网络分析值?
我尝试使用 R 代码,如此链接
但是,它没有给出我需要的数值,例如程度、紧密度、中心性等网络数值类型。
我尝试的代码如下(它没有给出我需要的任何数值)。 我并不是说“largest_component”是这里唯一可用的方法。我只是说我也尝试过这段代码,因为你希望我在我的问题中提供任何代码,尽管这没有给我答案:
> library(igraph)
> largest_component(data,mode = "strong")
IGRAPH cd5f7d1 DN-- 94 988 --
+ attr: name (v/c)
+ edges from cd5f7d1 (vertex names):
[1] ABCB US Equity->COLB US Equity ABCB US Equity->FULT US Equity ABCB US Equity->GABC US Equity ABCB US Equity->INDB US Equity
[5] ABCB US Equity->BOH US Equity ABCB US Equity->HOPE US Equity ABCB US Equity->NTRS US Equity ABCB US Equity->ONB US Equity
[9] ABCB US Equity->PB US Equity ABCB US Equity->RNST US Equity ABCB US Equity->STBA US Equity ABCB US Equity->SASR US Equity
[13] ABCB US Equity->SBCF US Equity ABCB US Equity->SBSI US Equity ABCB US Equity->TRMK US Equity ABCB US Equity->UBSI US Equity
[17] ABCB US Equity->WFC US Equity ABCB US Equity->SRCE US Equity ABCB US Equity->FFBC US Equity ABCB US Equity->PFBC US Equity
[21] ABCB US Equity->CADE US Equity C US Equity ->CFR US Equity C US Equity ->EEFT US Equity C US Equity ->NBTB US Equity
[25] C US Equity ->OCFC US Equity C US Equity ->PNFP US Equity C US Equity ->PB US Equity C US Equity ->STBA US Equity
[29] C US Equity ->SASR US Equity C US Equity ->SBSI US Equity C US Equity ->WABC US Equity C US Equity ->BANR US Equity
+ ... omitted several edges
> components(gD_12_2022,mode = "strong")
我的数据片段如下:
Date i j
09/2005 ABCB US Equity CHCO US Equity
09/2005 ABCB US Equity CHCO US Equity
09/2005 ABCB US Equity CHCO US Equity
09/2005 ABCB US Equity COLB US Equity
09/2005 ABCB US Equity COLB US Equity
09/2005 ABCB US Equity COLB US Equity
09/2005 ABCB US Equity FITB US Equity
09/2005 ABCB US Equity FNB US Equity
09/2005 ABCB US Equity HBAN US Equity
09/2005 ABCB US Equity HBAN US Equity
09/2005 ABCB US Equity BOH US Equity
09/2005 ABCB US Equity BOH US Equity
09/2005 ABCB US Equity BOH US Equity
09/2005 ABCB US Equity MTB US Equity
09/2005 ABCB US Equity PNFP US Equity
09/2005 ABCB US Equity SYBT US Equity
09/2005 ABCB US Equity SYBT US Equity
09/2005 ABCB US Equity SYBT US Equity
09/2005 ABCB US Equity SIVBQ US Equity
09/2005 ABCB US Equity SIVBQ US Equity
09/2005 ABCB US Equity SIVBQ US Equity
09/2005 ABCB US Equity TRMK US Equity
09/2005 ABCB US Equity WFC US Equity
09/2005 ABCB US Equity ZION US Equity
09/2005 ABCB US Equity ZION US Equity
09/2005 ABCB US Equity ZION US Equity
09/2005 ABCB US Equity BRKL US Equity
09/2005 ABCB US Equity BRKL US Equity
09/2005 ABCB US Equity BRKL US Equity
09/2005 ABCB US Equity CFFN US Equity
对于其他网络度量,如程度、中心性等,正如我已经提到的,我可以毫无问题地生成它们,因为它们的工作原理如下(显示我的输出片段)。只有 LSCC 我没有找到任何合适的代码可以从 R 运行或执行:
Firms Date Degree Closeness Betweenness Clustering Eigenvector
ABCB.US.Equity 09_2005 0.494623656 0.540697674 0.00484853 0.391304348 0.128802216
CHCO.US.Equity 09_2005 0.784946237 0.540697674 0.009498633 0.386809269 0.496275598
COLB.US.Equity 09_2005 0.612903226 0.550295858 0.007786027 0.386243386 0.265205502
FITB.US.Equity 09_2005 0.838709677 0.611842105 0.015768372 0.374307863 0.257392456
FNB.US.Equity 09_2005 0.494623656 0.436619718 0.002341893 0.383333333 0.47983247
HBAN.US.Equity 09_2005 0.64516129 0.510989011 0.008919628 0.342245989 0.507258004
BOH.US.Equity 09_2005 0.462365591 0.502702703 0.003176559 0.418300654 0.230633224
MTB.US.Equity 09_2005 0.731182796 0.513812155 0.011603933 0.346031746 0.560058904
PNFP.US.Equity 09_2005 0.731182796 0.502702703 0.006913042 0.406722689 0.668115579
SYBT.US.Equity 09_2005 1.494623656 0.611842105 0.041680331 0.352685051 0.70931023
问题中提供的数据片段仅包含来自单个银行的传出连接,因此不足以演示问题的解决方案。这是一个可复制的玩具示例,应该足够了:
library(igraph)
set.seed(1)
d <- replicate(2, sample(paste("Bank", LETTERS[1:10]), 10, TRUE)) |>
as.data.frame()
d <- unique(d[d[[1]] != d[[2]], ])
data <- graph_from_data_frame(d)
plot(data)
根据我对您的方法论论文的阅读,LSCC 是数据集中从每家银行可以到达的其他银行的比例,仅遵循传出边缘。我们可以使用函数
igraph
找到这是 subcomponent
。例如,要查找我们可以从银行 B 联系到的所有银行,我们可以这样做:
subcomponent(data, V(data)["Bank B"], "out")
#> + 5/9 vertices, named, from 4b4f304:
#> [1] Bank B Bank G Bank E Bank I Bank F
您可以确认在上面的例子中银行G、E、I和F都可以从银行B到达。
我们有兴趣获得银行 B 可以到达的所有银行(不包括其本身)的比例。这只是子组件中的节点数(减去银行 B)除以银行总数(减去银行 B)。换句话说:
(length(subcomponent(data, V(data)["Bank B"], "out")) - 1) / (length(V(data)) - 1)
#> [1] 0.5
这个数字意味着从银行 B 可以到达一半的其他银行。
要获取所有银行的结果,我们可以使用
lapply
:
result <- lapply(V(data), function(v) {
(length(subcomponent(data, v, "out")) - 1) / (length(V(data)) - 1)
})
result
#> $`Bank I`
#> [1] 0.125
#>
#> $`Bank D`
#> [1] 0.125
#>
#> $`Bank G`
#> [1] 0.375
#>
#> $`Bank A`
#> [1] 0.375
#>
#> $`Bank B`
#> [1] 0.5
#>
#> $`Bank C`
#> [1] 0.25
#>
#> $`Bank E`
#> [1] 0.125
#>
#> $`Bank J`
#> [1] 0
#>
#> $`Bank F`
#> [1] 0
如果您希望将其放入数据框中,您可以这样做:
result |>
as.data.frame(check.names = FALSE) |>
t() |>
as.data.frame() |>
tibble::rownames_to_column() |>
setNames(c('Bank', "LSCC")) |>
dplyr::arrange(Bank)
#> Bank LSCC
#> 1 Bank A 0.375
#> 2 Bank B 0.500
#> 3 Bank C 0.250
#> 4 Bank D 0.125
#> 5 Bank E 0.125
#> 6 Bank F 0.000
#> 7 Bank G 0.375
#> 8 Bank I 0.125
#> 9 Bank J 0.000