Будет проще, если у вас есть один data.frame.
library(reshape2)
library(plyr)
d1 <- ddply(
students,
c("school_id", "race"),
summarize,
fail=length(student_id)
)
d2 <- with( schools.data, data.frame(
school_id = school_id,
white = tot_white,
black = tot_black,
asian = tot_asian,
school_rev = school_rev
) )
d2 <- melt(d2,
id.vars=c("school_id", "school_rev"),
variable.name="race",
value.name="total"
)
d <- merge( d1, d2, by=c("school_id", "race") )
d$pass <- d$total - d$fail
Затем вы можете посмотреть на данные
library(lattice)
xyplot( d$fail / d$total ~ school_rev | race, data=d )
Или вычислите все, что вы хотите.
r <- glm(
cbind(fail,pass) ~ race + school_rev,
data=d,
family=binomial() # Logistic regression (not bayesian)
)
summary(r)
(РЕДАКТИРОВАТЬ) Если у вас есть больше информации о неудавшихся студентов,
но только агрегированные данные для пропущенных,
Вы можете воссоздать полный набор данных следующим образом.
# Unique student_id for the passed students
d3 <- ddply( d,
c("school_id", "race"),
summarize, student_id=1:pass
)
d3$student_id <- - seq_len(nrow(d3))
# All students
d3$result <- "pass"
students$result <- "fail"
d3 <- merge( # rather than rbind, in case there are more columns
d3, students,
by=c("student_id", "school_id", "race", "result"),
all=TRUE
)
# Students and schools in a single data.frame
d3 <- merge( d3, schools.data, by="school_id", all=TRUE )
# Check that the results did not change
r <- glm(
(result=="fail") ~ race + school_rev,
data=d3,
family=binomial()
)
summary(r)