楼主: llb_321
3769 11

[程序分享] 【独家发布】滚雪球抽样的过程模拟 [推广有奖]

  • 3关注
  • 49粉丝

教授VIP

已卖:595份资源

学科带头人

9%

还不是VIP/贵宾

-

TA的文库  其他...

LATEX & R 模板和代码

威望
2
论坛币
28191 个
通用积分
1739.6743
学术水平
410 点
热心指数
421 点
信用等级
355 点
经验
2099 点
帖子
1410
精华
1
在线时间
1035 小时
注册时间
2010-6-18
最后登录
2023-8-18

初级热心勋章 初级信用勋章 中级热心勋章 中级信用勋章 初级学术勋章

楼主
llb_321 在职认证  发表于 2022-5-31 06:45:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币


滚雪球抽样(snowball sampling 或 snowballing)。

讨论:
实践中,样本受限于特定群体,覆盖面狭窄。
只有首轮抽样为随机抽样,而后续各轮抽样均为前一轮样本的关联推荐,因为非随机,所以严格意义上并非抽样。

虽然实践中,总体实际上很小且样本之间的关系未知,但我们假设有个足够大的总体,且样本之间的关系以权重描述,则这个总体可以作为模拟抽样的总体。需要说明的是,这个总体,仅为方便模拟抽样。
  1. library(dplyr)
  2. library(plot.matrix)
  3. library(igraph)

  4. #建立一个总体
  5. N <- 1000 #总体容量
  6. set.seed(2022)
  7. V <-
  8.   paste(
  9.     sample(LETTERS[-c(9, 15)], N, replace = T),
  10.     sample(letters[-c(9, 15)], N, replace = T),
  11.     round(10000 * runif(N, 1, 9), 0),
  12.     sep = ""
  13.   )#样本名称
  14. unique(V) #验证样本名唯一性

  15. #自定义函数,参数须大于20, 结果为对称的邻接矩阵,对角线元素为0
  16. #权重3、2、1、0,对应“至交”、“酒肉朋友”、“点头之交”和“无直接关系”
  17. #概率猜测的基础是一个人大概有1个至交,3个酒肉朋友,10个点头之交
  18. adjMFunc <- function (n) {
  19.   m <- diag(0, n)
  20.   m[lower.tri(m)] <-
  21.     sample(3:0,
  22.            length(m[lower.tri(m)]),
  23.            replace = T,
  24.            prob = c(1 / n, 3 / n, 10 / n, (n - 1 - 3 - 10) / n))
  25.   m[upper.tri(m)] <- m[lower.tri(m)]
  26.   m[upper.tri(m)] <- t(m)[upper.tri(m)]
  27.   m
  28. }
  29. #生成邻接矩阵,N须大于20
  30. adjM <- adjMFunc(N)
  31. #矩阵热图,只显示前50个对象
  32. plot(adjM[1:50, 1:50], breaks = seq(0, 4, 1),
  33.      col = colorRampPalette(c("white", "blue", "red")),
  34.      main = "", xlab = "", ylab = "")
  35. rownames(adjM) <- V
  36. colnames(adjM) <- V

  37. #自定义函数,矩阵转数据框,样本之间无直接关系的去除
  38. M2DFunc <- function (x) {
  39.   #x[upper.tri(x)]<-0 #此处取下三角则为单向关系
  40.   res <- data.frame(
  41.     from = rep(row.names(x), dim(x)[2]),
  42.     to = rep(colnames(x), each = dim(x)[1]),
  43.     weight = as.vector(x),
  44.     stringsAsFactors = F
  45.   )  #转数据框
  46.   res[res[, 3] != 0, ]
  47. }
  48. #邻接矩阵转数据框,这个作为后面抽样的总体关系描述更清楚些
  49. adjDf <- M2DFunc(adjM)
  50. #str(adjDf)#查看网络关系

  51. #绘制网络关系图,只用去除"无关系"的数据
  52. netG <- graph_from_data_frame(d = adjDf, directed = F)
  53. L1 <- layout.graphopt(netG)
  54. plot(netG, layout = L1, vertex.size = 5,
  55.      vertex.label.cex = 0.5, vertex.label.dist = 0.5,
  56.      edge.color = "tomato", edge.arrow.size = 0.05)
复制代码



community.PNG

  1. #首轮随机抽样
  2. n1 <- 2 #首轮抽样数
  3. snowbRes <- sample(V, n1) #抽样结果
  4. recom <- snowbRes

  5. #后续轮次推荐
  6. nm <- 5 #后续轮次数
  7. k = 1 #循环计数
  8. repeat {
  9.   selected <- NULL
  10.   for (i in 1:length(recom)) {
  11.     #推荐范围,去除已有抽样
  12.     temp <- adjDf %>%
  13.       filter((from == recom[i]) & !(to %in% snowbRes))
  14.     #在范围内选择权重靠前2位
  15.     selected <- c(selected,
  16.                   temp[which(rank(temp[, 3], ties.method = "first") > (dim(temp)[1] - 2)), 2])
  17.   }
  18.   recom <- setdiff(selected, snowbRes)
  19.   snowbRes <- c(snowbRes, recom)#添加至结果
  20.   if (k > nm)
  21.     break
  22.   k <- k + 1
  23. }

  24. #抽样结果的邻接矩阵
  25. resM <- adjM[snowbRes, snowbRes]
  26. plot(resM, breaks = seq(0, 4, 1),
  27.   col = colorRampPalette(c("white", "blue", "red")),
  28.   main = "", xlab = "", ylab = "")#矩阵热图
  29. #抽样结果的网络,直接用邻接矩阵生成,蓝色节点为首轮随机抽样,其余为后续推荐
  30. resG <- graph_from_adjacency_matrix(resM, mode = "undirected")
  31. resG <- resG %>%
  32.   set_vertex_attr("color", index = V(resG)[1:3], value = "blue") %>%
  33.   set_vertex_attr("color", index = V(resG)[-(1:3)], value = "red")
  34. L2 <- layout.graphopt(resG)
  35. plot(resG, layout = L2, vertex.size = 5,
  36.      vertex.label.cex = 0.6, vertex.label.dist = 0.3,
  37.      edge.color = "tomato")
复制代码



sbsamples.PNG partmatri.PNG
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:滚雪球抽样 滚雪球 snowball Sampling Library

回帖推荐

llb_321 发表于3楼  查看完整内容

这种滚雪球的模拟过程,也可以用于模拟群体中的传染病、信息的代际传播过程。

llb_321 发表于2楼  查看完整内容

补充说明: 1、仅为滚雪球的过程模拟 2、代码中虽然定义了总体中元素之间的关系,但请留意在实际过程中,这种关系对于我们来说是未知的 3、第一张图,是总体中元素的关系网络,是去除了“无关系”的关系之后的网络 4、第二张图,是滚雪球结果的各元素的关系网络,第三张图是矩阵的直观热图作为参考
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
zhaomn200145 + 5 + 5 + 5 精彩帖子
Sunknownay + 3 + 3 + 3 鼓励积极发帖讨论
cheetahfly + 30 精彩帖子

总评分: 论坛币 + 30  学术水平 + 8  热心指数 + 8  信用等级 + 8   查看全部评分

本帖被以下文库推荐

沙发
llb_321 在职认证  发表于 2022-5-31 10:57:30
补充说明:
1、仅为滚雪球的过程模拟
2、代码中虽然定义了总体中元素之间的关系,但请留意在实际过程中,这种关系对于我们来说是未知的
3、第一张图,是总体中元素的关系网络,是去除了“无关系”的关系之后的网络
4、第二张图,是滚雪球结果的各元素的关系网络,第三张图是矩阵的直观热图作为参考

藤椅
llb_321 在职认证  发表于 2022-6-1 10:08:21
这种滚雪球的模拟过程,也可以用于模拟群体中的传染病、信息的代际传播过程。

板凳
drunkfish69 发表于 2022-6-1 10:30:08
可不可以模拟做一个小区新冠传播?

报纸
llb_321 在职认证  发表于 2022-6-1 10:35:42
drunkfish69 发表于 2022-6-1 10:30
可不可以模拟做一个小区新冠传播?
第二部分代码稍微改一下,其实就是群体中的代际传播

地板
drunkfish69 发表于 2022-6-1 10:43:16
最主要没有传染病学的专业知识,各种参数不知道如何定义和获取,如能以此做个模拟和详细的建设过程就太好了

7
owenqi 在职认证  学生认证  发表于 2022-6-1 12:05:04
感谢大佬分享,明天下班以后学习一下。

8
llb_321 在职认证  发表于 2022-6-1 12:51:29
owenqi 发表于 2022-6-1 12:05
感谢大佬分享,明天下班以后学习一下。
请老师不吝指点

9
llb_321 在职认证  发表于 2022-6-1 12:58:38
drunkfish69 发表于 2022-6-1 10:43
最主要没有传染病学的专业知识,各种参数不知道如何定义和获取,如能以此做个模拟和详细的建设过程就太好了 ...
这种群体内代际传播,只是空间维度的,不需要太多参数,只要群体网络能够建立,调整代际传播概率,就能实现模拟,用以判断各代的传播范围。如果是流行病学应用,需要结合SIR或SEIR模型,这是时间维度的,判断群体内不同状态构成及演化,这种模型则需要传染概率、潜伏期、治疗期、死亡率、干预措施等具体参数。

10
zhaomn200145 发表于 2022-6-2 09:35:02
先好好学习一下!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-24 19:08