Розуміння створення фіктивних (ручних або автоматизованих) змінних у GLM


13

Якщо у формулі glm використовується факторна змінна (наприклад, стать із рівнями M і F), ​​створюються фіктивні змінні (і), які можна знайти в резюме моделі glm разом із пов'язаними з ними коефіцієнтами (наприклад, genderM)

Якщо замість того, щоб покластися на R, поділити коефіцієнт таким чином, коефіцієнт кодується в ряд числових змінних 0/1 (наприклад, genderM (1 для M, 0 для F), genderF (1 для F, 0 для М) і ці змінні потім використовуються як числові змінні у формулі glm, чи не буде результат коефіцієнта різним?

В основному питання полягає в тому, чи R використовує інший обчислення коефіцієнта під час роботи з факторними змінними проти чисельних змінних?

Подальше запитання (можливо, відповідь вище): окрім лише ефективності дозволу R створювати фіктивні змінні, чи є якась проблема із перекодування коефіцієнтами у вигляді ряду числових змінних 0,1 та замість того, щоб використовувати їх у моделі?


2
Коефіцієнти будуть однаковими, кодування R за замовчуванням для факторів відбувається саме так, як ви описали (це називається "фіктивним" кодуванням). Якщо робити це вручну, вам потрібно буде знати про "фільтр фіктивних змінних" - ви не можете включати всі створені змінні, а лише можете включати (по черзі, виключаючи перехоплення); в іншому випадку ваша модель не визначена. Існують також інші методи кодування змінних факторів. NN-1
Affine

@Affine здогадуюсь про те, що якби я харчувався як в genderM, так і в genderF, один з них повертав би NA для коефіцієнтів (з повідомленням, що змінну було виключено через особливості). Це має сенс, оскільки вони ідеально лінійно пов'язані в цьому випадку. Але ви кажете, що я не можу включати всі N; це означає, що навіть якщо полдF встановлено на NA, це призведе до відмінностей / проблем щодо коефіцієнта genderM? Або, простіше кажучи, якщо GLM / LM виключає змінні через особливості, проблема з використанням переопределеної моделі є проблемою? (Я згоден з вашою точкою - просто запитую практичні наслідки)
Брайан

Відповіді:


22

Категоричні змінні (звані " факторами " в R) повинні бути представлені числовими кодами в моделях з декількома регресіями. Існує дуже багато можливих способів належної побудови числових кодів (див. Цей чудовий список на довідковому сайті статистики UCLA). За замовчуванням R використовує кодування опорного рівня (який R називає "contr.treatment"), і це майже в цілому за статистикою за замовчуванням. Це можна змінити для всіх контрастів протягом усього сеансу R за допомогою " параметрів" , або для конкретних аналізів / змінних за допомогою " контрастів" або " С" (відмітьте велику літеру). Якщо вам потрібна додаткова інформація про кодування опорного рівня, я пояснюю це тут: Регресія заснована, наприклад, на дні тижня.

Деякі люди вважають кодування еталонного рівня заплутаним, і вам не потрібно його використовувати. Якщо хочете, ви можете мати дві змінні для чоловіка та жінки; це називається рівнем означає кодування. Однак, якщо ви це зробите, вам потрібно буде придушити перехоплення або модельна матриця буде сингулярною, і регресія не може бути придатною як @Affine зазначає вище, і як я пояснюю тут: Якісне кодування змінної призводить до особливості . Щоб придушити перехоплення, ви модифікуєте свою формулу, додаючи -1або +0подобається так: y~... -1або y~... +0.

Використання рівня кодування означає замість опорного рівня кодування змінить оцінені коефіцієнти та значення тестів гіпотези, які друкуються з вашим результатом. Коли у вас є коефіцієнт двох рівнів (наприклад, чоловік проти жінки) і ви використовуєте кодування опорного рівня, ви побачите перехоплений виклик (constant)і лише одну змінну, вказану у висновку (можливо sexM). Перехоплення - це середнє значення для референтної групи (можливо, жінок) і sexMє різницею між середнім значенням чоловіків і середнім рівнем жіночої статі. Значення р, пов'язане з перехопленням, являє собою тест одного зразка того, чи має опорний рівень середнє значення а значення p, пов'язане зт0sexMповідомляє, чи відрізняються статі за вашою відповіддю. Але якщо ви замість цього використовуєте рівень кодування, у вас буде вказано дві змінні, і кожне p-значення буде відповідати однопробному тесту того, чи є середнє значення цього рівня . Тобто жодне з p-значень не буде тестом на те, чи відрізняються статі. т0

set.seed(1)
y    = c(    rnorm(30), rnorm(30, mean=1)         )
sex  = rep(c("Female",  "Male"          ), each=30)
fem  = ifelse(sex=="Female", 1, 0)
male = ifelse(sex=="Male", 1, 0)

ref.level.coding.model   = lm(y~sex)
level.means.coding.model = lm(y~fem+male+0)

summary(ref.level.coding.model)
# ...
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  0.08246    0.15740   0.524    0.602    
# sexMale      1.05032    0.22260   4.718 1.54e-05 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ...
summary(level.means.coding.model)
# ...
# Coefficients:
#      Estimate Std. Error t value Pr(>|t|)    
# fem   0.08246    0.15740   0.524    0.602    
# male  1.13277    0.15740   7.197 1.37e-09 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ...

1
Дякую за додавання коду: це наочно демонструє, що перехоплення в опорному кодуванні кодування = sexFena в комірці означає кодування (мене додатково збентежило "що трапилося" зі змінною N-1 ...) Можливо, потрібно ще одне питання, але це легко зрозуміти за допомогою однієї змінної, а як щодо 2 чи більше? наприклад вік: "старий" "молодий". Якщо в кодовому кодуванні кодування будуть показані коефіцієнти для sexMale, ageYoung (наприклад) та рахунку перехоплення для BOTH sexHaens та ageOld?
Брайан

1
Якщо у вас коефіцієнт w / 3 рівня, перехоплення є середнім рівнем ref, а інші 2 будуть представлені у висновку. Їх коефіцієнти будуть різницею b / t їх, а рівень ref & & ps буде значущістю цих відмінностей. Якщо у вас є 2 коефіцієнти, обидва матимуть рівень рефлексу, і перехоплення буде середнім для тих людей, які перебувають у обох групах посилань (наприклад, young F), а інші рівні будуть різними b / t заданого рівня фактора 1 w / рівень ref іншого фактора та обидві групи рівнів ref. Наприклад old, old F- "молодий F , & M" є young M- young F.
gung - Відновіть Моніку

1
Я трохи пограв з цим і відчув істотну R^2різницю між обома підходами. Я знаю, що це лише R^2, але чи є це пояснення?
hans0l0

@ hans0l0, я поняття не маю. Різниці не повинно бути.
gung - Відновіть Моніку

1
@confused, ви можете знайти це в документації ,? glm .
gung - Відновіть Моніку

2

Орієнтовні коефіцієнти будуть однаковими за умови, що ви створюєте свої манекенні змінні (тобто числові), відповідні R. Наприклад: давайте створити підроблені дані та встановити Poisson glm за допомогою коефіцієнта. Зауважте, що glфункція створює змінну фактора.

> counts <- c(18,17,15,20,10,20,25,13,12)
> outcome <- gl(3,1,9)
> outcome
[1] 1 2 3 1 2 3 1 2 3
Levels: 1 2 3
> class(outcome)
[1] "factor"
> glm.1<- glm(counts ~ outcome, family = poisson())
> summary(glm.1)

Call:
glm(formula = counts ~ outcome, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   3.0445     0.1260  24.165   <2e-16 ***
outcome2     -0.4543     0.2022  -2.247   0.0246 *  
outcome3     -0.2930     0.1927  -1.520   0.1285    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Оскільки результат має три рівні, я створюю дві манекенні змінні (манекен.1 = 0, якщо результат = 2 і манекен.2 = 1, якщо результат = 3) і повторно використовую ці числові значення:

> dummy.1=rep(0,9)
> dummy.2=rep(0,9)
> dummy.1[outcome==2]=1
> dummy.2[outcome==3]=1
> glm.2<- glm(counts ~ dummy.1+dummy.2, family = poisson())
> summary(glm.2)

Call:
glm(formula = counts ~ dummy.1 + dummy.2, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   3.0445     0.1260  24.165   <2e-16 ***
dummy.1      -0.4543     0.2022  -2.247   0.0246 *  
dummy.2      -0.2930     0.1927  -1.520   0.1285    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Як бачимо, розрахункові коефіцієнти однакові. Але вам потрібно бути обережними при створенні ваших змінних фіктивних даних, якщо ви хочете отримати той же результат. Наприклад, якщо я створив дві манекенні змінні як (манекен.1 = 0, якщо результат = 1 і манекен 2 = 1, якщо результат = 2), то оцінені результати відрізняються наступним чином:

> dummy.1=rep(0,9)
> dummy.2=rep(0,9)
> dummy.1[outcome==1]=1
> dummy.2[outcome==2]=1
> glm.3<- glm(counts ~ dummy.1+dummy.2, family = poisson())
> summary(glm.3)

Call:
glm(formula = counts ~ dummy.1 + dummy.2, family = poisson())

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9666  -0.6713  -0.1696   0.8471   1.0494  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   2.7515     0.1459   18.86   <2e-16 ***
dummy.1       0.2930     0.1927    1.52    0.128    
dummy.2      -0.1613     0.2151   -0.75    0.453    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 10.5814  on 8  degrees of freedom
Residual deviance:  5.1291  on 6  degrees of freedom
AIC: 52.761

Number of Fisher Scoring iterations: 4

Це тому, що коли ви додаєте outcomeзмінну в glm.1, R за замовчуванням створює дві манекенні змінні, а саме, outcome2і outcome3визначає їх аналогічно до dummy.1та dummy.2в glm.2, тобто перший рівень результату - це коли всі інші манекенні змінні ( outcome2і outcome3) встановлюються як нуль.


Дякуємо за доказ коду, що розрахункові коефіцієнти однакові. Також корисне попередження про створення свого власного: я хотів створити свою власну, тому що тоді змінна модель буде прив'язуватися безпосередньо до стовпця бази даних за назвою (що може бути корисно вниз за течією), але виглядає так, що мені потрібно зрозуміти проблеми з тим, як Я займаюся цим.
Брайан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.