2015-02-09 2 views
1

Я хотел бы создать DataFrame с доверительными интервалами для пропорций в качестве конечного результата. Я ввел переменную (tp в моем примере) в качестве значения обрезания для вычисления пропорций для. Я хотел бы использовать пакет dplyr для создания окончательного фрейма данных. Ниже приведен упрощенный пример:подсчеты сгруппированных переменных с использованием dplyr

library(dplyr) 

my_names <- c("A","B") 
dt <- data.frame(
    Z = sample(my_names,100,replace = TRUE), 
    X = sample(1:10, replace = TRUE), 
    Y = sample(c(0,1), 100, replace = TRUE) 
) 
    my.df <- dt%>% 
    mutate(tp = (X >8)* 1) %>% #multiply by one to convert into numeric 
    group_by(Z, tp) %>% 
    summarise(n = n()) %>% 
    mutate(prop.tp= n/sum(n)) %>% 
    mutate(SE.tp = sqrt((prop.tp*(1-prop.tp))/n))%>% 
    mutate(Lower_limit = prop.tp-1.96 * SE.tp)%>% 
    mutate(Upper_limit = prop.tp+1.96 * SE.tp) 

output: 

Source: local data frame [4 x 7] 
Groups: Z 

    Z tp n prop.tp  SE.tp Lower_limit Upper_limit 
1 A 0 33 0.6346154 0.08382498 0.4703184 0.7989123 
2 A 1 19 0.3653846 0.11047236 0.1488588 0.5819104 
3 B 0 27 0.5625000 0.09547033 0.3753782 0.7496218 
4 B 1 21 0.4375000 0.10825318 0.2253238 0.6496762 

Тем не менее, я хотел бы вычислить стандартную ошибку и CI: с с помощью общей выборки для групп в колонке Z, а не расщепленный образец категориальной переменной ф. Итак, общий образец для A в моем примере должен быть n = 33 +19. Любые идеи?

ответ

1

Не совсем уверен, что я получаю, какую группу вы хотите сравнить, с которой здесь, но во всяком случае у вас есть две переменные группировки tp = X > 8 и Z. Если вы хотите сравнить строки с X > 8 и Z == "A" всех строк с X > 8 вы можете сделать это, как этот

merge(
    dt %>% 
     group_by(X > 8) %>% 
     summarize(n.X = n()), 
    dt %>% 
     group_by(X > 8, Z) %>% 
     summarise(n.XZ = n()), 
    by = "X > 8" 
) %>% 
    mutate(prop.XZ = n.XZ/n.X) %>% 
    mutate(SE = sqrt((prop.XZ*(1-prop.XZ))/n.X))%>% 
    mutate(Lower_limit = prop.XZ-1.96 * SE) %>% 
    mutate(Upper_limit = prop.XZ+1.96 * SE) 
X > 8 n.X Z n.XZ prop.XZ   SE Lower_limit Upper_limit 
1 FALSE 70 A 37 0.5285714 0.05966378 0.4116304 0.6455124 
2 FALSE 70 B 33 0.4714286 0.05966378 0.3544876 0.5883696 
3 TRUE 30 A 16 0.5333333 0.09108401 0.3548087 0.7118580 
4 TRUE 30 B 14 0.4666667 0.09108401 0.2881420 0.6451913 

Если вы хотите, чтобы повернуть проблему вокруг и сравнить X > 8 и Z == "A" для всех строк с Z == "A" вы можете сделать это следующим образом:

merge(
    dt %>% 
     group_by(Z) %>% 
     summarize(n.Z = n()), 
    dt %>% 
     group_by(X > 8, Z) %>% 
     summarise(n.XZ = n()), 
    by = "Z" 
) %>% 
    mutate(prop.XZ = n.XZ/n.Z) %>% 
    mutate(SE = sqrt((prop.XZ*(1-prop.XZ))/n.Z))%>% 
    mutate(Lower_limit = prop.XZ-1.96 * SE) %>% 
    mutate(Upper_limit = prop.XZ+1.96 * SE) 
Z n.Z X > 8 n.XZ prop.XZ   SE Lower_limit Upper_limit 
1 A 53 FALSE 37 0.6981132 0.06305900 0.5745176 0.8217088 
2 A 53 TRUE 16 0.3018868 0.06305900 0.1782912 0.4254824 
3 B 47 FALSE 33 0.7021277 0.06670743 0.5713811 0.8328742 
4 B 47 TRUE 14 0.2978723 0.06670743 0.1671258 0.4286189 

Это немного грязный необходимости merge двух отдельных групп, но я не знаю, если это возможно разгруппировать и повторно группа в том же заявлении. Я удивлен, хотя, как трудно, кажется, использовать группировки на двух разных уровнях (если можно так выразиться) и надеяться, что кто-то еще сможет найти лучшее решение.

+0

закрыть, я хотел посмотреть пропорции A и B, где X> 8, хотя ... любые идеи – jonas

+0

Возможно, обновленный ответ - это то, что вы хотите. Чтобы преобразовать 'tp' в числовой, я предлагаю вам использовать' as.integer' вместо умножения с 1, так как тогда легче понять цель операции. – Backlin

+0

Спасибо! Ваше первое предложение - это то, что я ищу ... – jonas

Смежные вопросы