Regressão logística: variáveis ​​agrupadas e não agrupadas (usando R)

9

Estou lendo A. Agresti (2007), Introdução à análise de dados categóricos , 2ª. edição e não tenho certeza se entendi corretamente este parágrafo (p.106, 4.2.1) (embora deva ser fácil):

Na Tabela 3.1 sobre ronco e doenças cardíacas no capítulo anterior, 254 indivíduos relataram ronco todas as noites, dos quais 30 tiveram doenças cardíacas. Se o arquivo de dados agrupou dados binários, uma linha no arquivo de dados relata esses dados como 30 casos de doença cardíaca em um tamanho de amostra de 254. Se o arquivo de dados agrupar dados binários, cada linha no arquivo de dados se refere a um assunto separado, então 30 linhas contêm um 1 para doenças cardíacas e 224 linhas contêm um 0 para doenças cardíacas. As estimativas de ML e valores de SE são os mesmos para qualquer tipo de arquivo de dados.

Transformar um conjunto de dados não agrupados (1 dependente, 1 independente) levaria mais do que "uma linha" para incluir todas as informações !?

No exemplo a seguir, um conjunto de dados simples (irrealista!) É criado e um modelo de regressão logística é construído.

Como seriam os dados agrupados (guia variável?)? Como o mesmo modelo pode ser construído usando dados agrupados?

> 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())
FloE
fonte

Respostas:

11

A tabela 3.1 é reproduzida abaixo:

insira a descrição da imagem aqui

Agresti considerou as seguintes pontuações numéricas para o nível do ronco: {0,2,4,5}.

Existem duas maneiras de ajustar um GLM com R: seu resultado é fornecido como um vetor de 0/1 ou um fator com dois níveis, com os preditores nos rhs da sua fórmula; ou você pode fornecer uma matriz com duas colunas de contagens de sucesso / fracasso, conforme o lhs da fórmula. Este último corresponde ao que Agresti chama de dados 'agrupados'. Um terceiro método, que também se aplica a configurações agrupadas, seria usar o weights=argumento para indicar quantos resultados positivos e negativos foram observados para cada categoria da tabela de classificação.

Os dados na exibição de matriz liam:

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

A partir disso, podemos gerar um data.frameformato longo (2484 linhas = sum(snoring)observações) da seguinte maneira:

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]

E os dois modelos a seguir produzirão resultados idênticos:

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)

Ou seja, , usando a notação de Agresti.logit[π^(x)]=-3,87+0,40x

A segunda notação é freqüentemente usada em tabelas agregadas com uma instrução como cbind(a, b), onde ae bsão colunas de contagens para um evento binário (consulte, por exemplo, Modelos Lineares Generalizados ). Parece que também funcionaria ao usar tabela em vez de matriz (como no seu exemplo), por exemplo

glm(as.table(snoring) ~ c(0, 2, 4, 5), family=binomial)
chl
fonte
Muito obrigado! Uma resposta perfeita! Eu tenho uma adição simples: em vez de as.table (ronco), eu sugeriria a tabela (x, y, dnn = c ('ronco', 'doença')) como equivalente ao meu exemplo, porque a transformação de desagrupado em agrupado os dados também eram de interesse.
FloE
11
@ FloE Você está certo. Você ainda precisará construir seu rhs ad hoc . Por exemplo, algo como tab <- table(x,y, dnn=c('snoring','disease')); glm(tab ~ as.numeric(rownames(tab)), family=binomial)funcionaria (inversão de sinal de menos para os coeficientes porque "Sim" é codificado como 0 em vez de 1).
chl