滚雪球抽样如何用R实现?

COS论坛 | 统计之都 COS论坛 | 统计之都 软件应用 S-Plus & R语言 滚雪球抽样如何用R实现?

该主题包含 5 条回复,3个帖子,最后由  WulaWula1 天, 23 小时 之前 更新。

查看 6 个帖子 - 1 到 6(总计 6 个)
  • 作者
    帖子
  • 1 楼

    WulaWula
    Participant

    翻了一下sampling这个包,发现里面没有涉及到snowball sampling。也google过并没有相应的代码和函数。自己写出来的运行实在是太太太慢了。这个抽样已经很成熟了,可是R小白(没错就是我)死活也找不到滚雪球抽样的R函数啊~

    2 楼

    WulaWula
    Participant

    这里具体描述一下问题:我拥有一个邻接矩阵。其中1表示两者有联系,0表示没有联系。(因而邻接矩阵对角线全为1)现在倘使我有1000*1000的矩阵。(所以有1000个相互关联的用户)我需要运用滚雪球方法从中抽出100个用户。实施方法如下:1.随机抽取一个用户N1;2.搜寻与这用户有关联的所有用户(即元素为1),抽出。N2;3.从上一步抽取的用户中,搜寻与这些用户有关联的所有用户。重复以上过程直至满足我规定的样本量。若超出规定的样本量,则在最后一次抽取时采用简单随机不放回的方式丢掉最后的一些用户。
    我其实自己写了这一函数,但运行速度很慢。心想这类问题应该有成熟的函数,所以求问。

    snow=function (x,size,...){
      mm=0
      ai=0
      n=size
      ii=sample(1:N,size=1) ##first i
      i=which(x[,ii]==1) ##back to the connected nodes  
      ai=unique(c(i,ii))         ##ind  
      while (mm<n){
        mm=length(ai)  ##sample size
        ii=i
        i=unique(unlist(apply(as.matrix(x[,ii]),2,which1,0)))
        ai=unique(c(i,ai))         ##ind
      }
      if (mm==n){
        ind=ai}
      else {
        ind=ai[sample(1:mm,n)]  ##??????????????????????
      }
      return(ind)
    }
    3 楼

    papillon
    Participant

    AS IS

    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)

    4 楼

    WulaWula
    Participant

    回复 3 楼papillon

    啊,谢谢你的回复,我会认真查看。我发现自己贴的代码有一些错误。现放一下更新。

    snow=function (x,n,...){
      mm=0
      ai=0
      ii=sample(1:N,size=1) ##first i 
      ai=ii
      x[ai,]=0  
      i=which(x[,ii]==1) ##back to the connected nodes 
      while (length(i)!=0){
        mm=length(c(ai,i))  ##sample size
         if (mm>=n){
          break
         }   
        ii=i  ##记录本次抽出点    
        ai=c(i,ai)         ##本次累积点 
        x[ai,]=0  ##使抽过的点不再被抽    
        i=unique(unlist(apply(as.matrix(x[,ii]),2,which1,0))) #下次抽出点
    
      }
     
      
      if (mm==n){
        ind=c(ai,i)} else if (mm>n) { 
        ind=c(sample(i,n-length(ai)),ai)  #从本次累积点中
        } 
      
      return(ind)
    }
    5 楼

    lemon1015
    Participant

    请问楼主用r实现了滚雪球抽样了吗?

    6 楼

    WulaWula
    Participant

    回复 5 楼lemon1015
    我用自己写的函数实现的,但是有点不友好。

查看 6 个帖子 - 1 到 6(总计 6 个)

您必须先登录才能回复该主题。