最近和几位做社会网络研究的朋友聊起一项持续了三年的追踪调查,其中有个实验组的网络数据按季度采集,到了第三年样本流失率超过了四成,剩下的节点里还有一些是“半失踪”状态——有的节点没回答出边,有的没回答入边,有的干脆整波问卷没交。他们拿着这套千疮百孔的数据跑ERGM,发现结果和两年前的结论完全对不上,而且差距不是置信区间变宽这么简单,连效应方向都翻转过来了。这个问题我当时只给了他们一句很重的回答:把不完整网络塞进ERGM而不处理观测过程,你得到的不是“更不确定的估计”,而是“确定地估计了错误的东西”。
ERGM(Exponential Random Graph Model,指数随机图模型)之所以在社会科学和网络研究中这么普及,是因为它能用一套参数同时刻画度数分布、互惠、传递性、同质性等结构效应。但ERGM作为一种概率模型,它的标准推断框架有一个隐含前提:我们手里拿到的那张邻接矩阵,就是真实网络本身。一旦这个前提在真实场景中不成立,缺失数据会通过充分统计量进入估计方程,测量误差会以系统性的方式扭曲参数解释。这篇内容我就结合自己在实际项目里处理这类问题的经验,把观测过程建模的框架、缺失数据和测量误差的处理路径、以及模拟评估的方法完整拆一遍。适合正好被“数据不干净”困扰的研究生、数据分析师和做实证网络的同行参考,也适合那些想搞清楚ERGM输出结果到底可不可信的读者。
1. 标准ERGM的完整数据假设,以及它在现实网络中如何失效
1.1 ERGM的基本设定:所有边都在同一张邻接矩阵里
先说清楚基准模型。ERGM把网络看作一个随机变量Y,取值为某个n节点上的邻接矩阵y∈{0,1}^{n×n}(无向图取上三角部分),模型形式是:
P_θ(Y = y) = exp{θ^T s(y)} / κ(θ)
其中s(y)是网络充分统计量向量,比如边的数量(对应密度参数)、互惠边的数量(对应互惠参数)、传递三元组的数量(对应传递闭包参数)、协变量边数(对应同质性参数),θ是这些结构效应的权重。分母κ(θ)是归一化常数,通常不可计算,这就是ERGM推断困难的核心来源。
为了做推断,标准做法是用MCMC-MLE(马尔可夫链蒙特卡洛极大似然估计):从当前参数下模拟大量网络,用模拟网络统计量的平均值去逼近归一化常数——顺带提一句,业界通行的技术路线说个直接的版本,MCMC-MLE的稳定结果在收敛良好的前提下可信,但它的好伙伴MPLE(伪极大似然估计)更快但偏差较大。这个框架下的一切都基于Y的完整可观测性。
现在问题来了:真实数据采集过程中,Y_obs往往只覆盖真实网络Y的一个子集。节点可能拒绝参与调查、问卷可能漏题、传感器可能误报边、档案数据可能漏录一条关系。你拿到的y_obs只是在某个复杂观测过程作用下呈现出来的一张“可观测网络”,而不是目标对象Y本身。
1.2 一个关键事实:缺失掉的是结构,不只是“样本量”
很多研究者对缺失数据的直觉是从回归分析中带来的:数据缺失无非是有效样本量减少,顶多让标准误变大。但这个直觉放到网络中完全失效。
原因在于ERGM统计量是全局的。你缺失一个节点,不仅少了一个节点的度数和协变量,还可能断了它与邻居之间的所有三元组,而这个缺失的三元组在估计传递性参数时是算作“没发生”还是“没观测到”,会给出截然不同的似然判断。同理,一条未观测到的边如果真实存在,遗漏它会让网络密度偏低、互惠性可能被低估(尤其当社交网络里互惠边更容易被观察到时),更麻烦的是,这些偏差是跟节点属性、跟网络位置相关的。
举个我自己踩过的坑。有次处理一个组织内部的咨询关系网络,用问卷收集“你经常向谁请教问题”。高层管理者的问卷回收率显著高于基层员工,而那些请教关系大量指向高层。所以观测网络的密度被“压扁”在高层内部,基层之间、基层到高层之间的边都被系统性漏掉了。结果跑出来的ERGM显示“层级同质性很强、跨层咨询极少”,但真实数据中跨层咨询恰恰是最频繁的。这就是典型的观测过程与网络结构相关导致的估计偏倚——样本缺失不是随机的,而是“结构性地缺失”。
测量误差也一样。当你用档案数据、用传感数据、用文本挖掘出来的共现关系界定网络时,误报(把不存在的边加进来)和漏报(丢掉真实边)几乎不可能避免。而且这些误差很少均匀分布——你更可能发现两个名人之间的边(因为公开报道多),却很难发现普通成员之间的真实边。这种误差会对ERGM参数的估计产生与缺失数据类似、但机制不同的威胁。
2. 观测过程建模:把“网络生成”和“网络呈现”分开对待
2.1 形式化:三层结构的观测模型
既然问题出在把y_obs误当成了y,方法论上的出路就是显式地把观测过程纳入模型。我自己的习惯是把数据生成拆成三层:
第一层是真实网络Y,由ERGM或某种生成机制决定,其参数θ是我们真正关心的推断对象;第二层是观测过程O,决定每个节点、每条边、每个节点属性是否进入最终数据集;第三层是观测到的网络Y_obs,是Y通过O过滤后呈现的结果。
用形式化语言写就是这样:
p(Y_obs = y_obs | Y = y, Φ) = f_obs(y_obs; y, Φ)
其中Φ是观测过程的参数,描述从真实网络到观测网络的映射。在缺失数据场景下,这个映射通常分解为逐节点的观测指示符R_i和逐边的观测指示符R_ij,比如:
P(R_ij = 1 | Y_ij, 网络结构) = π_ij
如果π_ij对所有边都是常数π,那就是“均匀抽样”,处理起来最简单;如果π_ij依赖边本身的状态(比如己有的边更容易被观测到),那就是“依赖结果的观测过程”,处理不好就会严重偏倚。
这里最关键的方法论转向是:你不再问“这张观测网络的结构是什么”,而是问“给定观测数据、给定观测机制假设,真实的网络结构空间及其参数是什么”。这相当于把观测过程当成了一个伴随模型,和ERGM一起估计,或者通过多次插补把观测过程纳入不确定性传播。
2.2 三种对观测机制的假设,直接影响你的估计偏差方向
我用一个现实中的例子说明。假设你研究的是员工之间的知识共享网络,通过问卷要求每位员工列出自己经常交流的同事。这种数据至少受三个观测机制影响:
机制一是“边界效应”:受访者倾向于报告与自己关系密切的人,而忽略偶尔交流的弱关系——这导致互惠边和强强度边被高估。
机制二是“容量限制”:问卷给每个人最多列10个人的空间,但真实交流对象可能超过20——这导致高度数节点被系统截断,度数分布严重“挤压”。
机制三是“成员不响应”:整张问卷没交的人,其所有出边入边全部缺失——而且不响应者往往有特殊特征(比如更孤立或更忙碌)。
这三种机制对应着不同的缺失类型:机制一是测量误差型缺失(漏报弱边),机制二是删失型缺失(截断高尾),机制三是节点级缺失(整行整列丢失)。若分别对它们建模,需要的处理方法完全不一样。若把它们全部笼统地当作“随机缺失”处理,你能量化的就只是一个噪声放大器,方向是歪的。
在这个问题上,观测过程建模的价值不是“修正”某一种误差,而是逼你去明确:你假设哪种机制在起作用?你愿意为这个假设承担多大风险?模型说到底是一个假设的载体,把这些假设显式写在观测模型里,总比让它们潜伏在每个估计值背后要强。
3. 缺失数据的三条处理路线,以及它们的适用边界
这一节我讲实际操作。ERGM框架下缺失数据最常用的处理路线大体有三条,各有各的代价与适用范围。
3.1 路线一:基于观测部分的完整信息极大似然(“直接无视”的升级版)
所谓“基于观测部分”,是指不进行任何填补,直接用观测到的邻接矩阵做估计。R的statnet工具集里,在ergm()函数中把未观察到的边标成NA,程序默认会基于可观测单元的充分统计量做推断。这看起来是“默认处理”,但它隐含的假设很强:缺失机制必须被忽略。
本质上,这条路线假设观测到的边集合是真实网络的一个代表性样本,缺失单元对充分统计量没有额外信息。如果缺失确实是完全随机的,或者缺失比例很低,这样做问题不大。但在结构相关缺失下,这样做会导致系统性偏倚——就是我在第1节里踩过的那个坑。
这条路线的最大优点是简单、好复现、不引入额外模型假设;最大缺点是它不能处理“依赖结果的缺失”,因为后果会冻结进充分统计量里。对探索性分析或数据质量较高的场景,这是可以接受的。但对正式发表级的推断,我通常建议至少在补充材料里做敏感性分析,检验缺失比例从5%变到30%时参数是否稳健。
3.2 路线二:多重插补网络法(MI法)
多重插补在经典回归里是标配,但套用到网络上有一个根本性的困难:网络是全局相关的,你插补的不只是单个值,而是一整张邻接矩阵中缺失的子矩阵,并且这个子矩阵的联合分布由ERGM决定。
具体操作上,通常的做法是:
- 基于观测部分估计一个暂时性的ERGM(可以用MPLE或对缺失不敏感的初始模型);
- 从这个模型的条件分布中抽取缺失边的取值,生成多套完整网络;
- 分别对每套完整网络估计ERGM参数;
- 用Rubin法则合并估计值和标准误。
听起来顺理成章,但实际跑起来有三个坑。
第一个坑:模型设定错误会通过缺失点的插补值反噬估计结果。你初始模型里没有包含某个重要的结构项(比如没有互惠项),那么从该模型采样的缺失边模式也会缺少互惠性,并进一步压低估计结果里的互惠参数。这是“坏模型自带放大器”的问题。
第二个坑:多重插补的合并规则在复杂统计量上并不直截了当。ERGM参数估计量的采样分布不是正态分布,尤其在小样本下合并标准误很可能失真。我的经验是,合并后的置信区间经常偏窄,覆盖概率低于名义水平。
第三个坑:计算成本高得吓人。每套插补都需要跑一个完整ERGM的MCMC估计,10套就是10次MCMC-MLE,且每次的链都得烧到稳态。数据量稍微大点,一台机器熬一个通宵是常事。
尽管有这些问题,MI法仍然是目前处理“节点缺失”最有解释力的框架之一——它天然地把观测过程的不确定性传导到了最终参数估计上。如果缺的是整行整列,我会优先考虑MI法,但一定会把模型规范化和链收敛诊断做足。
3.3 路线三:加权伪似然法(Weighted MPLE)
第三条路是通过给观测到的边赋予权重来修正缺失概率不同带来的偏差。思路很直接:在MPLE的框架里,每条观测到的边的对数似然贡献要除以这条边被观测到的概率π_ij,相当于用“权重=1/π_ij”做一次加权逻辑回归。如果π_ij已知或可以被建模,加权MPLE在计算上非常高效,适合大网络和大规模的模拟敏感性分析。
但这套方法有一个天然的脆弱点:如果π_ij估计不准,权重的方差会剧烈膨胀,小部分极端权重会主导估计结果。而且加权MPLE没有归一化常数,它无法处理“传递性闭合”这类全局结构效应——因为这类效应本质上依赖于多个边的联合分布,而不是单条边的边际概率。所以在需要解释传递性、K-星等结构参数的研究里,加权MPLE只能作为辅助诊断,不能作为主要推断方法。
这三条路线之间不是“谁更好”的关系,而是“你的数据缺失机制适配谁的假设”的关系。做选择前先回答三个问题:缺失是随机发生在边上,还是集中发生在某些节点上?观测概率是否依赖网络结构本身?你有没有可靠的关于观测过程的信息?三个问题的答案组合,基本决定了你应该用哪条路线。
4. 测量误差:比缺失数据更隐蔽的结构威胁
测量误差比缺失数据更微妙,因为它们不表现为“空值”,而表现为“错误的值”。你拿到一张看起来完整的邻接矩阵,但里面充斥着误报边和漏报边。很多研究者在跑ERGM前根本不检查这一层假设,这很危险。
4.1 误报与漏报:各自对ERGM参数的扭曲方向
先给一个简化的双参数测量模型。设真实边为Y_ij,观测到的边为Y_obs,ij,则:
- 漏报率α = P(Y_obs,ij = 0 | Y_ij = 1):真实存在的边没被观察到;
- 误报率β = P(Y_obs,ij = 1 | Y_ij = 0):不存在的边被伪造出来。
如果把观测过程简单地视为独立噪声(忽视结构与误差的相关性),那么漏报率α会让网络密度变低,互惠性、传递性参数一般也会被压缩——因为丢失的边会切断闭合关系,而剩下来的互惠边反而更容易被观测到,导致互惠参数出现两种相反力量的拉锯。误报率β则相反,会人为增加密度、制造虚假的闭合三元组。
更麻烦的是,误差通常不是独立的。以前面提到的知识共享问卷为例:受访者很容易忘记报告弱关系,但几乎不会忘记报告强关系;新闻档案类数据里,名人之间的边被高频记录,普通人之间的边几乎隐形。此时的测量误差已经与网络结构(强度、节点度、中心性)强烈相关,它不再是一个简单的“噪声项”,而是跟ERGM所建模的结构效应争夺可解释性的机制。
这种相关测量误差在回归模型里通常被叫做“混杂测量误差”,在ERGM语境下有类似后果:密度参数被高估或低估,同质性参数被低估(因为同质性边的观测概率往往系统性地不同于非同质性边),传递性参数也可能被高估或低估,取决于误差的闭合倾向。关键点是:你不处理测量误差,你的“结构发现”可能只是观测过程的伪影。
4.2 节点属性测量误差:被低估的同质性衰变
测量误差不仅发生在边上,还发生在节点属性协变量上。ERGM里经常估计同质性参数——比如“相同性别的人之间更倾向于建立连接”。如果你用的性别变量只是一个粗糙的代理或者存在报告误差,那么真实的同质性效应会被系统地稀释,也就是向零收缩。
直觉上很好理解:同质性效应的估计依赖“同一属性值”这条信号的可靠传递。属性值如果随机且对称地测错,真实同类的个体在数据里被分到了不同类,真实异类的个体被分到了同类,两种错误都会稀释同质性信号。测量误差比例越高,估计出来的同质性参数就越靠近0。
处理节点属性测量误差的方式有两种取向:一是用结构方程框架,在模型里显式加入属性测量模型,也就是把观测属性作为真实潜属性的带噪版本;二是用校正公式,基于已知的测量信度去修正同质性估计。后者计算简单,但需要你事先知道信度;前者灵活,但复杂度陡增。
实操上,我对同质性参数的测量误差非常敏感,因为这是很多实证研究(比如种族、性别、部门归属的网络研究)的核心解释变量。如果一个项目无法获得可靠的属性数据,我宁可把同质性参数换成“对同一可观测分组变量的同质性”,并在解释时明确自己是“对带噪变量的同质性”建模,也不要糊里糊涂地把自己搞得像在讨论真实分组一样。
4.3 显式测量误差模型的实践路径
在ERGM框架内显式引入测量误差,目前在实际项目里走得通的路子是“双层ERGM”或“带测量模型的扩展ERGM”:把真实网络Y当成潜在变量,其结构服从ERGM;同时建立Y_obs关于Y的测量模型(比如每条边独立但概率不同的误报漏报模型,或者更复杂的按节点属性分层的测量模型)。然后通过贝叶斯方法或MCEM(蒙特卡洛EM)做推断。
这条路很“贵”,并且在MCMC采样上容易出问题:测量模型里的误差参数和网络结构参数之间可能存在强相关性,导致链收敛极慢。我的建议是,先用模拟数据评估一次“联合估计是否可识别”。具体做法是:给定一个仿真网络和一套误差参数,生成观测网络,再用联合模型做估计,看误差参数和网络参数能不能被区分开来。如果模拟阶段的联合估计都不收敛,那对真实数据的估计结果就需要打大大的问号。
5. 模拟实验设计:给估算器做“体检”的正确姿势
不管选了上面哪条路,正式分析之前都应该做一轮模拟实验,检验估算器在你设定的缺失/误差机制下是否仍能恢复真实参数。这一环在方法论要求高的论文里几乎是标配,但在实证导向的研究里经常被省略。我的经验是:这一轮模拟帮我在实际分析中避开了至少三次解释灾难。
5.1 数据生成机制:网络生成与观测过程分层设定
模拟设计的核心原则是:先用已知参数生成完整网络,再在完整网络上施加观测过程,生成观测网络,最后从观测网络反推参数,对比反推值与真值。生成完整网络用simulate(),比如设定一个含边数、互惠、传递性、同质性的ERGM,生成一个1000节点左右的网络。然后施加观测机制:
- 节点层面:按某些节点属性(比如节点的出度或某个协变量)设定答卷概率,剔除未答卷节点的所有边;
- 边层面:按边的方向、类型、是否互惠等设定漏报概率;
- 噪声层面:按一定概率α漏掉真边、按β注入假边。
这里最容易犯的错误是:模拟的观测机制和估计时假设的机制太一致,“用自己假设的机制评估自己的估计器”,结果当然很好。好的做法是列一份“设计矩阵”,把数据生成时的机制和估计时假设的机制分开,分别脚本化,然后交叉对比。比如,我可能在生成时用“按节点的度高低决定漏报率”这种机制,而估计时用独立漏报模型——两者不一致,这时观察估计器的偏倚有多严重,这种偏离程度才是现实中最常见的坑。
5.2 校准指标:偏差、置信区间覆盖率和链行为
评估一个估计器,我至少看三个指标:
第一个是点估计的偏差百分数——把多次模拟的估计值均值与真值比较,偏了多少。这个指标直接告诉你“机制错配的代价有多大”。
第二个是置信区间覆盖率——构造90%置信区间,看真实参数在百分之多少的模拟里落进区间。如果覆盖率只有70%,那不管点估计多准,你对不确定性的传达都是有偏的。如果覆盖率到99%,说明你的标准误被严重高估,这个偏保守的结果在发表阶段还行,但在决策导向的分析里会妨碍发现真实效应。
第三个是链的收敛行为——跑MCMC-MLE时看模拟统计量是否在目标值附近稳定波动。ERGM最常见的技术灾难是参数退化:模型倾向于生成全满网或全空网,此时的估计链表现为“在退化空间和现实空间之间摇摆”。遇到这种情况时,墨守成规地增加迭代次数是没用的,要做的是简化模型、换参数化(比如用几何加权项替代高次K星项)、或增加约束。
模拟实验的另一大用途是确定样本量和数据质量的下限。我通常在正式收集数据前,用不同的网络规模(300、500、800节点)和不同的缺失比例(10%、30%、50%)跑一遍模拟,找到“还能保持参数方向正确”的极端条件。这个方法不需要预知真实数据,只需要对网络规模和缺失量有个大概估计,但能让你对最终结论的边界心中有数。
6. 复现性与报告的实战细节:怎样让结论经得起审稿人拷问
方法论部分收尾之后,还有一个很容易被忽视但极其重要的环节——把缺失数据与测量误差的处理过程做成可复现的报告。很多研究在方法部分写“我们处理了缺失数据”就完事了,既不写缺失率的分布,也不写缺失机制假设,更不写敏感性分析。这种写法等于告诉审稿人:我处理了,但你也别问怎么处理的。
6.1 需要保留的元数据清单
我在实际项目里会强制自己保存以下几组信息:
- 缺失的基本统计:节点层面、边层面、属性变量各自的缺失比例;缺失节点的度数分布与非缺失节点是否有显著差异;缺失边所在位置是集中在低度节点还是高度节点。
- 观测机制的假设描述:为什么假设是随机缺失还是相关缺失?问卷设计、采样设计、数据来源本身对缺失机制说了什么?
- 敏感性分析的矩阵:不同缺失率假设下参数估计的变化范围;不同插补套数下标准误的变化;不同漏报误报组合下的估计走向。
这套信息不仅是为了发表,更是为了自己复查。我经常在半年后回看自己的旧分析,发现当时的“结论”在一些敏感性条件下根本不成立。没有元数据的分析,连复盘都无从谈起。
6.2 一个埋在我的“错误”里的教训
分享一个真实翻车经历。有一次做组织网络的纵向研究,我用问卷收集了两波数据,第一波回收率78%,第二波回收率61%。我当时直接用两波完整案例做了跨期比较,发现互惠性随时间显著上升。写稿时顺手做了一次敏感性检验,把第二波再做三次随机子抽样模拟,发现互惠性的上升在多个子样本组合里都消失了。问题出在哪?第二波回收率低的节点主要集中在已经退居二线的老员工,而老员工恰恰是互惠行为的集中群体。看似“随时间上升”的互惠性,其实是“样本构成变化”带来的伪趋势。
那次之后我给自己立了一个规矩:凡是研究报告或论文中的ERGM结果,必须报告完整观测矩阵的缺失分布图,以及至少一组敏感性分析结果。如果你的结论在缺失率最高的分位节点剔除后依然稳健,那它才配得上“稳健”二字;如果剔除后方向反转,那恭喜你,你发现了一个比原结论更有意思的故事。
6.3 可复现的工作流建议
具体工具层面,我现在习惯用R的statnet工具集处理ERGM部分,用networks存储带缺失标记和边属性的网络对象。观测过程建模部分用ergm包的约束采样功能,配合simulate做插补和模拟。所有脚本分三个文件:00_generate.R负责模拟数据生成,01_fit_models.R负责模型估计,02_sensitivity.R专门跑敏感性矩阵。三个文件共享一个参数配置文件,任何改动都能追溯。
跑敏感性分析时我还有一个习惯:不只看参数估计,还要输出模型拟合诊断(比如AIC、BIC、gof拟合优度检验)。因为不同缺失处理方案可能给出相近的参数估计,但拟合优度差异巨大。模型的拟合优度是数据对模型设定的“信用评级”,不检查这一栏,你无法知道你的模型是解释了数据,还是解释了缺失机制。
7. 边界情况与未来扩展:当观测过程本身就是研究对象
最后聊一个更进阶的场景。有些研究问题里,观测过程不仅仅是需要修正的偏差来源,它本身就是有意义的研究对象。比如研究网络中的“可见性”不平等:谁更容易被他人报告为朋友?谁在网络数据中更显眼?这其实是一个social visibility问题,你可以把漏报概率π_ij建模成节点属性的函数,然后直接估计哪些因素影响“被报告”的可能性。这种做法把观测过程从“讨厌的干扰项”变成了“有价值的结果变量”。
这种建模思路在方法论上有一个好处:它能帮你鉴别真实的网络效应和观测过程造成的伪效应。举个例子,你发现某类节点在观测网络中呈现出显著的同质性聚集,但可能只是因为这类节点的成员更容易被问卷覆盖到,形成了被观测的偏置。通过联合估计结构参数和观测参数,你可以把“真实聚集”和“观测偏置”分开,这一分离在理论上比任何事后修正都干净。
不过要提醒一句:这类联合模型的识别条件往往很苛刻,数据不足时容易陷入参数“打架”。我的底线建议是,如果你的研究不打算把观测过程本身当作研究对象,就坚持把它当作干扰项,做好敏感性分析;如果确实要研究观测过程本身,就要在设计阶段就预留验证数据的空间。
我是做统计分析出身,不是方法论发明家,这些思路大多来自自己项目里的摸爬滚打。ERGM本来就不算是一个对数据质量友好的模型框架,处理缺失和测量误差也没有万能药方。我的核心体会可以用一句话总结:不要问“数据要不要清洗”,要问“观测过程假设了什么,我的结论在多大程度上依赖这个假设”。把这个问号挂在所有结果的旁边,你的网络分析才算真正站稳了脚跟。