Як трактуються значення "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. Як лікуються НС у glm? Чи видаляється спочатку всі записи, що містять 'NA', а потім виконуються підгонки?

  3. Чи є гарною стратегією спочатку видалити всі НС, а потім викликати "glm". Я побоююся, що це може значно зменшити точки даних, оскільки більшість з них є NA.

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

Я перевірив glm з і без '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 

Відповіді:


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 = 25. Ви можете спробувати встановити його вище, хоча, звичайно, це займе більше часу. (Якщо ви встановите, trace=TRUEце покаже результат кожної ітерації.)

Інші джерела інформації: Довідковий файл для glm доступний з ?glmабо help(glm)пояснює значну частину цього. Ще два корисні ресурси:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.