Как обрабатываются значения NA в glm в R

19

У меня есть таблица данных T1, которая содержит почти тысячу переменных (V1) и около 200 миллионов точек данных. Данные редки, и большинство записей - NA. Каждый пункт данных имеет уникальный идентификатор и пару дат, чтобы отличить его от другого.

У меня есть другая таблица T2, которая содержит отдельный набор переменных (V2). В этой таблице также есть пара идентификаторов и дат, которые однозначно идентифицируют записи в T2.

Мы подозреваем, что данные в T1 могут быть использованы для прогнозирования значений переменных в T2.

Чтобы доказать это, я подумал применить модель 'glm' в R и проверить, можем ли мы действительно найти некоторую переменную в T2, которая зависит от переменных в T1.

Для каждой переменной в T2 я начал извлекать все данные в T1, имеющие одинаковые пары id и даты, что привело к гораздо меньшим точкам данных ~ 50K для некоторых тестовых переменных.

Проблемы, с которыми я сталкиваюсь сейчас с применением glm, заключается в следующем.

  1. В некоторых случаях он показывает ошибку «fit not found» и предупреждение «glm.fit: алгоритм не сходится». Я не уверен, почему это показано?

  2. Как с НС обращаются в глм? Удаляет ли он сначала все записи, содержащие «NA», а затем выполняет подгонку?

  3. Является ли хорошей стратегией сначала удалить все NA, а затем вызвать «glm». Я боюсь, что это может значительно уменьшить точки данных, так как большинство из них - АН.

  4. Какой метод используется для расчета коэффициентов. Я не смог найти ни сайта, ни бумаги, ни книги, в которых обсуждается, как рассчитывается результат.

Я проверил glm с и без 'NA' и нашел разные ответы, которые указывают, что NA учитываются при подборе данных:

Пример 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 

Пример 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
источник

Ответы:

27

Обработка NA: Вы можете контролировать, как glm обрабатывает недостающие данные. У glm () есть аргумент, na.actionкоторый указывает, какая из следующих универсальных функций должна использоваться glm для обработки NA в данных:

  • na.omitи na.exclude: наблюдения удаляются, если они содержат пропущенные значения; если используется na.exclude, некоторые функции будут дополнять невязки и прогнозы правильной длиной, вставляя NA для пропущенных случаев.
  • na.pass: сохранить все данные, включая NA
  • na.fail: возвращает объект, только если он не содержит пропущенных значений

Если вы не установите na.action, glm () проверит глобальные параметры R, чтобы увидеть, установлено ли там значение по умолчанию. Вы можете получить доступ к своим опциям с помощью getOption("na.action")или, options("na.action")и вы можете установить их с помощью, например, options(na.action = "na.omit") однако, из вывода R, который вы предоставляете в примере 1, кажется, что вы устанавливаете na.action = na.omit. Так что, да, по крайней мере, в этом случае вы удаляете все наблюдения / строки с NA перед подгонкой. Более того, я уверен, na.action = na.passчто вызовет сбой glm (), когда у данных есть NA (попробуйте).

Ошибки: glm () использует итерационную процедуру (повторяющиеся взвешенные наименьшие квадраты; IWLS) для оценки максимального правдоподобия. Иногда вы получаете ошибки, потому что он будет проходить только заранее определенное количество итераций и, если он не подходит, тогда он сдается. Это число контролируется аргументом maxit, который по умолчанию равен maxit = 25. Вы можете попробовать установить его выше, хотя, конечно, это займет больше времени. (Если вы установите trace=TRUEего, он покажет вам результат каждой итерации.)

Другие источники информации: Справочный файл для glm доступен с ?glmили help(glm)и объясняет многое из этого. Два других полезных ресурса:

MattBagg
источник