Como os valores de 'NA' são tratados em glm em R

19

Eu tenho uma tabela de dados T1, que contém quase mil variáveis ​​(V1) e cerca de 200 milhões de pontos de dados. Os dados são escassos e a maioria das entradas é NA. Cada ponto de dados possui um par único de identificação e data para distinguir um do outro.

Eu tenho outra tabela T2, que contém um conjunto separado de variáveis ​​(V2). Essa tabela também possui par de identificação e data que identificam exclusivamente as entradas em T2.

Suspeitamos que os dados em T1 possam ser utilizados para prever valores de variáveis ​​em T2.

Para provar isso, pensei em aplicar o modelo 'glm' em R e verificar se podemos realmente encontrar alguma variável em T2 dependente das variáveis ​​em T1.

Para cada variável em T2, comecei a extrair todos os dados em T1 com o mesmo par de identificação e data, o que resultou em pontos de dados muito menores de ~ 50K para algumas variáveis ​​de teste.

Os problemas que estou enfrentando agora com a aplicação do glm são os seguintes.

  1. Em alguns casos, ele me mostra um erro 'ajuste não encontrado' e aviso 'glm.fit: o algoritmo não convergiu'. Não sei por que isso é mostrado?

  2. Como as NAs são tratadas na glm? Remove todos os registros que envolvem 'NA' primeiro e depois realiza o ajuste?

  3. É uma boa estratégia remover primeiro todas as NAs e depois chamar 'glm'. Receio que isso possa reduzir significativamente os pontos de dados, já que a maioria deles é NA.

  4. Qual método é usado para calcular os coeficientes. Não consegui encontrar nenhum site, jornal ou livro que discuta como o resultado é calculado.

Testei o glm com e sem 'NAs' e encontrei respostas diferentes sobre quais pontos os NAs são considerados ao ajustar os dados:

Exemplo 1:

> tmpData
  x1 x2 x3        Y
1  1  1  1        3
2  1  0  4        5
3  1  2  3        6
4  0  3  1        4

Call:  glm(formula = as.formula(paste(dep, " ~ ", paste(xn, collapse = "+"))), 
    na.action = na.exclude)

Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  
                        5.551e-16                          1.000e+00                          1.000e+00  
as.numeric(unlist(tmpData["x3"]))  
                        1.000e+00  

Degrees of Freedom: 3 Total (i.e. Null);  0 Residual
Null Deviance:      5 
Residual Deviance: 9.861e-31    AIC: -260.6 

Exemplo 2:

'x1'    'x2'    'x3'    'Y'
100000  1   NA  2
1   1   1   3
1   NA  -1124   2
1   0   4   5
1   2   3   6
0   3   1   4



Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  as.numeric(unlist(tmpData["x3"]))  
                       -2.3749044                         -0.0000625                          0.6249899                          1.8749937  

Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
Null Deviance:      13.33 
Residual Deviance: 1.875    AIC: 20.05 
user1140126
fonte

Respostas:

27

Manuseio de NA: Você pode controlar como o glm lida com os dados ausentes. glm () possui um argumento na.actionque indica qual das seguintes funções genéricas deve ser usada pelo glm para manipular NA nos dados:

  • na.omite na.exclude: as observações são removidas se contiverem valores ausentes; se na.exclude for usado, algumas funções preencherão os resíduos e as previsões no tamanho correto, inserindo NAs para casos omitidos.
  • na.pass: mantenha todos os dados, incluindo NAs
  • na.fail: retorna o objeto apenas se ele não contiver valores ausentes

Se você não definir na.action, glm () verificará as opções globais de R para ver se um padrão está definido lá. Você pode acessar suas opções com getOption("na.action")ou options("na.action")e pode configurá-lo com, por exemplo, options(na.action = "na.omit") No entanto, a partir da saída R fornecida no exemplo 1, parece que você está configurando na.action = na.omit. Portanto, sim, nesse caso, pelo menos, você está removendo todos os casos / linhas com os NAs antes da instalação. Além disso, tenho certeza de na.action = na.passque causaria falha no glm () quando os dados tiverem NAs (tente).

Erros: glm () está usando um procedimento iterativo (mínimos quadrados ponderados iterados; IWLS) para fazer estimativas de probabilidade máxima. Às vezes, você recebe erros porque ele passa apenas por um número predefinido de iterações e, se não tiver um bom ajuste, desiste. Esse número é controlado pelo argumento maxit, que por padrão é maxit = 25. Você pode tentar aumentá-lo, mas é claro que isso levará mais tempo. (Se você definir, trace=TRUEele mostrará o resultado de cada iteração.)

Outras fontes de informação: O arquivo de ajuda do glm pode ser acessado com ?glmou help(glm)e explica muito disso. Dois outros recursos úteis são:

MattBagg
fonte