Py学习  »  Python

受访者驱动抽样:Stata/R/Python 实操指南

连享会 • 2 周前 • 46 次点击  


👇 连享会 · 推文导航 | www.lianxh.cn


🍓 课程推荐:连享会:2025暑期班·网络直播
嘉宾:连玉君 (初级+高级) || 张宏亮 (论文班)
时间:2025 年 8 月 4-14 日
咨询:王老师 18903405450(微信)

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

作者:孙碧洋 (香港中文大学)
邮箱:bsun@fandm.edu


本文介绍一种在公共卫生和社会科学研究中常见的非概率抽样方法——受访者驱动抽样(Respondent Driven Sampling, 简称 RDS)。这种方法尤其适用于研究“隐藏群体”,例如吸毒者、性工作者、跨性别者等。文章将依次讲解 RDS 的基本原理、实施流程及数据分析方法,并通过 Stata 实例展示具体操作过程。


1.  方法背景与发展脉络

1.1 RDS 的提出与应用发展

受访者驱动抽样(RDS)是一种基于社会网络的链式抽样方法,由康奈尔大学社会学家 Douglas Heckathorn 于 1997 年首次提出。最初,RDS 被设计用于研究“隐藏人群”(hidden populations)—— 那些难以通过传统随机抽样方式接触到的群体。

近年来,RDS 被广泛用于调查以下类型的对象:

  • 吸毒人群(Heckathorn, 2002)
  • 弱势青少年(Decker et al., 2014)
  • 性工作者(Cowan et al., 2013; Matos et al., 2017)
  • 男同性恋者(Kuhns et al., 2015)
  • 跨性别者(Martins et al., 2013)
  • 爵士乐手(Heckathorn & Jeffri, 2001)
  • 大学生群体(Wejnert, 2010)

在中国,RDS 也逐渐获得关注。例如,南京大学刘林平教授团队曾基于 RDS 技术研究农民工流动情况(刘林平等,2015);中山大学梁玉成教授亦运用该方法研究在广东的非洲裔移民(梁玉成,2013)。由此可见,RDS 不再局限于“隐藏人群”,而是在越来越多的社会调查中展现出实用价值。

1.2 RDS 适用人群的典型特征

RDS 之所以成为研究“难以接触人群”(hard-to-reach populations)的利器,主要是因为这类人群具备以下共性:

  • 体量较小、隐蔽性强:相较于整个社会人口基数,目标人群数量有限,常处于社会边缘,流动性高(Hipp, Kohler, & Leumann, 2019),有时甚至涉及非法行为,导致其在官方登记系统中“不可见”。

  • 社会网络紧密:这类人群内部联系较为密切(tight-knit),成员之间熟识程度高,有利于通过“推荐制”扩展样本(Kniejska, 2016)。

以流动人口为例,政府往往缺乏完整的联系资料,且这些人的住址和联系方式频繁变动,难以构建稳定的抽样框。此外,由于总量本身较小,通过随机抽样筛选到合格对象的效率极低,成本高昂;而涉及违法行为时,个体对隐私保护的顾虑也进一步降低了传统抽样的可行性。

综上所述,受访者驱动抽样提供了一种兼顾成本、效率与隐私保护的替代路径,成为社会科学与公共卫生研究中获取“稀缺样本”的重要工具。

1.3 RDS 抽样步骤

RDS 的典型实施步骤可归纳为以下三步:

  1. 选取种子参与者(seed respondents)研究者通过社交网络、实地访问或社区组织等渠道,找到符合目标群体特征的“种子个体”。种子的数量不宜过多,一般控制在 2 至 32 之间为宜(Hipp, Kohler, & Leumann, 2019),以避免样本结构过于分散或局部集中。

  2. 发放引导券并设置双重激励机制每位种子在完成问卷后,将获得若干张引导券(coupon),用于邀请其社交圈中其他符合条件的个体参与研究。新参与者完成问卷后也会获得等量的引导券,以持续推动样本扩展。 RDS 引入了 双重激励机制:一方面,完成调查可获得固定报酬;另一方面,每成功推荐一位新样本还可获得额外奖励。这种设计既激励了参与,又控制了过度活跃个体对样本结构的干扰(over-volunteerism)。 限制每人引导券数量的目的,在于 防止某些群体增长过快,保持不同群体间的“招募节奏”大致一致(growth speed),从而提高样本的代表性。

  3. 监测样本结构,适时终止抽样抽样将持续进行,直到达到预期样本容量,或主要变量(如年龄、性别、患病状态等)的分布不再随波次变化,即达到所谓的“收敛状态(equilibrium)”,即可终止招募。

RDS 的链式招募结构可视为一个向外辐射的社交网络,下图展示了一个典型的招募过程,起始于少量种子,逐步扩展出多层样本:

Source: Johnston LG, Sabin K. Sampling hard-to-reach populations with respondent driven sampling. Methodological Innovations Online, 2010, 5(2): 38–48.

此外,许多 RDS 实证研究表明,当样本量达到 300–500 之间时,关键变量往往已趋于稳定。下图展示了若干研究中 RDS 样本量的分布情况:

Source: Johnston LG, Sabin K. Sampling hard-to-reach populations with respondent driven sampling. Methodological Innovations Online, 2010, 5(2): 38–48.

1.4 RDS 抽样优势

相较于传统的随机抽样方法,RDS 在实际调查中展现出显著优势:

  • 对“隐性群体”极具穿透力,有效识别边缘个体
  • 招募效率高、操作灵活,整体上更加 节省成本(cost-effective)
  • 由于是“熟人推荐”,样本多能精准对接目标人群,提高 覆盖率与匹配度

正因如此,RDS 日益成为流行病学、社会学、公共政策等领域研究“难以接触人群”的主流方法。

1.5 RDS 相关词汇

RDS 文献中常出现的词汇总结如下:

词汇
解释
seed
上文所述的种子选手,第一波被研究者接触的人。种子选手本身的调查信息并不重要。毕竟很多研究者最后都选择删除种子选手的问卷内容,因为种子选手本身并不是随机选择的
degree
个人汇报的社交网络大小,即 network size 。问卷中,最重要的一个变量(一定要收集!)就是参与者认识的符合条件的参与者一共有几个人。举个例子,如果研究群体是北京市男同性恋,那么这个问题就会是“你还认识多少个北京市的男同性恋?”
coupon
发出去的券,用于来招募更多的参与者。Hipp, L., Kohler, U., & Leumann, S. (2019) 的文章介绍了一些设计这类 coupon 的要点。
homophily
同质性,用于测量倾向于组内招募 (ingroup recruitment) 的程度

1.6 RDS 与传统滚雪球抽样的不同

以下内容总结自 Heckathorn & Cameron (2017):

特征
RDS
滚雪球抽样
招募激励
双重奖励(调查完成 + 推荐成功)
无激励
引导券控制
每人限定数量(如 3 张)
招募无限制
报告网络度数
强制收集(用于加权)
不收集
招募链追踪
必须精确记录“谁招募了谁”
可不追踪
招募链长度要求
要求较深(如 6-8 波)以达收敛
无要求


2.  RDS 数据

2.1 RDS 数据结构

下表呈现了典型的 RDS 数据结构。它一般包括如下几个部分:

  1. 参与者编号 (Respondent ID)
  2. 社交网络大小 (degree size)
  3. 自己收到的 coupon 编号 (own coupon number)
  4. 自己成功发出去的 coupon 编号 (Coupon 1, Coupon 2, Coupon 3)
  5. 其他变量 (variables of interest)。
Respondent ID
Degree
Own Coupon
Coupon 1
Coupon 2
Coupon 3
Gender
1
10
.
1001
1002
1003
Female
2
20
.
1004
1005
.
Female
3
56
1001
1007
1008
.
Male

从上表可以看出,研究者为每位参与者分配了三张 coupon。大多数参与者未能全部发出这些 coupon,因此“自己成功发出去的 coupon 编号”一栏常见缺失值。而“own coupon”项若为缺失,说明该参与者为最初的种子选手,即未通过他人招募获得 coupon。部分学者在分析时会剔除种子选手的数据,以减少因非随机选取带来的样本偏差。

例如,1 号种子选手成功发出了所有 coupon(编号为 1001、1002、1003),据此可知 3 号、4 号和 5 号参与者均由 1 号种子招募。通过“own coupon”与“coupon”编号的对应关系,可以追溯每位参与者的招募路径及其最初的种子来源,从而还原整个样本的网络结构。

换句话说,若某位参与者的 owncoupon=1001,则说明其是由发出 coupon=1001 的参与者招募而来。利用这些编号的映射关系,可以系统地还原每位受访者的招募链路和网络结构。

2.2 RDS 数据处理相关软件

常用的 RDS 处理软件有 Stata, R, RDS Analyst, 和 RDSAT。其中 RDS Analyst 和 RDSAT 是两个单独运行的软件,专门为了处理 RDS 数据而设计。 RDS Analyst 依托于 R 的运行环境,而 RDSAT 则构建于 Java 的运行环境上。两个软件都是免费的。下方为下载地址:

软件
作者
链接
RDSAT
Douglas Heckathorn
软件及说明书下载网址:
http://www.respondentdrivensampling.org/
RDS Analyst
Krista Gile
软件下载网址:
http://www.stat.ucla.edu/~handcock/hpmrg/software/RDSAnalystSetup.0.71.exe
软件说明书:
https://sites.google.com/site/lsjohnstonglobal/respondent-driven-sampling/respondent-driven-sampling

目前来讲,大部分学者都选择使用 RDS Analyst。RDS Analyst 不仅研究 RDS 数据最先进的软件,而且上手非常容易,只需要点几个键就可以在软件内部跑模型。Stata 本身也有 RDS 相关的命令,分别为 rds_network 和 rds (Schonlau & Liebau, 2012)。这两个命令由 Matthias Schonlau 和 Elisabeth Liebau 两位学者于 2012 年开发成功。可惜的是,没过多久,Heckathorn 开发的软件 RDSAT 已经更新了里面 estimator 的计算方法,而 rds_network 和 rds 中自带的 estimator 还是最原始的算法。因此,大部分学者还是依赖 RDSAT 或者 RDS Analyst 连个软件来生成参与者的个人权重。而这两个 Stata 命令的使用就没有那么广泛了。不过我还是把两个 Stata 命令的语法复制如下给大家参考。文中最后也会有一个 Stata 实操展示。

/*rds_network 可以用于对 rds 网络进行初步的分析,包括生成 seed 编号、招募者编号等等,使得数据可以进一步用于 rds 分析*/
rds_network varname, id(varname) coupon(str) ncoupon(#) degree(varname) [rds_network_options]

/*rds 有两个功能,一是看样本有没有达到 population equilibrium,二是生成参与者的个人权重*/
rds varname [if] [in], id(varname) degree(varname) recruiter_id(varname) recruiter_var(varname) [rds_options]

2.3 RDS 数据问题

RDS 数据不能直接用简单回归分析,原因在于其抽样方式并非随机,容易引发两个主要问题:

  1. 各参与者的入样概率存在显著差异;
  2. 数据可能存在聚类(data clustering)导致的标准误问题。

首先,由于每个人的社交网络规模不同,网络较大者被招募的概率更高,样本中这类人可能被过度代表。因此,需根据参与者自报的社交网络大小调整其在模型中的权重——网络越大,权重越低,网络越小,权重越高,以使样本结构更贴近总体。

其次,受访者往往倾向于招募与自己相似的人(如女性更倾向于招募女性),这会导致数据中存在较强的相关性(高关联性)。如何处理这种聚类带来的估计偏差,也是分析 RDS 数据时必须关注的问题。


3.  RDS 适用模型

3.1 RDS 数据处理方法

目前,针对 RDS 数据的处理方法尚未完全成熟。针对前述的两个主要问题,学者们主要采取了两种应对策略:一是针对不同的入样概率,建议根据每位参与者自报的社交网络规模,计算并赋予个体化权重;二是针对聚类导致的标准误问题,建议构建数据的相关矩阵(correlation structure),并利用该矩阵对参数估计进行调整。

3.1.1 生成参与者个人权重

参与者的个人权重(individualized weight)由研究者根据所选的估计方法(estimator)计算得出。目前常用的 estimator 包括 RDSI、RDSII、RDS_SS、RDS_MOD 等。其中,RDSII 应用最为广泛。与 RDSI 相比,RDSII 能为每位参与者生成唯一的权重,而 RDSI 的权重会因分析变量不同而变化,导致同一参与者可能有多个权重。RDS_SS 则要求输入群体总规模(population size),但在实际研究中,这一数字往往难以准确获得,因为 RDS 方法本身就是为应对对总体信息有限的情形而设计的(Heckathorn & Cameron, 2017)。下表总结了不同软件对各类 RDS estimator 的支持情况。关于 estimator 的详细区别,可参考 World Health Organization (2013). _Introduction to HIV/AIDS and sexually transmitted infection surveillance: Module 4: Introduction to respondent-driven sampling_。


Stata
RDSATRDS - A
nalyst
RDS I
 (Heckathorn, 2002)
YES


RDS I
 (Salganik & Heckathorn, 2004)

YES
YES
RDS I
 (Heckathorn, 2007) (dual-component)

YES
YES
RDS II
 (Volz & Heckathorn, 2008)


YES
RDS-SS
 (Gile, 2011)


YES
RDS-MA


YES

RDS estimator 主要依据马尔可夫链 (Markov chain) 假设,及每个参与者都是随机的从自己认识的人里面招募参与者,因此每个参与者仅仅与招募自己的人有联系,和数据中其他任何人都没有联系。

比如说,上图中 1 号种子招募了 2 号、3 号、及 4 号参与者。2 号参与者又继续招募了 5 号参与者。根据马尔可夫链假设,5 号参与者的特点(例如性别),只和 2 号参与者有关,和 1 号种子无关。

3.1.2 定义数据关联矩阵

RDS 参与者之间具体是以怎样一个结构关联的目前并没有定论。如果根据马尔可夫链假设的话,其实数据本来根本就不应该是那么关联的。但实际情况是,通过社交网络收集到的信息确实可能存在聚类的情况。下面是一个学者常用的关联结构模拟图。

把上图的关联结构放入图表中便得到如下结果:


ABCDEFGHI
A
B
C
D
E
F
G
H
I

目前,大多数统计软件并未内置如上图所示的复杂关联结构。为简化分析流程并提升模型收敛性,不少研究者会将关联结构设定为 AR[1]。还有学者采用 svy 功能处理数据聚类问题,例如将 seed 作为 strata,将招募者编号(recruiter ID)作为主抽样单元(PSU)。RDS Analyst 也集成了 svy 功能,便于快速建模和结果计算。当然,若能手动编写自定义的关联矩阵,将更贴合实际网络结构。目前支持用户自定义关联矩阵的统计软件主要有 RSAS 和 S-plus,而 Stata 目前尚不支持此功能。关于如何在 R 中编辑关联结构,可参考此链接:[http://www-1.ms.ut.ee/tartu07/presentations/mols.ppt]。

为提高分析的稳健性,许多研究者会同时采用两种方法:既为参与者生成个体权重,又对模型的关联结构进行调整。


4.  Stata 实操

我在这里用一套和艾滋病有关的模拟数据,来展示一下如何用 Stata 的 rds 和  rds_network 命令。我会先展示如何用 rds_network 生成必要的 network 变量,然后再用 rds 来看数据是否达到 population equilibrium 及怎样生成个人权重。

*-数据加载

use "https://github.com/lianxhcn/data/raw/refs/heads/main/RDS_sample_data_SunBY.dta", clear

sum _all

  Variable |  Obs       Mean    Std. Dev.    Min     Max
--------+--------------------------------------------
        id |  204   1112.461    66.84246    1002    1239
   network |  204   4.779412    3.653107       1      30
 owncoupon |  204   1112.461    66.84246    1002    1239
      ref1 |   71    1116.69    70.18946    1002    1235
      ref2 |   50    1129.92    68.63237    1004    1239
--------+--------------------------------------------
      ref3 |   53   1112.792    60.08435    1005    1219
    gender |  204   1.578431     .495025       1       2
       age |  204   29.28431    8.944688      18      54
 ethnicity |  204   1.911765    .4349948       1       3
       hiv |  204   1.063725    .2448642       1       2
--------+--------------------------------------------
       (e) |  204          1           0       1       1


/*id 就是 respondent 自己的 id,network 是每个respondent 自己汇报的社交网络大小,owncoupon 就是每个respondent 自己受到的coupon code,ref1 - ref3是每个 respondent 发出的 coupon code*/


list id network owncoupon ref* in f/10   /*可以看出 id 和 owncoupon的值是一样的。也可以看出 id = 1003 招募了 id = 1002*/ 

     +------------------------------------------------+
     |   id   network   owncou~n   ref1   ref2   ref3 |
     |------------------------------------------------|
  1. | 1002        15       1002   1014      .      . |
  2. | 1003        20       1003   1002   1004   1005 |
  3. | 1004         4       1004      .      .      . |
  4. | 1005         4       1005      .      .      . |
  5. | 1006        10       1006   1008   1070   1069 |
     |------------------------------------------------|
  6. | 1007        10       1007   1006   1009      . |
  7. | 1008        15       1008   1207      .      . |
  8. | 1009         6       1009   1010   1011   1029 |
  9. | 1010         3       1010      .      .      . |
 1.  | 1011         3       1011      .      .      . |
     +------------------------------------------------+

*rds_network*   /*用 rds_network 生成必要的社交网络变量*/
rds_network gender,  ///
    id(id) coupon(ref) ncoupon(3) ///
    degree(network) ancestor(seed)  ///
    depth(wave)  ///
    recruiter_id(recruiter_id) ///
    recruiter_var(recruiter_var)

Number of categories of (gender): 2  /*这次选择的分析变量是 gender */
Number of seeds= 30                  /*数据中一共由 30 个 seed 发展而来*/
Greatest chain length= 8             /*最长的招募链达到了8个wave*/

        Seed       MaxDepth
     +---------------------+
  9. |     1003          8 |  /*1003 seed 发展的招募链成功达到了 8 层*/
 47. |     1007          3 |
 52. |     1013          0 |
 53. |     1015          0 |
 56. |     1018          2 |
     |---------------------|
 61. |     1019          5 |
 72. |     1020          2 |
 80. |     1023          5 |
 95. |     1024          4 |
 99. |     1025          1 |
     |---------------------|
100. |     1040          0 |
101. |     1055          1 |
103. |     1057          0 |
109. |     1066          3 |
115. |     1072          1 |
     |---------------------|
117. |     1075          3 |
124. |     1077          0 |
125. |     1079          2 |
129. |     1080          2 |
135. |     1082          0 |
     |---------------------|
137. |     1083          2 |
139. |     1093          0 |
140. |     1107          0 |
156. |     1117          5 |
172. |     1137          0 |
     |---------------------|
177. |     1140          3 |
183. |     1154          1 |
185. |     1158          4 |
199. |     1163          4 |
203. |     1181          1 |
     +---------------------+


list id network owncoupon ref* seed wave recruiter_id recruiter_var in f/10  /*看一看新生成的变量*/

     +------------------------------------------------------------------------------------+
     |   id   network   owncou~n   ref1   ref2   ref3   seed   wave   recrui~d   recrui~r |
     |------------------------------------------------------------------------------------|
  1. | 1002        15       1002   1014      .      .   1003      1       1003          1 |
  2. | 1003        20       1003   1002   1004   1005   1003      0          .          . |
  3. | 1004         4       1004      .      .      .   1003      1       1003          1 |
  4. | 1005         4       1005      .      .      .   1003      1       1003          1 |
  5. | 1006        10       1006   1008   1070   1069   1007      1       1007          2 |
     |------------------------------------------------------------------------------------|
  6. | 1007        10       1007   1006   1009      .   1007      0          .          . |
  7. | 1008        15       1008   1207      .      .   1007      2       1006          2 |
  8. | 1009         6       1009   1010   1011   1029   1007      1       1007          2 |
  9. | 1010         3       1010      .      .      .   1007      2       1009          2 |
 10. | 1011         3       1011      .      .      .   1007      2       1009          2 |
     +------------------------------------------------------------------------------------+

我们之前选择的分析变量为 gender,生成的 recruiter_var (最右列) 就是对应的 recruiter 的性别。我们可以看到变量多了 seed, wave, recruiter_id, recruiter_var, 这些可以帮助我们之后的分析。

rds gender, id(id) degree(network) recruiter_id(recruiter_id) recruiter_var(recruiter_var) detail
/*detail 这个选项可以看出,当以 gender 作为判定标准时候,数据是否达到矩阵收敛所需的最浅 depth*/

Number of categories of (gender): 2
Computing how fast transition matrix converges.
Convergence Tolerance= .02
Iteration 0
[symmetric]
       1   2
    +---------+
  1 |  1      |
  2 |  0   1  |
    +---------+
Iteration 1
                 1             2
    +-----------------------------+
  1 |  .5465116279   .2840909091  |
  2 |  .4534883721   .7159090909  |
    +-----------------------------+
Iteration 2
                 1             2
    +-----------------------------+
  1 |  .4275068833   .3586422497  |
  2 |  .5724931167   .6413577503  |
    +-----------------------------+
Iteration 3
                 1             2
    +-----------------------------+
  1 |  .3962775727    .378206066  |
  2 |  .6037224273    .621793934  |
    +-----------------------------+
Iteration 4
                 1             2
    +-----------------------------+
  1 |  .3880823546   .3833400168  |
  2 |  .6119176454   .6166599832  |
    +-----------------------------+
Required referral length until convergence: 4      /*至少要有4个wave招募链,gender才可以收敛。我们已经达到了*/

Method to compute Av. Network Size Method = multiplicity
/*用multiplicity这个办法去计划每个gender中的不同的average network size*/

Observation matrix
        Group1  Group2
Group1      47      39
Group2      25      63
/*Gender Group1是男,Group2是女。数据里面,男招男有47,男招女有39,女招男有25,女招女有63*/


/*下面的transition matrix 是根据上面的 observation matrix 计算出来的。比如说 47/(47+39) = 0.5465。*/

Transition Matrix (Before Smoothing)
           Group1     Group2
Group1  .54651163  .45348837
Group2  .28409091  .71590909

Demographically adjusted matrix
           Group1     Group2
Group1  36.626657  30.392332
Group2  30.392332  76.588678

Data-Smoothed Recruitments
           Group1     Group2
Group1  36.626657  30.392332
Group2  30.392332  76.588678

/*Demographically adjusted matrix 及 data-smoothed recruitment 解决了男女招募速度不同,以及不同人的 network 大小不同而导致的入样概率偏差问题*/

Transition Matrix
           Group1     Group2
Group1  .54651163  .45348837
Group2  .28409091  .71590909

                         Group1     Group2
          Categories          1          2
          SampleSize         86        118
            Recruits         72        102
               Seeds         14         16
    SampleProportion  .42156863  .57843137   /*样本中的男女比*/
         Equilibrium  .38516661  .61483339
       AverageDegree  4.1666667  4.5588235
  MultiplicityDegree  3.1964484  3.4338846
           Homophily  .24131809  .29377721   /*男性的homophily比女性低,说明女性更容易产生ingroup recruitment*/
              Weight  .95421738   1.033367   /*population weight*/
RecruitmentComponent  .91365102  1.0629323
     DegreeComponent  1.0444003  .97218514
PopulationProportion  .40226811  .59773189   /*推算出来的 population 中的男女比*/
  VolzHeckathornProp  .43127408  .56872592


rds hiv, id(id) degree(network) recruiter_id(recruiter_id) recruiter_var(recruiter_var) wgt(hiv_w)
/*当我们用是否有艾滋病作为因变量的时候,我们生成个人权重的方法 wgt(hiv_w) */

Number of categories of (hiv): 2
Required referral length until convergence: 3      /*已达到最低招募链要求标准*/
Method to compute Av. Network Size Method = multiplicity

list network hiv_w hiv in f/10 /*看一眼新生成的个人权重*/
/*这个权重由两部分决定,一个是个人的network大小,一个是所代表的group的average network大小。这里的group就是HIV阳性 vs HIV阴性。

     +---------------------------+
     | network       hiv_w   hiv |
     |---------------------------|
  1. |      15   .23155096     1 |
  2. |      20   .09551894     2 |
  3. |       4   .86831608     1 |    /*果然,network比较小的人赋予的权重会相对高一些*/
  4. |       4   .86831608     1 |
  5. |      10   .34732643     1 |
     |---------------------------|
  6. |      10   .34732643     1 |
  7. |      15   .23155096     1 |
  8. |       6   .57887739     1 |
  9. |       3   1.1577548     1 |
 10. |       3   1.1577548     1 |
     +---------------------------+


5.  R 和 Python 实现

5.1 R 实现

RDS 在 R 中的实现主要依赖于 RSiena 包和 rds 包。以下是一个简单的 R 实现示例:

library(RSiena)
library(rds)    
# 假设数据已加载到 data_frame 中
data_frame "rds_data.csv")
# 生成 RDS 网络
rds_network "id", degree = "network",
                   recruiter_id = "recruiter_id"
                   recruiter_var = "recruiter_var"
                   coupon = c("ref1""ref2""ref3"))
# 计算参与者权重
rds_weights "hiv")
# 查看权重
print(rds_weights)

5.2 Python 实现

在 Python 中,RDS 的实现可以使用 networkx 和 pandas 库。以下是一个简单的 Python 实现示例:

import pandas as pd
import networkx as  nx
# 假设数据已加载到 data_frame 中
data_frame = pd.read_csv("rds_data.csv")
# 创建 RDS 网络
G = nx.DiGraph()
for index, row in data_frame.iterrows():
    G.add_node(row['id'], network=row['network'], hiv=row['hiv'])
    if pd.notna(row['ref1']):
        G.add_edge(row['id'], row['ref1'])
    if pd.notna(row['ref2']):
        G.add_edge(row['id'], row['ref2'])
    if pd.notna(row['ref3']):
        G.add_edge(row['id'], row['ref3'])
# 计算参与者权重
weights = {}
for node in G.nodes(data=True):
    weights[node[0]] = 1 / G.in_degree(node[0])
# 查看权重
print(weights)

好的,以下是 Section 4 小结 与 Section 5 参考文献,作为本讲义的最后部分。整体风格与前文保持一致,学术而清晰,适合直接发布或导出。


6.  小结

受访者驱动抽样(Respondent Driven Sampling, RDS)是一种设计巧妙、执行灵活的非概率抽样方法,特别适用于研究“隐藏群体”或“难以接触人群”。与传统的滚雪球抽样相比,RDS 通过引入:

  • 双重激励机制(参与 + 招募)、
  • 有限引导券制度(控制传播速度)、
  • 网络度数信息收集(实现概率估计),

在方法论上实现了从“便利样本”到“近似概率样本”的跃迁。

在数据分析方面,RDS 数据必须处理两个核心挑战:

  • 入样概率不同:通过个体网络度数进行加权估计,常用方法为 Volz-Heckathorn 加权(RDS-II);
  • 样本间依赖性强:需构造合理的相关结构或使用自助法(bootstrap)进行置信区间构建。

目前主流分析工具包括:

  • Stata:适合教学演示,提供 rds 与 rdsnetwork 命令;
  • R + RDS Analyst:功能强大,支持多种估计器,适合实务应用;
  • Python:适合自定义建模与流程自动化,当前尚无标准包。

在实际应用中,研究者应特别注意:

  • 招募结构是否达到了收敛要求
  • 网络度数变量是否真实可信;
  • 是否适当调整了估计中的聚类偏误。

RDS 是一种“结构性强但极具弹性”的调查工具,只要理解其方法论核心,完全可以在 Stata、R 或 Python 中实现高质量的实证分析。


7.  参考文献

  • Beckett, M., Firestone, M. A., McKnight, C. D., Smylie, J., & Rotondi, M. A. (2018). A cross-sectional analysis of the relationship between diabetes and health access barriers in an urban First Nations population in Canada. BMJ open, 8(1), e018272.
  • Cowan, F. M., Mtetwa, S., Davey, C., Fearon, E., Dirawo, J., Wong-Gruenwald, R., . . . Busza, J. (2013). Engagement with HIV prevention treatment and care among female sex workers in Zimbabwe: a respondent driven sampling survey. PLoS ONE, 8(10), e77080.
  • Decker, M. R., Marshall, B. D., Emerson, M., Kalamar, A., Covarrubias, L., Astone, N., . . . Delany-Moretlwe, S. (2014). Respondent-driven sampling for an adolescent health study in vulnerable urban settings: a multi-country study. Journal of Adolescent Health, 55(6), S6-S12.
  • Gile, K. J. (2011). Improved inference for respondent-driven sampling data with application to HIV prevalence estimation. Journal of the American Statistical Association, 106(493), 135–146.
  • Gile, K. J., & Handcock, M. S. (2015). Network model-assisted inference from respondent-driven sampling data. Journal of the Royal Statistical Society: Series A, 178(3), 619–639.
  • Heckathorn, D. D. (1997). Respondent-driven sampling: a new approach to the study of hidden populations.  Social Problems, 44(2), 174–199.
  • Heckathorn, D. D. (2002). Respondent-driven sampling II: deriving valid population estimates from chain-referral samples of hidden populations. Social Problems, 49(1), 11–34.
  • Heckathorn, D. D. (2007). Extensions of respondent-driven sampling: analyzing continuous variables and controlling for differential recruitment. Sociological Methodology, 37(1), 151–208.
  • Heckathorn, D. D., & Cameron, C. J. (2017). Network sampling: From snowball and multiplicity to respondent-driven sampling. Annual Review of Sociology, 43, 101–119.
  • Heckathorn, D. D., & Jeffri, J. (2001). Finding the beat: Using respondent-driven sampling to study jazz musicians. Poetics, 28(4), 307–329.
  • Hipp, L., Kohler, U., & Leumann, S. (2019). How to Implement Respondent-Driven Sampling in Practice: Insights from Surveying 24-Hour Migrant Home Care Workers. Survey Methods: Insights from the Field, 1–13.
  • Kniejska, P. (2016). Migrant Care Workers aus Polen in der häuslichen Pflege. Springer.
  • Kuhns, L. M., Kwon, S., Ryan, D. T., Garofalo, R., Phillips, G., & Mustanski, B. S. (2015). Evaluation of respondent-driven sampling in a study of urban young men who have sex with men. Journal of Urban Health, 92(1), 151–167.
  • Martins, T. A., Kerr, L. R. F., Macena, R. H., Mota, R. S., Carneiro, K. L., Gondim, R. C., & Kendall, C. (2013). Travestis, an unexplored population at risk of HIV in a large metropolis of northeast Brazil: a respondent-driven sampling survey. AIDS Care, 25(5), 606–612.
  • Matos, M. A. D., França, D. D. D. S., Carneiro, M. A. D. S., Martins, R. M. B., Kerr, L. R. F. S., Caetano, K. A. A., . . . Matos, M. A. D. D. (2017). Viral hepatitis in female sex workers using the Respondent-Driven Sampling. Revista de Saúde Pública, 51, 65.
  • Organization, W. H. (2013). Introduction to HIV/AIDS and sexually transmitted infection surveillance: Module 4: Introduction to respondent-driven sampling. WHO.
  • Salganik, M. J., & Heckathorn, D. D. (2004). Sampling and estimation in hidden populations using respondent‐driven sampling. Sociological Methodology, 34(1), 193–240.
  • Schonlau, M., & Liebau, E. (2012). Respondent-driven sampling. The Stata Journal, 12(1), 72–93.
  • Volz, E., & Heckathorn, D. D. (2008). Probability based estimation theory for respondent driven sampling. Journal of Official Statistics, 24(1), 79.
  • 刘林平, 范长煜, & 王娅. (2015). 被访者驱动抽样在农民工调查中的应用: 实践与评估. 社会学研究(2), 149–173.
  • 梁玉成. (2013). 在广州的非洲裔移民行为的因果机制. 社会学研究(1).



8.  相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 抽样 社会网络, nocat md
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 刘潍嘉, 2023, 论文推介:中国经济学家合作模式的社会网络分析, 连享会 No.1312.
  • 吴雄, 童天天, 2020, Stata:Bootstrap-自抽样-自举法, 连享会 No.43.
  • 周瑾, 2024, 论文推介:包含343位作者的JF论文:NSE-非标准误差, 连享会 No.1510.
  • 李烨阳, 2023, Stata:自己动手做组间系数差异检验-bootstrap-bdiff, 连享会 No.1286.
  • 杨凡佳, 2024, Stata+R:你了解什么是抽样吗?Sampling, 连享会 No.1359.
  • 杨继超, 2021, Stata:社会网络分析, 连享会 No.523.
  • 滕泽鹏, 2023, Stata:随机抽样命令介绍-gsample, 连享会 No.1140.
  • 连享会, 2025, 社会网络分析:从入门到精通, 连享会 No.1601.
  • 邓铨雄, 2025, UCINET:社会网络分析利器介绍, 连享会 No.1599.
  • 郑晓雪, 2022, R语言绘制社会网络图, 连享会 No.953.
  • 郑裕璇, 2022, Stata:手动实现置换检验(permutation)和自抽样(bootstrap), 连享会 No.1091.
  • 雷诺, 2024, 控制函数法:Bootstrap标准误的获取, 连享会 No.1328.
  • 霍崇德, 2022, Stata:社会网络分析命令-nwcommands, 连享会 No.847.


🍓 课程推荐:连享会:2025社会网络分析·线上
嘉宾:杨张博,西安交通大学
时间:2025 年 7 月 30-31 日
咨询:王老师 18903405450(微信)


连享会微信小店上线啦!

Note:扫一扫进入“连享会微信小店”,你想学的课程在这里······

New! Stata 搜索神器:lianxh 和 songblGIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all


🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下:连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184137
 
46 次点击