Логистическая регрессия: сгруппированные и разгруппированные переменные (с использованием R)

9

Я читаю A. Agresti (2007), Введение в категориальный анализ данных , 2-е. редакция, и я не уверен, правильно ли я понимаю этот параграф (с.106, 4.2.1) (хотя это должно быть легко):

В Таблице 3.1, посвященной храпу и сердечным заболеваниям в предыдущей главе, 254 пациента сообщали о храпе каждую ночь, из которых у 30 было сердечное заболевание. Если файл данных сгруппировал двоичные данные, строка в файле данных сообщает об этих данных как о 30 случаях сердечно-сосудистых заболеваний из размера выборки 254. Если файл данных имеет разгруппированные двоичные данные, каждая строка в файле данных относится к отдельный предмет, поэтому 30 строк содержат 1 для болезни сердца и 224 строки содержат 0 для болезни сердца. Оценки ML и значения SE одинаковы для любого типа файла данных.

Преобразование набора несгруппированных данных (1 зависимая, 1 независимая) потребует больше, чем «строка», чтобы включить всю информацию !?

В следующем примере (нереально!) Создается простой набор данных и строится модель логистической регрессии.

Как будут выглядеть сгруппированные данные (переменная вкладка?)? Как можно построить ту же модель, используя сгруппированные данные?

> dat = data.frame(y=c(0,1,0,1,0), x=c(1,1,0,0,0))
> dat
  y x
1 0 1
2 1 1
3 0 0
4 1 0
5 0 0
> tab=table(dat)
> tab
   x
y   0 1
  0 2 1
  1 1 1
> mod1=glm(y~x, data=dat, family=binomial())
плавучая льдина
источник

Ответы:

11

Таблица 3.1 воспроизведена ниже:

введите описание изображения здесь

Агрести рассмотрел следующие числовые оценки для уровня храпа: {0,2,4,5}.

Есть два способа согласовать GLM с R: либо ваш результат представлен в виде вектора 0/1, либо как фактор с двумя уровнями, с предикторами на правой части вашей формулы; или вы можете дать матрицу с двумя столбцами отсчетов для успеха / неудачи в качестве lhs формулы. Последнее соответствует тому, что Агрести называет «сгруппированными» данными. Третий метод, который также применяется к сгруппированным настройкам, состоит в том, чтобы использовать weights=аргумент, чтобы указать, сколько положительных и отрицательных результатов наблюдалось для каждой категории таблицы классификации.

Данные в матричном представлении будут читать:

snoring <- matrix(c(24,35,21,30,1355,603,192,224), nc=2)

Исходя из этого, мы можем сгенерировать data.frameв длинном формате (2484 строки = sum(snoring)наблюдения) следующим образом:

snoring.df <- data.frame(snoring=gl(4, 1, labels=c("Never", "Occasional",
                                                   "Nearly every night", 
                                                   "Every night")),
                         disease=gl(2, 4, labels=c("Yes", "No")),
                         counts=as.vector(snoring))
snoring.df <- snoring.df[rep(seq_len(nrow(snoring.df)), snoring.df$counts), 1:2]

И следующие две модели дадут идентичные результаты:

levels(snoring.df$snoring) <- c(0, 2, 4, 5)
y <- abs(as.numeric(snoring.df$disease)-2)
x <- as.numeric(as.character(snoring.df$snoring))
fit.glm1 <- glm(y ~ x, family=binomial)

fit.glm2 <- glm(snoring ~ c(0, 2, 4, 5), family=binomial)

То есть с использованием записи Агрести.logit[π^(x)]=3.87+0.40x

Второе обозначение часто используется в агрегированной таблице с такой инструкцией cbind(a, b), где aи bявляются столбцами счетчиков для двоичного события (см., Например, Обобщенные линейные модели ). Похоже, это также будет работать при использовании таблицы вместо матрицы (как в вашем примере), например

glm(as.table(snoring) ~ c(0, 2, 4, 5), family=binomial)
хл
источник
Большое спасибо! Идеальный ответ! У меня есть одно простое дополнение: вместо as.table (храп) я бы предложил таблицу (x, y, dnn = c ('храп', 'болезнь')) в качестве эквивалента моего примера, потому что преобразование разгруппированных в сгруппированные Данные также представляли интерес.
FloE
1
@FloE Ты прав. Вам все еще нужно будет создать свои rhs ad hoc . Например, что-то вроде tab <- table(x,y, dnn=c('snoring','disease')); glm(tab ~ as.numeric(rownames(tab)), family=binomial)бы сработало (инверсия знака минус для коэффициентов, потому что «Да» кодируется 0 вместо 1).
ЧЛ