【发布时间】:2014-09-12 01:59:48
【问题描述】:
我想知道是否有人可以建议一种有效的方法来对列联表进行抽样,以使观察总数和列总数保持不变。
例如,在下表中,行是案例,列是观察,我想“打乱”观察,使得 (a) 观察总数为 54,(b) 总数变量(例如 A)中的观察值是 16 18,与 A 的原始列总数相同。
x<-matrix(c(
4,6,0,0,8,0,0,
1,1,1,1,4,0,0,
3,0,1,1,6,0,1,
2,1,0,0,1,0,0,
1,1,0,1,0,1,1,
2,0,0,2,1,2,0),
ncol=6,byrow=F)
colnames(x)<-c("A","B","C","D","E","F")
我看到了关于列联表采样的讨论,其中单元格频率是 sample(...) 调用的采样概率的来源。这不适用于我的目的,因为除其他原因外,列总数不等于原始列总数。
任何帮助将不胜感激, 帕特里克
编辑
如果这个问题没有简单的解决方案,也许有人可以帮助我解决我过于复杂(且失败)的尝试。我首先创建一个由每个变量的观察次数组成的向量,例如,
m <- matrix()
v <- matrix()
for (h in 1:cols) {
m <- rep(colnames(x)[h], sum(x[, h]))
v <- c(v, m)}
然后我对其进行采样以随机打乱观察结果,并将其绑定到等于案例数量的值样本
v<-sample(v,length(v))
p<-sample(seq(1:nrow(x)),length(v),T)
n<-as.data.frame(cbind(v,p))
t(table(n))
v
p A B C D E F
1 3 1 3 1 1 1
2 1 1 0 0 0 0
3 3 0 3 0 2 1
4 3 2 1 2 1 2
5 2 1 0 0 0 1
6 3 2 3 1 1 1
7 3 1 2 0 0 1
colSums(t(table(n)))
A B C D E F
18 8 12 4 5 7
这很有效,除非样本 p 未能包含序列中的一个值(即“案例”缺失),据我所知,这种情况经常发生,特别是当样本(例如,1000 个)。
再次感谢, 帕特里克
【问题讨论】:
-
sum(x[,"A"])根据我的计算是18不是16。 -
看起来这可能会有所帮助:stackoverflow.com/questions/12031049/…
-
感谢@thelatemail 的建议(和更正),但我不清楚这种方法是如何工作的。不保留列总计(我需要此功能)和行总计(我不想要此功能)。
-
@user1596424 您对
the first row of column A should be able to have values from 1 to 18的评论与您显示的评论不同。也许我误解了。此外,如果您希望列A的值介于 1 到 18 之间,是否可以重复。 -
@user1596424 我更新了代码。
标签: r