原文链接:http://tecdat.cn/?p=24613
咱们在心理学网络论文中看到的一个问题是,作者有时会对其数据的可视化进行适度解释。这尤其波及到图形的布局和节点的地位,例如:网络中的节点是否汇集在某些社区。
上面我将具体探讨这个问题,并提供一个对于如何辨认网络中我的项目社群的根本R教程。十分欢送在上面的评论局部提出反馈。
节点部署和 Fruchterman-Reingold 算法
咱们创立一个例子。首先,咱们拿一些数据,预计一个正则化的偏相关网络,其中节点之间的边相似于偏相关,并应用'spring'命令绘制网络。这是心理学网络文献中默认的,应用Fruchterman-Reingold算法为图中的节点创立一个布局:具备最多连贯/最高连接数的节点被放在图的核心。
cort<- cor(data) graph(cort,layout="spring")
matrix
是这 20 个我的项目的相关矩阵, Size
命令通知咱们有多少人。
这是后果图:
然而,这里的节点部署只是许多同样 "正确 "的节点部署形式中的一种。当网络中只有1-3个节点时,算法将总是以同样的形式部署它们(其中节点之间的边的长度代表它们之间的关系有多强),算法惟一的自由度是图形的旋转。然而,特地是在有许多节点的图中,部署形式只通知咱们一个十分粗略的后果,不应该被适度解释。
以下是绘制咱们上述网络的另外两种办法,它们同样 "正确"。
nNd <- 20set.seed(1)grh2<-grphset.seed(2)gr3<-grph
尽管我的项目之间的边显然是雷同的,但节点的地位却有很大的不同。
欧洲神经精力药理学例子
《欧洲神经精力药理学》(European Neuropsychopharmacology)上Madhoo & Levine的一篇新论文为这个问题提供了一个很好的例子。他们在两个工夫点(相隔12周)考察了约2500名被诊断为重度抑郁症的精神科门诊病人的14种抑郁症状的网络结构。这篇论文的一个十分不错的奉献是,他们钻研了网络结构随工夫的变动,其形式与咱们以前在同一数据集中的钻研有些不同。
与下面的网络例子相似,他们应用正则化的偏相关网络来预计两个工夫点的横截面网络模型,并应用Fruchterman-Reingold算法绘制网络。他们通过目测得出结论,有4个症状群存在,而且这些症状群没有随工夫变动。
"在基线时,网络由四个症状群组成(图1a),即:。睡眠阻碍(我的项目1-5),认知和物理动机缺损(我的项目6-9),情感(我的项目10-12)和食欲(我的项目(13-14)。
[...]起点症状分组(图1b)与基线时类似"。
但这些发现和论断仅仅是基于对后果图的视觉查看--而咱们在下面曾经理解到,对这些图的解释应该十分审慎。值得注意的是,这种视觉上的适度解读在心理学网络文献中相当常见。
让人眼前一亮的另一个起因是,咱们在最近的一篇论文中剖析了同一数据集的社群构造,发现社群的数量随工夫而变动--这与作者对图表的视觉解释相冲突。
R中的数据驱动的社群聚类
那么,如何在R中做到这一点?有许多可能性,我介绍三种:一种来自潜变量建模畛域的十分成熟的办法(特征值合成);一种来自网络迷信的成熟算法(spinglass算法);以及一种正在开发中的十分新的工具(应用walktrap算法的探索性图剖析)。
特征值合成
传统上,咱们想用潜变量框架来形容上述20个我的项目,问题是:咱们须要多少个潜变量来解释这20个我的项目之间的协方差?一个非常简单的办法是查看数据中各成分的特征值。
plot(eigen)abline(h=1)
这向咱们显示了Y轴上每个成分的每个特征值;X轴显示了不同的成分。一个高的特征值意味着它能解释我的项目之间的大量协方差。红线形容了所谓的规范:一个简略的规定,决定咱们须要多少个成分来充沛形容我的项目之间的协方差(每个成分的特征值>1)。无论如何,依据咱们当初应用的规定,咱们可能会决定提取2-5个成分。咱们还不晓得哪个我的项目属于哪个成分--为此,咱们须要运行,例如,探索性因子分析(EFA),看看因子载荷。
为什么这与网络无关呢?许多论文当初曾经表明,潜变量模型和网络模型在数学上是等价的,这意味着在大多数状况下,撑持数据的因素的数量将转化为你在网络中能够找到的社区的数量。
Spinglass算法
第二种办法是所谓的spinglass算法,该算法在网络迷信中曾经十分成熟。为此,咱们将下面预计的网络输出到R中。最相干的局部是最初一行membership。
spinglascmy(g)mershp
在咱们的例子中,spinglass算法检测到了5个社区,这个向量代表了这20个节点属于哪个社区(例如,节点1-7属于社区5)。而后,咱们能够很容易地在qgraph中绘制这些社区,例如,对节点进行相应的着色。请留神,iqgraph是一个十分通用的软件包,除了spinglass算法之外,它还有许多其余检测社区的可能性,比方walktrap算法。(感激Alex Millner对igraph的投入;当然,这里所有的谬误都是我的谬误)。
值得注意的是,spinglass算法每次运行都会导致不同的后果。这意味着你应该在运行spinglass.community之前通过set.seed()设置一个种子,而不是像我下面那样。我运行该算法1000次,看看失去的聚类数量的中位数,而后找到一个能重现这个聚类数量中位数的种子。我在一篇论文中应用了这个解决方案(留神,应用不同的种子,解决方案看起来是不同的)。
同样要害的是,要晓得有许多种不同的办法来做社群检测。Spinglass有些简单化,因为它只容许我的项目成为一个社区的一部分--但可能我的项目被形容为同时属于几个社区更好。Barabási的书 "网络迷信 "中有一个对于社区检测的宽泛章节。Spinglass只是泛滥机会中的一个。正如我下面提到的:例如walktrap,也是罕用的,而且更稳固。
探索性图剖析
第三种办法是通过探索性图表剖析。从你的数据中从新预计了一个正则化的局部相干网络,与咱们下面所做的相似,而后应用walktrap算法来寻找网络中的我的项目社群。在应用walktrap算法的状况下,这应该会失去与igraph雷同的后果(并且细节设置雷同,比方步骤数)。
长处是--与特征值合成不同--它间接显示哪些项目属于哪些社群。
walktrap(da, plt= TRUE)
如果这个办法被证实是无效的,它非常容易应用,并主动显示你的我的项目属于哪个社区。
请留神,目前,探索性图剖析采取你的数据并主动预计一个高斯图形模型(假如是多变量的失常变量)。
spinglass算法和walktrap算法后果是一样的吗?
当初,咱们想检查一下咱们的后果的稳健性:spinglass算法和应用walktrap算法在社区检测方面是否统一?
这很容易做到:让咱们把这两个网络画在一起,并对社区进行相应的着色。首先,咱们依据后果来定义社群,而后用下面第一个网络的布局来绘制网络。
walktrap(coate tile="walktap") spinglass(coratix, tite="spinglass")
直觉上--基于视觉查看--walktrap的解决方案仿佛更有意义,其中节点8属于蓝色社区而不是紫色社区。然而,同样,这只是简单关系的图形显示,咱们在这里必须审慎解释。
因而,让咱们用一个略微不同的布局来绘制同一个网络。
walktrap(layou = list(int = atinomNe2,no,2)))spinglass(cori, layo.pr = list(iit=matrxnrm(Nd2)nde2
正如你当初看到的,在这个可视化中,不分明节点8应该属于蓝色还是红色社区,咱们没有明确的直观偏好。
论断
如果你对网络中的我的项目之间的统计社区感兴趣,不要只在视觉上查看你的图。当我为论文做这件事时,我应用下面形容的三种办法,通常它们的后果相当类似。显然,你也可能对实践或概念更感兴趣。在这种状况下,你可能基本不须要看你的数据,不须要经验上述所有的麻烦。
请留神,上述spinglass或walktrap等社群检测办法的最大局限是,我的项目确定地只属于一个社群。对于心理学数据来说,拟合因子模型常常会发现有穿插负荷的我的项目,这是一个问题。而你能够通过模仿一个2因子模型看到,其中1个我的项目在两个因子上都有同样的载荷。心愿咱们很快就能在R中实现容许我的项目同时属于多个社区的算法(Barabási在他的《网络迷信》一书第9章中形容了几个。
最受欢迎的见解
1.采纳spss-modeler的web简单网络对所有腧穴进行剖析
2.用R语言和python进行社交网络中的社区检测
3.R语言文本开掘NASA数据网络剖析,tf-idf和主题建模
4.在R语言中应用航空公司简单网络对疫情进行建模
5.python附属关系图模型 基于模型的网络中密集重叠社区检测
6.应用Python和SAS Viya剖析社交网络
7.关联网络分析:已迁离北京外来人口的数据画像
8.情感语义网络:游记数据感知游览目的地形象
9.用关联规定数据挖掘摸索药物配伍中的法则