3

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

频率分布:

  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

我想随机选择一组点,总共6000个点,比如样本中每种点的比例与总体中的比例相同。

在 R 或 SAS 中有这样的方法吗?还是我应该进行一个简单的随机调查,然后设计一些组替换算法,直到我得到平衡样本?

4

2 回答 2

1

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

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

      /******** 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”选项为您提供比例(即“偶数”)采样。SAS 中的“nosample”选项允许您生成概述样本设计的单独文件。然后,您在实际提取样本的第二阶段使用该设计。如果这太麻烦了,您可以放弃“nosample”选项,并像我们在下面更简单的示例中所做的那样直接提取您的样本。

请注意,在上面的第二步中,我们选择切换到“method = SYS”,而不是简单随机样本 (SRS)。SRS 也可以,但由于您可能有不同类型的客户响应,您可能希望以具有代表性的方式在客户范围内进行抽样。为此,您按客户在每个层中进行排序,并有意在客户范围内以均匀增量进行抽样;这是一个所谓的“系统”样本(SYS)。

示例 2:更简单

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

/******** 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 ;

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

于 2016-02-26T18:37:42.227 回答
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 )
于 2013-02-26T11:48:58.103 回答