我想要实现的是从每组获得10%的样本(这是2个因素的组合 - 新近度和频率类别)。到目前为止,我已经考虑过包 sampling 和函数 strata()。这看起来很有希望,但我收到以下错误,很难理解错误信息,错误或如何解决这个问题。
这是我的代码:
> d[1:10,]
date id_email_op recency frequecy r_cat f_cat
1 29.8.2011 19393 294 1 A G
2 29.8.2011 19394 230 4 A D
3 29.8.2011 19395 238 12 A B
4 29.8.2011 19396 294 1 A G
5 29.8.2011 19397 223 9 A C
6 29.8.2011 19398 185 7 A C
7 29.8.2011 19399 273 2 A F
8 29.8.2011 19400 16 4 C D
9 29.8.2011 19401 294 1 A G
10 29.8.2011 19402 3 5 F C
> table(d$f_cat,d$r_cat)
A B C D E F
A 176 203 289 228 335 983
B 1044 966 1072 633 742 1398
C 6623 3606 3020 1339 1534 2509
D 4316 1790 1239 529 586 880
E 8431 2798 2005 767 817 1151
F 22140 5432 3937 1415 1361 1868
G 100373 18316 11872 3760 3453 4778
> as.vector(table(d$f_cat,d$r_cat))
[1] 176 1044 6623 4316 8431 22140 100373 203 966 3606 1790 2798 5432
[14] 18316 289 1072 3020 1239 2005 3937 11872 228 633 1339 529 767
[27] 1415 3760 335 742 1534 586 817 1361 3453 983 1398 2509 880
[40] 1151 1868 4778
> s <- strata(d,c("f_cat","r_cat"),size=as.vector(ceiling(0.1 * table(d$f_cat,d$r_cat))), method="srswor")
Error in strata(d, c("f_cat", "r_cat"), size = as.vector(table(d$f_cat, :
not enough obervations for the stratum 6
我真的看不出什么是阶层6.函数在后台检查的条件是什么?我不确定我是否正确设置了大小参数。是的,我已经检查了采样包的文档:)
谢谢大家和
答案 0 :(得分:1)
你总是可以自己做:
stratified <- NULL
for(x in 1:6) {
tmp1 <- sample(rownames(subset(d, r_cat == "A" & f_cat == LETTERS[x])),round(nrow(d[r_cat == "A")*0.1))
tmp2 <- sample(rownames(subset(d, r_cat == "B" & f_cat == LETTERS[x])),round(nrow(d[r_cat == "B")*0.1))
tmp3 <- sample(rownames(subset(d, r_cat == "C" & f_cat == LETTERS[x])),round(nrow(d[r_cat == "C")*0.1))
tmp4 <- sample(rownames(subset(d, r_cat == "D" & f_cat == LETTERS[x])),round(nrow(d[r_cat == "D")*0.1))
tmp5 <- sample(rownames(subset(d, r_cat == "E" & f_cat == LETTERS[x])),round(nrow(d[r_cat == "E")*0.1))
tmp6 <- sample(rownames(subset(d, r_cat == "F" & f_cat == LETTERS[x])),round(nrow(d[r_cat == "F")*0.1))
tmp7 <- sample(rownames(subset(d, r_cat == "G" & f_cat == LETTERS[x])),round(nrow(d[r_cat == "G")*0.1))
stratified <- c(stratified,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7)
}
然后......
d[stratified,]
将是您的分层样本。
答案 1 :(得分:0)
问题解决了! enter image description here
这句话“抽样框按州内的区域分层”帮助了我! 如果您使用多个变量进行分层,则在为参数“size=”分配不同大小时必须注意这些变量的“顺序”。 一个变量的层数越多,它的优先级就越高,因此,当您使用“table()”时,层数最多的应该排在列表的顶部。
我在 GENDER 中有 10 个组,在 age.group 中有 2 个组,所以这行不通
nnum <- as.vector(table(d.order$GENDER,d.order$age.group))
但这有效
d.order <- d.cut[order(d.cut$age.group,d.cut$GENDER),]
nnum <- as.vector(table(d.order$age.group, d.order$GENDER))
n <- round(.05*nnum)
testData <- strata(d.order, stratanames=c("age.group","GENDER"),size=n,method="srswor")
我强烈建议您在整个脚本中相应地更改变量的顺序,除了函数 table() 或 ceilling()。 它解决了我的问题,希望它也能解决你的问题。 :)