Индекс соответствия для логистической регрессии в R

#r #logistic-regression #concordance-index

#r #логистическая регрессия #индекс соответствия

Вопрос:

У меня есть следующий фрейм данных (my_df) в R:

 race trauma y1 y2 y3
0      0  1  0  0
0      0  1  0  0
0      0  1  0  0
0      0  1  0  0
0      0  1  0  0
0      0  1  0  0
0      0  1  0  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  1  0
0      0  0  0  1
0      1  1  0  0
0      1  1  0  0
0      1  1  0  0
0      1  1  0  0
0      1  1  0  0
0      1  1  0  0
0      1  1  0  0
0      1  1  0  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  1  0
0      1  0  0  1
0      2  1  0  0
0      2  1  0  0
0      2  1  0  0
0      2  1  0  0
0      2  1  0  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  1  0
0      2  0  0  1
0      3  1  0  0
0      3  0  1  0
0      3  0  1  0
0      3  0  1  0
0      3  0  1  0
0      3  0  1  0
0      3  0  1  0
0      3  0  1  0
0      3  0  1  0
0      3  0  1  0
0      3  0  0  1
0      4  1  0  0
0      4  0  1  0
0      4  0  1  0
0      4  0  1  0
0      4  0  1  0
0      5  0  0  1
0      5  0  0  1
1      0  0  1  0
1      0  0  0  1
1      1  0  1  0
1      1  0  1  0
1      1  0  1  0
1      1  0  0  1
1      2  0  1  0
1      2  0  1  0
1      2  0  1  0
1      2  0  0  1
1      3  0  1  0
1      3  0  1  0
1      3  0  0  1
  

Выходной dput(my_df) дает

 structure(list(race = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L), trauma = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 0L, 0L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L), happy = c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 1L, 2L, 2L, 2L, 2L, 
3L, 3L, 2L, 3L, 2L, 2L, 2L, 3L, 2L, 2L, 2L, 3L, 2L, 2L, 3L)), class = "data.frame", row.names = c(NA, 
-97L))
  

Я использую пакет vgam для подгонки кумулятивной логистической модели и вычисления индекса соответствия с помощью пакета pROC:

 > fit = vglm(cbind(y1,y2,y3) ~ race   trauma, family=cumulative(parallel=TRUE), data=my_df)
> multiclass.roc(as.numeric(cbind(my_df$y1, my_df$y2, my_df$y3)), as.numeric(predict(fit, type="response")), plot=FALSE, legacy.axes=TRUE)
  

Площадь под кривой ROC, то есть индекс соответствия, составляет 0,8271. Основываясь на источнике, который я пытаюсь воспроизвести (Категориальный анализ данных, Agresti, 3-е издание, стр. 314), результат должен быть 0,688. Результаты подгонки согласуются с результатами, представленными в книге. Я предполагаю, что с моим индексом соответствия что-то не так. Я не могу понять, что.
Заранее спасибо за вашу помощь.

Комментарии:

1. поделитесь выводом dput(my_df) в описании вашего вопроса. Используя это, другим будет легче создать ваш data.frame в конце.

2. Я сделал это. Я думал, что его можно восстановить с помощью read.table(textConnection(…)) из буфера обмена. Спасибо за предложение.