Pergunta sobre regressão logística


14

Desejo executar uma regressão logística binária para modelar a presença ou ausência de conflito (variável dependente) de um conjunto de variáveis ​​independentes durante um período de 10 anos (1997-2006), com cada ano tendo 107 observações. Meus independentes são:

  • degradação da terra (categórica para 2 tipos de degradação);
  • aumento da população (0- não; 1-sim);
  • tipo de subsistência (0 - tipo um; 1 - tipo dois);
  • densidade populacional (três níveis de densidade);
  • NDVI contínuo (produtividade máxima de vegetais);
  • NDVI (declínio de veg do ano anterior - 0 - não; 1-sim) et-1
  • e NDVI (declínio nos vegetais nos últimos dois anos - 0- não; 1- sim).t-2

Sou bastante novo em tudo isso - este é um projeto que meu palestrante me deu - e, portanto, agradeceria alguns conselhos ou orientações. Eu já testei para multicolinearidade.

Essencialmente, meus dados são divididos em 107 unidades de observação (regiões espaciais), cobrindo 10 anos (1070 no total) e, para cada unidade de observação, fornece um valor "instantâneo" das condições das variáveis ​​independentes naquele momento nessa unidade ( região). Eu quero saber como configurar minha regressão logística (ou tabela) para reconhecer os 107 valores de cada ano separadamente, para que as alterações no NDVI temporal entre diferentes unidades-ano possam ser avaliadas?


2
Qual software você está usando? Além disso, seu professor lhe disse para usar a regressão logística? Parece-me que isso exige algum tipo de modelo multinível, mas se você está apenas aprendendo logística, talvez essa não seja a intenção do seu professor.
Peter Flom - Restabelece Monica

1
Você deseja apenas controlar a autocorrelação temporal ou modelar tendências (em termos de probabilidade de conflito e / ou alterações temporais nos efeitos dos fatores de risco)?
Macro

Apenas autocorrelação temporais
Stephen

A natureza dos seus dados é espacial-temporal. Portanto, um modelo verdadeiramente selecionado precisa considerar essa natureza.
Hbhishani #

3
se você quiser apenas controlar a autocorrelação temporal, poderá usar o GEE (Equações de Estimativas Generalizadas) e fazer sua inferência com os erros padrão robustos.
Macro

Respostas:


6

Este é realmente um problema extremamente sofisticado e uma pergunta difícil do seu professor!

Em termos de como você organiza seus dados, um retângulo de 1070 x 10 é adequado. Por exemplo, em R:

> conflict.data <- data.frame(
+ confl = sample(0:1, 1070, replace=T),
+ country = factor(rep(1:107,10)),
+ period = factor(rep(1:10, rep(107,10))),
+ landdeg = sample(c("Type1", "Type2"), 1070, replace=T),
+ popincrease = sample(0:1, 1070, replace=T),
+ liveli =sample(0:1, 1070, replace=T),
+ popden = sample(c("Low", "Med", "High"), 1070, replace=T),
+ NDVI = rnorm(1070,100,10),
+ NDVIdecl1 = sample(0:1, 1070, replace=T),
+ NDVIdecl2 = sample(0:1, 1070, replace=T))
> head(conflict.data)
  confl country period landdeg popincrease liveli popden     NDVI NDVIdecl1 NDVIdecl2
1     1       1      1   Type1           1      0    Low 113.4744         0         1
2     1       2      1   Type2           1      1   High 103.2979         0         0
3     0       3      1   Type2           1      1    Med 109.1200         1         1
4     1       4      1   Type2           0      1    Low 112.1574         1         0
5     0       5      1   Type1           0      0   High 109.9875         0         1
6     1       6      1   Type1           1      0    Low 109.2785         0         0
> summary(conflict.data)
     confl           country         period     landdeg     popincrease         liveli        popden         NDVI          NDVIdecl1        NDVIdecl2     
 Min.   :0.0000   1      :  10   1      :107   Type1:535   Min.   :0.0000   Min.   :0.0000   High:361   Min.   : 68.71   Min.   :0.0000   Min.   :0.0000  
 1st Qu.:0.0000   2      :  10   2      :107   Type2:535   1st Qu.:0.0000   1st Qu.:0.0000   Low :340   1st Qu.: 93.25   1st Qu.:0.0000   1st Qu.:0.0000  
 Median :1.0000   3      :  10   3      :107               Median :1.0000   Median :1.0000   Med :369   Median : 99.65   Median :1.0000   Median :0.0000  
 Mean   :0.5009   4      :  10   4      :107               Mean   :0.5028   Mean   :0.5056              Mean   : 99.84   Mean   :0.5121   Mean   :0.4888  
 3rd Qu.:1.0000   5      :  10   5      :107               3rd Qu.:1.0000   3rd Qu.:1.0000              3rd Qu.:106.99   3rd Qu.:1.0000   3rd Qu.:1.0000  
 Max.   :1.0000   6      :  10   6      :107               Max.   :1.0000   Max.   :1.0000              Max.   :130.13   Max.   :1.0000   Max.   :1.0000  
                  (Other):1010   (Other):428                                                                                                              
> dim(conflict.data)
[1] 1070   10

Para ajustar um modelo, a função glm (), como @ gui11aume sugere, fará o básico ...

mod <- glm(confl~., family="binomial", data=conflict.data)
anova(mod)

... mas isso tem o problema de tratar "país" (presumo que você tenha país como suas 107 unidades) como um efeito fixo, enquanto que um efeito aleatório é mais apropriado. Também trata o período como um fator simples, não sendo permitida autocorrelação.

Você pode resolver o primeiro problema com um modelo de efeitos mistos lineares generalizados, como no pacote lme4 de Bates et al. , Em R. Há uma boa introdução a alguns aspectos disso aqui . Algo como

library(lme4)
mod2 <- lmer(confl ~ landdeg + popincrease + liveli + popden + 
    NDVI + NDVIdecl1 + NDVIdecl2 + (1|country) +(1|period), family=binomial,
    data=conflict.data)
summary(mod2)

seria um passo à frente.

Agora, seu último problema restante é a correlação automática nos 10 períodos. Basicamente, seus 10 pontos de dados em cada país não valem tanto quanto se fossem 10 pontos independentes e idênticos, distribuídos aleatoriamente. Não conheço uma solução de software amplamente disponível para autocorrelação nos resíduos de um modelo multinível com uma resposta não normal. Certamente não está implementado no lme4. Outros podem saber mais do que eu.


Este (sem resposta) pergunta é também relevante - stats.stackexchange.com/questions/20613/...
Peter Ellis

1

Este tutorial é abrangente.

Em R, você precisa preparar seus dados, digamos, variável dataem a data.frame, cuja primeira coluna é sua variável 0-1 (conflito) e as outras colunas são os preditores. Para variáveis ​​categóricas, você deve verificar se elas são do tipo factor. Para garantir que a coluna 3, digamos, tenha essa propriedade, você pode aplicar por data[,3] <- as.factor(data[,3]).

Então é só uma questão de

glm(data, family="binomial")

Isso implica implicitamente que você tenha um modelo aditivo e fornece os valores estimados. Para obter uma saída mais abrangente, com teste para parâmetros individuais, você pode fazer

summary(glm(data, family="binomial"))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.