全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
2851 8
2022-04-28
统计之都上有人曾给出过一个关于滚雪球抽样的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












二维码

扫码加我 拉你入群

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

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

全部回复
2022-5-13 08:57:47
个人理解,单次抽样应有邻接关系,但多次抽样后,样本之间只有部分邻接关系。换句话说,从a找到b/c/d,从d找到e/f/g/,从g找到r/s/t,阶数越高,a与t认识的可能性越低。但从滚雪球抽样的初衷看,a,b,c……,t都在抽样范围内。
这几日事多,静不下来仔细看东西。
二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

2022-5-23 10:14:13
zhaomn200145 发表于 2022-5-23 10:08
我发现这个设置的初始矩阵并非严格意义上的邻接矩阵,中间的联系过多,不符合一般社交网络的要求。我准备换 ...
日有所得,不亦乐乎
二维码

扫码加我 拉你入群

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

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

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号似乎只是从其联系对象中随机选了几个(没有全部选择所有联系对象)。这是不符合滚雪球抽样的原则的。
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群