Итоговые маржи в xtabs - PullRequest
       16

Итоговые маржи в xtabs

4 голосов
/ 02 апреля 2010

Если у вас есть 2 кросс-классификационные переменные, вы можете использовать rowSums и colSums для получения итоговых значений маржи на выходе xtabs.Но как это можно сделать, если у вас есть 3 классифицирующие переменные (т.е. итоговые значения маржи в каждой подстоле)?

Ответы [ 5 ]

7 голосов
/ 25 января 2017

Анико упомянула об этом в комментарии, но это никогда не было предоставлено в качестве ответа.

Я нашел это независимо, а затем заметил, что это было здесь в комментарии, так что поблагодарите Анико за то, что он получил ее первым.

addmargins ответ:

Для данной таблицы можно указать, какой из классифицирующих факторов увеличить на один или несколько уровней, чтобы сохранить поля для расчета. Один может например, формы суммы и средства над первым измерением и медианы над вторым. Полученная таблица будет иметь два дополнительных уровня для первого измерения и один дополнительный уровень для второго. по умолчанию суммируются все поля в таблице. Другие возможности может дать результаты, которые зависят от порядка, в котором поля вычислен. Это отмечается в распечатанном выводе функции.

4 голосов
/ 02 апреля 2010

Если вы не привязаны к xtabs, пакет Deducer имеет несколько полезных функций для таблиц сопряженности:

> a <- gl(2,4, length=20)
> b <- gl(3,2, length=20)
> d <- rnorm(20)>0
> dat <- data.frame(a,b,d)
> tables<-contingency.tables(
+ row.vars=a,
+ col.vars=b,
+ stratum.var=d,data=dat)
> tables
================================================================================

               ==================================================               
                      ========== Table: a by b ==========                      

                       | -- Stratum = FALSE --
                       | b 
                     a |        1  |        2  |        3  | Row Total | 
-----------------------|-----------|-----------|-----------|-----------|
           1  Count    |        2  |        2  |        1  |        5  | 
              Row %    |   40.000% |   40.000% |   20.000% |   55.556% | 
              Column % |   40.000% |  100.000% |   50.000% |           | 
              Total %  |   22.222% |   22.222% |   11.111% |           | 
-----------------------|-----------|-----------|-----------|-----------|
           2  Count    |        3  |        0  |        1  |        4  | 
              Row %    |   75.000% |    0.000% |   25.000% |   44.444% | 
              Column % |   60.000% |    0.000% |   50.000% |           | 
              Total %  |   33.333% |    0.000% |   11.111% |           | 
-----------------------|-----------|-----------|-----------|-----------|
          Column Total |        5  |        2  |        2  |        9  | 
              Column % |   55.556% |   22.222% |   22.222% |           | 

                       | -- Stratum = TRUE --
                       | b 
                     a |        1  |        2  |        3  | Row Total | 
-----------------------|-----------|-----------|-----------|-----------|
           1  Count    |        2  |        2  |        3  |        7  | 
              Row %    |   28.571% |   28.571% |   42.857% |   63.636% | 
              Column % |   66.667% |   50.000% |   75.000% |           | 
              Total %  |   18.182% |   18.182% |   27.273% |           | 
-----------------------|-----------|-----------|-----------|-----------|
           2  Count    |        1  |        2  |        1  |        4  | 
              Row %    |   25.000% |   50.000% |   25.000% |   36.364% | 
              Column % |   33.333% |   50.000% |   25.000% |           | 
              Total %  |    9.091% |   18.182% |    9.091% |           | 
-----------------------|-----------|-----------|-----------|-----------|
          Column Total |        3  |        4  |        4  |       11  | 
              Column % |   27.273% |   36.364% |   36.364% |           | 


================================================================================
4 голосов
/ 02 апреля 2010

Общий подход состоит в том, чтобы использовать функцию apply, но специально для итогов функция margin.table может быть более удобной:

#create 3 factors
a <- gl(2,4, length=20)
b <- gl(3,2, length=20)
d <- gl(4,2, length=20)
# table
tt <- xtabs(~a+b+d)

# marginal sums
margin.table(tt, 1)
apply(tt, 1, sum)  #same answer

#multi-way margins
margin.table(tt, 1:2)
apply(tt, 1:2, sum)  #same answer
2 голосов
/ 02 апреля 2010

(если я правильно понимаю) Вы можете использовать ddply:

ff <- data.frame(f1=c("a", "b", "b", "b", "b", "b", "b"), f2=c("p", "p", "p", "q", "q", "q", "q"), f3=c("x","x","x","x","y", "y", "y"), val=c(1:7)) 

ddply(ff, .(f1), numcolwise(sum))
ddply(ff, .(f2), numcolwise(sum))
ddply(ff, .(f3), numcolwise(sum))
0 голосов
/ 02 апреля 2010

Комментарии не работают выше. Спасибо за ответы, но они не сделали то, что я ожидал - отдельные итоги в каждой подгруппе.

Немного покопавшись, я обнаружил, что вывод xtabs в этом случае представляет собой 3-мерный массив, и написал следующую функцию для достижения желаемого результата (обратите внимание, что он неполон, но пока работает для итогов по столбцам):

xtabTotals <- function(tabs,margin=1)
# takes a 3 dimensional xtabs array and performs margin total on each sub table
# only doing column margins so far
{
    out <- array(0,dim(tabs)+c(1,0,0))
    dnout <- dimnames(tabs)
    dnout[[1]] <- c(dnout[[1]],"Total")
    dimnames(out) <- dnout

    for (i in 1:dim(tabs)[3])
    {
        out[,,i] <- rbind(tabs[,,i],colSums(tabs[,,i]))
    }
    out
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...