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(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);但是,我正在寻找的解决方案应该足够灵活,以便组也可以有不同的大小。

非常感谢!

4

2 回答 2

3

也许您可以考虑从 开始table,然后使用prop.tableWrapped in 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(我们称之为“x”),您可以尝试:

ftable(prop.table(as.table(x), margin=3))
于 2014-06-04T13:41:02.753 回答
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
于 2014-06-04T13:05:24.107 回答