楼主: zhaomn200145
2412 8

[学习分享] 一个关于滚雪球抽样的程序问题 [推广有奖]

  • 1关注
  • 17粉丝

贵宾

学科带头人

66%

还不是VIP/贵宾

-

威望
1
论坛币
581954 个
通用积分
85.7083
学术水平
128 点
热心指数
80 点
信用等级
43 点
经验
61378 点
帖子
1454
精华
1
在线时间
2542 小时
注册时间
2005-9-27
最后登录
2024-5-8

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
统计之都上有人曾给出过一个关于滚雪球抽样的R程序如下:
snow = function (x, size,...){
p = rep(0, ncol(x))
p[sample(dim(x)[1], 1)] = 1
while(sum(p) < size) {
new = colSums(matrix(x[p == 1,], ncol = ncol(x), byrow = T))
all = new + p > 0
if (sum(all) > size) {
pure = which(new - p == 1)
p[sample(pure, size - sum(p))] = 1
} else {
p = as.numeric(all)
}
}
which(p == 1)
}

x = matrix(runif(1000^2), 1000) > 0.7
x = x + t(x) > 0
x = as.numeric(x)
x = matrix(x, 1000)

snow(x, 100)

然后这个程序也确实可以跑出结果。但是我观察发现跑出来的结果好像有问题,通过这种抽样获得的某些对象在邻接矩阵中其实并没有关联,这实际上不符合滚雪球抽样的原则。不知哪位大佬能看一下是这个程序哪里有问题?亦或我理解有误?
原始链接如下:https://d.cosx.org/d/417780-417780/3












二维码

扫码加我 拉你入群

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

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

关键词:滚雪球抽样 滚雪球 function numeric matrix

沙发
llb_321 在职认证  发表于 2022-5-13 08:57:47 |只看作者 |坛友微信交流群
个人理解,单次抽样应有邻接关系,但多次抽样后,样本之间只有部分邻接关系。换句话说,从a找到b/c/d,从d找到e/f/g/,从g找到r/s/t,阶数越高,a与t认识的可能性越低。但从滚雪球抽样的初衷看,a,b,c……,t都在抽样范围内。
这几日事多,静不下来仔细看东西。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
zhaomn200145 + 5 + 5 + 1 观点有启发
cheetahfly + 10 热心帮助其他会员

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

使用道具

藤椅
zhaomn200145 发表于 2022-5-23 10:08:01 |只看作者 |坛友微信交流群
llb_321 发表于 2022-5-13 08:57
个人理解,单次抽样应有邻接关系,但多次抽样后,样本之间只有部分邻接关系。换句话说,从a找到b/c/d,从d ...
我发现这个设置的初始矩阵并非严格意义上的邻接矩阵,中间的联系过多,不符合一般社交网络的要求。我准备换一个BA矩阵重新测算一下。到时候再看结果是否有问题。谢谢大佬的指点!

使用道具

板凳
zhaomn200145 发表于 2022-5-23 10:08:19 |只看作者 |坛友微信交流群
我发现这个设置的初始矩阵并非严格意义上的邻接矩阵,中间的联系过多,不符合一般社交网络的要求。我准备换一个BA矩阵重新测算一下。到时候再看结果是否有问题。谢谢大佬的指点!

使用道具

报纸
llb_321 在职认证  发表于 2022-5-23 10:14:13 |只看作者 |坛友微信交流群
zhaomn200145 发表于 2022-5-23 10:08
我发现这个设置的初始矩阵并非严格意义上的邻接矩阵,中间的联系过多,不符合一般社交网络的要求。我准备换 ...
日有所得,不亦乐乎

使用道具

地板
zhaomn200145 发表于 2022-5-26 09:45:10 |只看作者 |坛友微信交流群
现在考虑换成BA邻接矩阵,写出滚雪球抽样程序:library(statnet)
library(igraph)
library(entropy)
library(network)
set.seed(12345)
# BA网络
num_nodes <- 30    #矩阵行数
cnames <- c(1: num_nodes)
G<-barabasi.game(n=num_nodes, m=2,directed=FALSE) #BA网络
adj.G <- as.matrix(get.adjacency(graph = G))         #转换为一般矩阵形式

# 抽样
size <- 8  #抽样规模
#滚雪球抽样程序
snow = function (x, size,...){
  p = rep(0, ncol(x))
  p[sample(dim(x)[1], 1)] = 1
  while(sum(p) < size) {
    new = colSums(matrix(x[p == 1,], ncol = ncol(x), byrow = T))
    all = new + p > 0
    if (sum(all) > size) {
      pure = which(new - p == 1)
      p[sample(pure, size - sum(p))] = 1
    } else {
      p = as.numeric(all)
    }
  }
  which(p == 1)
}
  
#滚雪球抽样 X2
x2 <-snow(adj.G, size)
x2
计算出的结果确实有问题。按照滚雪球抽样的思路,选择一个初始样本点后(这里抽样选择的是9号),下面一步应该是找到所有与9号有关联的个体(这里是1号和2号),然后再由1号和2号分别重复上述步骤。但是我这里计算出的结果明显不符合这一步骤。1号和2号似乎只是从其联系对象中随机选了几个(没有全部选择所有联系对象)。这是不符合滚雪球抽样的原则的。

使用道具

7
zhaomn200145 发表于 2022-5-26 09:48:56 |只看作者 |坛友微信交流群
另外还有一些问题:比如对于第二轮选出的样本1号和2号,抽样时先从哪个样本开始?还是同时开始抽样?抽样中如果有遇到重复的结果如何处理?在程序中的这一部分完全看不出来:while(sum(p) < size) {
    new = colSums(matrix(x[p == 1,], ncol = ncol(x), byrow = T))
    all = new + p > 0
    if (sum(all) > size) {
      pure = which(new - p == 1)
      p[sample(pure, size - sum(p))] = 1
    } else {
      p = as.numeric(all)
    }
  }
  which(p == 1)
当然也可能是我水平不济,没看懂。还请大神指点!
已有 1 人评分经验 论坛币 学术水平 信用等级 收起 理由
llb_321 + 12 + 12 + 1 + 1 鼓励积极发帖讨论

总评分: 经验 + 12  论坛币 + 12  学术水平 + 1  信用等级 + 1   查看全部评分

使用道具

8
llb_321 在职认证  发表于 2022-5-31 10:18:24 |只看作者 |坛友微信交流群

使用道具

9
zhaomn200145 发表于 2022-6-2 09:33:16 |只看作者 |坛友微信交流群
llb_321 发表于 2022-5-31 10:18
做了一个模拟,代码有点多,所以新开了一帖,敬请验证指导 https://bbs.pinggu.org/thread-11059825-1-1.ht ...
辛苦辛苦!一定要向大佬好好学习一下!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-9 05:46