【问题标题】:"Nested" relative frequency in 3 way flat contingecy table (ftable)3路平面列联表(f表)中的“嵌套”相对频率
【发布时间】:2014-07-25 02:19:36
【问题描述】:

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

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

非常感谢!

【问题讨论】:

    标签: r contingency


    【解决方案1】:

    我会尝试这样的事情:

    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
    

    【讨论】:

      【解决方案2】:

      或许你可以考虑从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(我们称之为“x”),你可以试试:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 2013-08-28
        • 2018-06-09
        • 2018-10-02
        • 2018-12-29
        相关资源
        最近更新 更多