2015-03-12 2 views
1

У меня возникли проблемы с созданием сложных сечений описательной статистики для данных, которые являются многоуровневыми по своей природе. Я попытался пойти на это с нескольких разных ракурсов, но безуспешно. Ниже приведен код, который я использовал для решения plyr, которое не удалось. Проблема в том, что школы существуют в пределах района. Мне нужна сводная статистика для районного уровня, чтобы соответствовать каждой школе в этом районе. Решение plyr, очевидно, генерирует только описательную статистику на уровне округов для каждой подвыборки школы по сравнению с использованием общей информации об округах каждой школе.Описательная статистика для многоуровневых (сгруппированных) данных

Я пытался найти способ обойти это несколько дней, когда у меня есть момент.

Может быть, совокупность данных.table предлагает любые лучшие решения?

#Generate Data 
set.seed(500) 
School <- rep(seq(1:20), 2) 
District <- rep(c(rep("East", 10), rep("West", 10)), 2) 
Score <- rnorm(40, 100, 15) 
Student.ID <- sample(1:1000,8,replace=T) 
items <- data.frame(replicate(10, sample(1:4, 40, replace=TRUE))) 
gender <- rep(c("Male","Female"), 100*c(0.4,0.6)) 
gender <- sample(gender, 40) 
low.inc <- rep(c("Status.A", "Status.B", "Status.c"), 100*c(0.3,0.2,0.5)) 
low.inc <- sample(low.inc, 40) 
items <- data.frame(lapply(items, factor, ordered=TRUE, 
          levels=1:4)) 
          labels=c("Strongly disagree","Disagree", 
            "Agree","Strongly Agree") 
school.data <- data.frame(Student.ID, School, District, Score, items, gender, low.inc) 
sd1 = sd(school.data$Score) 
m1 = mean(school.data$Score) 
sd.above = m1 + sd1 
sd.below = m1 - sd1 
school.data$scorecat[Score >= sd.above] <- "High" 
school.data$scorecat[Score > sd.below & Score <= sd.above] <- "Moderate" 
school.data$scorecat[Score <= sd.below] <- "Low" 

#Attempt to generate table 
library(plyr) 
b1 <- ddply(school.data, .var = c("gender", "District", "School"), .fun = summarise, 
    n = length(scorecat), 
    high = sum(scorecat %in% c("High")), 
    high.prop = high/n, # Referring to vars I just created 
    mod = sum(scorecat %in% c("Moderate")), 
    mod.prop = mod/n, # Referring to vars I just created 
    low = sum(scorecat %in% c("Low")), 
    low.prop = low/n # Referring to vars I just created 
) 
drops <- c("high","mod", "low") #set up a list to drop columns 
b1 <- b1[,!(names(b1) %in% drops)] 
colnames(b1)[1] <- "Demographic Variable" 

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

b1 <- ddply(school.data, .var = c("gender", "District"), .fun = summarise, 
    n = length(scorecat), 
    high = sum(scorecat %in% c("High")), 
    high.prop = high/n, # Referring to vars I just created 
    mod = sum(scorecat %in% c("Moderate")), 
    mod.prop = mod/n, # Referring to vars I just created 
    low = sum(scorecat %in% c("Low")), 
    low.prop = low/n # Referring to vars I just created 
) 
drops <- c("high","mod", "low") #set up a list to drop columns 
b1 <- b1[,!(names(b1) %in% drops)] 
colnames(b1)[1] <- "Demographic Variable" 

ответ

2

Если я хорошо понимаю, то вы хотите, чтобы вычислить переменную на уровне района, а затем отнести ее к уровню школы. Я почти не понимаю остальную часть вашего поста.

Вы делаете, что в базовой R с помощью последовательно агрегат и слияния .

Учитывая, что вы уже вычислили резюме b1 таблицы с помощью dplyr, вы можете просто объединить его с первоначальным school.data данных.

school.data2 <- merge(school.data,b1,by=c("District","gender")) 

Сообщите мне, если это разрезает.

+0

Спасибо! Я понял, что слишком много думал об этом, и ответ был прямо там передо мной. – bfoste01

+0

Не забудьте также дать щедрость :-) – cmbarbu

+0

Первая щедрость ... подумал, что это будет автоматически. – bfoste01

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