"#嵌套34; 3路平面列联表中的相对频率(ftable)

时间:2014-06-04 12:21:51

标签: r contingency

我想知道是否有一种直接的方法可以在3向平面(!)列联表中获得嵌套的相对频率。

N    <- 10
(sex <- factor(sample(c("f", "m"), N, replace=TRUE)))
(work <- factor(sample(c("home", "office"), N, replace=TRUE)))
(satisfaction <- factor(sample(c("excellent", "ok","bad"), N, replace=TRUE)))
ftable(work, sex, satisfaction, row.vars=c("sex", "satisfaction"))

此代码生成此输出:

                work home office
sex satisfaction                 
f   bad                  1      1
    excellent            0      1
    ok                   1      1
m   bad                  1      0
    excellent            1      0
    ok                   1      2

我想得到的是

                work home office
sex satisfaction                 
f   bad                  0.2      0.2
    excellent            0        0.2
    ok                   0.2      0.2
m   bad                  0.2      0
    excellent            0.2      0
    ok                   0.2      0.4

我知道我可以用prop.table计算表格但是还没弄清楚如何将这与ftable产生的平面列联表结合起来。肯定有一种方法可以分别计算每个性别组的相对频率,但我对更直接的方式感兴趣。 到目前为止,我还没有找到任何方法如何将相对频率变为平面列联表。

注意:在这个例子中,男性和女性群体的大小相同(5);但是,我正在寻找的解决方案应该足够灵活,以便群组也可以有不同的大小。

非常感谢!

2 个答案:

答案 0 :(得分:3)

也许您可以考虑从table开始,然后使用prop.table中包含的ftable

y <- table(sex, satisfaction, work)
y
# , , work = home
# 
#    satisfaction
# sex bad excellent ok
#   f   1         1  0
#   m   1         1  1
# 
# , , work = office
# 
#    satisfaction
# sex bad excellent ok
#   f   0         1  1
#   m   0         1  2

ftable(prop.table(y, margin=3))
#                  work home office
# sex satisfaction                 
# f   bad                0.2    0.0
#     excellent          0.2    0.2
#     ok                 0.0    0.2
# m   bad                0.2    0.0
#     excellent          0.2    0.2
#     ok                 0.2    0.4

这假设我们从这样开始:

set.seed(1)
N <- 10
sex <- factor(sample(c("f", "m"), N, replace=TRUE))
work <- factor(sample(c("home", "office"), N, replace=TRUE))
satisfaction <- factor(sample(c("excellent", "ok","bad"), N, replace=TRUE))

同样,如果您已经有ftable(让我们称之为&#34; x&#34;),您可以尝试:

ftable(prop.table(as.table(x), margin=3))

答案 1 :(得分:0)

我会尝试这样的事情:

require("data.table")
dt <- data.table(sex,work,satisfaction)
dt2 <- dcast.data.table(dt,sex+satisfaction~work,value.var="satisfaction",fun=length)
dt2[,':=' (home=home/sum(home),office=office/sum(office))]
combs <- data.table(expand.grid(sex=levels(sex),satisfaction=levels(satisfaction)))
merge(combs,dt2,by=c("sex","satisfaction"),all.x=T)

#    sex satisfaction       home office
# 1:   f          bad 0.50000000    0.5
# 2:   f    excellent 0.16666667    0.0
# 3:   f           ok         NA     NA
# 4:   m          bad 0.08333333    0.0
# 5:   m    excellent 0.25000000    0.0
# 6:   m           ok 0.00000000    0.5