我确实在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中有这种方法吗?或者我应该进行简单的随机调查,然后设计一些群体替代算法,直到我得到平衡样本?,
答案 0 :(得分:1)
注意:您描述的内容听起来像是比例样本,而不是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)。
如果您想要更少的代码,也可以在一个简单的步骤中完成所有操作,并且不需要在单独的文件中查看样本设计。
/******** 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 )