2016-06-08 12 views
0

Я обучил биномиальную модель, используя glm(Xtrain, ytrain, formula='cbind(Response, n - Response) ~ features', family='binomial'), где ytrain - матрица отклика со столбцами счетчиков (да), counts (no).Вычислить кривую AUC для ответов в форме cbind (Count_1, Count_0)

Тестируемые ответы, которые я провел, находятся в той же форме матрицы ответа. Однако функция pred() возвращает вероятности - по одному для каждой строки данных обучения. Теперь я хочу использовать ROCR или AUC пакет для генерации кривых AUC, но мои предсказания и наблюдения находятся в разных форматах. Кто-нибудь знает как это сделать?


ОК. Добавление примера. Простите, что это бессмысленный/ранний недостаток/маленький, я только хочу проиллюстрировать свое дело.

plants <- c('Cactus', 'Tree', 'Cactus', 'Tree', 'Flower', 'Tree', 'Tree') 
sun <- c('Full', 'Half', 'Half', 'Full', 'Full', 'Half', 'Full') 
water <- c('N', 'Y', 'Y', 'N', 'Y', 'N', 'N') 
died <- c(10, 10, 8, 2, 15, 20, 12) 
didntdie <- c(2, 10, 8, 20, 10, 10, 10) 
df <- data.frame(died, didntdie, plants, sun, water) 
dftrain <- head(df, 5) 
dftest <- tail(df, 2) 
model <- glm("cbind(died, didntdie) ~ plants + sun + water", data=dftrain, family="binomial") 

На данный момент, predict(model, dftest) возвращает лог-форы (давая вероятность смерти) для последних двух наборов функций в моем dataframe. Теперь я хочу вычислить кривую AUC. Мои наблюдения находятся в dftest[c('died','didntdie')]. Мои прогнозы - это, по существу, вероятности. AUC, ROCR и т. Д. Ожидают, что предсказания и наблюдения станут списком ответов bernoulli. Я не могу найти документацию о том, как использовать эту матрицу ответов. Любая помощь оценивается.

+2

Вы должны предоставить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), чтобы облегчить вам помощь. Что такое 'Xtrain'? Функция 'glm()' по умолчанию не имеет параметра 'eqtn ='. С чем вы сравниваете вероятности? Как именно вы хотите рассчитать ROC с этими данными? – MrFlick

ответ

2

Для начала вы можете развернуть фрейм данных, чтобы синтезировать бинарные результаты с подсчетами, которые используют аргумент weight= для glm().

obs <- died + didntdie 
df <- df[rep(1:length(obs), each= 2),] # one row for died and one for didn't 
df$survived <- rep(c(0L,1L), times=length(obs)) # create binary outcome for survival 
df$weight <- c(rbind(died, didntdie)) # assign weights 
df 

#  died didntdie plants sun water survived weight 
# 1  10  2 Cactus Full  N  0  10 
# 1.1 10  2 Cactus Full  N  1  2 
# 2  10  10 Tree Half  Y  0  10 
# 2.1 10  10 Tree Half  Y  1  10 
# 3  8  8 Cactus Half  Y  0  8 
# 3.1 8  8 Cactus Half  Y  1  8 
# 4  2  20 Tree Full  N  0  2 
# 4.1 2  20 Tree Full  N  1  20 
# 5  15  10 Flower Full  Y  0  15 
# 5.1 15  10 Flower Full  Y  1  10 
# 6  20  10 Tree Half  N  0  20 
# 6.1 20  10 Tree Half  N  1  10 
# 7  12  10 Tree Full  N  0  12 
# 7.1 12  10 Tree Full  N  1  10 

model <- glm(survived ~ plants + sun + water, data=df, family="binomial", weights = weight) 

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

Таким образом, вы могли бы сделать что-то вроде

df <- df[rep(1:nrow(df), times = df$weight),] 
model <- glm(survived ~ plants + sun + water, data=df, family="binomial") 
# note the model does not change 

library(pROC) 
auc(model$fitted.values, df$survived) 
# Area under the curve: 0.5833 

Примечания этого АУК в сэмпл. Вы должны использовать рандомизированное удержание (или, еще лучше, перекрестное подтверждение) для оценки AUC вне выборки. Использование верхних N строк data.frame для разделения - не - хорошая идея, если порядок строк уже не был рандомизирован.

+0

Ах! Спасибо за пример того, как расширить df. Думаю, это сделает это. (Хотя, слишком плохо ROCR не имеет параметра, позволяющего вводить другие формы данных.) – Erin

+0

@Erin в этом примере Я показал вам, как вычислить его с помощью 'pROC :: auc'. «ROCR :: предсказание» слишком медленное, если все, что вам нужно, это AUC. ROCR делает некоторые другие интересные вещи под капотом. Вы также можете написать свою собственную функцию AUC, которую я использую при работе в 'data.table' (здесь не применимо). – C8H10N4O2

+0

круто, спасибо за дополнительную информацию о pROC. Не беспокойтесь о том, чтобы советовать моим выборам на выносливость - я знаю, как я это делаю. – Erin