使用R或SAS进行群集采样

时间:2013-02-26 11:29:35

标签: r sas survey

我确实在2k组中分配了155k点。有3种点(A + B + C =#点)

频率分布:

  Gr #clients    #A    #B    #C
-------------------------------
  01      100    80    10    10
  02       10     0     3     7

2000      400   300    80    20
--------------------------------
TOTAL: 155000 93000 46500 15500

我想选择随机点数组到总共6,000个点,例如样本中每种类型点的比例与人口中的比例相同。

在R或SAS中有这种方法吗?或者我应该进行简单的随机调查,然后设计一些群体替代算法,直到我得到平衡样本?,

2 个答案:

答案 0 :(得分:1)

示例1:这就是我如何在SAS中完成的。如果代码让您感到紧张,请使用下面示例2中的更简单的方法。

  

注意:您描述的内容听起来像是比例样本,而不是a   群集样本,这就是我在这里展示的内容。希望能满足你的需求   需要。

      /******** sort by strata *****/
      proc sort data=MED_pts_155k ; by GRoup A_B_C clients ; run ;

      /******** create sample design ***/
      proc surveyselect noprint  
      data= MED_pts_155k   
      method=srs  
      seed = 7  
      n = 6000  
      out = sample_design ;  
      strata GRoup A_B_C  /  
        alloc=prop NOSAMPLE
        allocmin = 2  ; /*** min of 2 per stratum.  ****/  
     run ;

    /******** pull sample **********/
    proc surveyselect noprint
      data= MED_pts_155k
      method=sys
      seed = &seed 
      n = sample_design
      out = MY_SAMPLE ;
     strata GRoup A_B_C  ; 
    run ;
  

" alloc = prop"选项为您提供比例(即'偶数')采样。 " nosample" SAS中的选项允许您生成概述样本设计的单独文件。然后,您可以在第二阶段使用该设计,您可以实际拉出样品。如果这太麻烦你可以放弃" nosample"选项,并直接拉我们的样品    正如我们在下面的简单示例中所做的那样。

     

请注意,在上面的第二步中,我们选择切换到' method = SYS'而不是简单的随机样本(SRS)。 SRS也可以工作,但由于客户可能有不同类型的响应,因此您可能希望以一种代表性的方式在客户端范围内进行采样。要做到这一点,您可以在客户的每个阶层内进行排序,并在客户范围内有意地采样甚至增量;这是一个被称为"系统的"样品(SYS)。

示例2:SIMPLER

如果您想要更少的代码,也可以在一个简单的步骤中完成所有操作,并且不需要在单独的文件中查看样本设计。

/******** sort by strata *****/
proc sort data=MED_pts_155k ; by GRoup A_B_C ; run ;

/******** pull sample **********/
proc surveyselect noprint
  data= MED_pts_155k
  method= SRS
  seed = 7 
  n = 6000
  out = MY_SAMPLE ;
 strata GRoup A_B_C  / 
    alloc=prop 
    allocmin = 2  ; 
run ;
  

在这两个例子中,我们假设你有两个分层变量:   '组'和第二个变量' A_B_C'其中包含a,b的值。   或c。希望有所帮助。 SAS也可以进行整群抽样,但如上所述,我在这里说明了一个比例样本,因为这似乎是你所需要的。集群抽样需要更多的空间来描述。

答案 1 :(得分:0)

我不明白你的假数据,所以我会自己制作。

我假设您构建自己独特的群组。我刚刚使用数字1:2000来执行此操作,但您可以在任何组类型上运行此代码..

# let's make some fake data with 155k points distributed in 2k groups
x <- 
    data.frame(
        groupname = sample( x = 1:2000 , size = 155000 , replace = TRUE ) ,
        anothercol = 1 ,
        andanothercol = "hi"
    )

# look at your data frame `x`
head( x )
# so long as you've constructed a `groupname` variable in your data, it's easy

# calculate the proportion of each group in the total
groupwise.prob <- table( x$groupname ) / nrow( x )
# store that into a probability vector

# convert this to a data frame
prob.frame <- data.frame( groupwise.prob )

head( prob.frame )

# rename the `Var1` column to match your group name variable on `x`
names( prob.frame )[ 1 ] <- 'groupname'

# rename the `Freq` column to say what it is on `x`
names( prob.frame )[ 2 ] <- 'prob'

# merge these individual probabilities back onto your data frame
x <- merge( x , prob.frame , all.x = TRUE )

# now just use the sample function's prob= parameter off of that
# and scale down the size to what you want
recs.to.samp <-
    sample( 
        1:nrow( x ) , 
        size = 6000 , 
        replace = FALSE , 
        prob = x$prob 
    )

# and now here's your new sample, with proportions in tact
y <- x[ recs.to.samp , ]

head( y )