Понимание создания фиктивных (ручных или автоматических) переменных в GLM


13

Если в формуле glm используется факторная переменная (например, пол с уровнями M и F), то создаются фиктивные переменные, которые можно найти в сводке модели glm вместе с соответствующими коэффициентами (например, полM)

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

По сути, вопрос заключается в следующем: использует ли R различные вычисления коэффициентов при работе с факторными переменными в сравнении с числовыми переменными?

Дополнительный вопрос (возможно, отвеченный вышеизложенным): помимо эффективности того, что R позволяет создавать фиктивные переменные, есть ли проблемы с перекодировкой коэффициентов в виде последовательности числовых 0,1 переменных и их использованием вместо этого в модели?


2
Коэффициенты будут такими же, кодирование R по умолчанию для факторов точно такое же, как вы описали (это называется «фиктивным» кодированием). Если вы делаете это вручную, вам нужно знать о «ловушке фиктивной переменной» - вы не можете включить все созданных переменных, но можете включить только (альтернативно, исключить перехват); в противном случае ваша модель будет переопределена. Есть и другие методы кодирования факторных переменных. N - 1NN1
Affine

@ Полагаю, что я полагаю, что если бы я кормил и пол, и пол, один из них возвратил бы NA для коэффициентов (с сообщением, что переменная была исключена из-за особенностей). Это имеет смысл, потому что они совершенно линейно связаны в этом случае. Но вы говорите, что я не могу включить все N; Означает ли это, что даже если для параметра установлено значение «NA», это приведет к различиям / проблемам с коэффициентом «гендер»? Или, проще говоря, если GLM / LM исключает переменные из-за особенностей, является ли использование переопределенной модели проблемой? (Я согласен с вашей точкой зрения - просто спрашиваю о практических последствиях)
Брайан

Ответы:


22

Категориальные переменные (называемые « факторами » в R) должны быть представлены числовыми кодами в моделях множественной регрессии. Существует очень много возможных способов правильного построения числовых кодов (см. Этот великолепный список на справочном сайте статистики UCLA). По умолчанию, R использует опорный уровень кодирования (который R вызовы «contr.treatment»), и который в значительной степени по умолчанию статистика шириной. Это можно изменить для всех контрастов всего сеанса R с помощью параметров или для конкретных анализов / переменных с использованием контрастов или C (обратите внимание на заглавную). Если Вам необходима дополнительная информация о кодировании опорного уровня, я объясняю его здесь: регрессия на основе, например , по дням недели,

Некоторые люди находят опорный уровень кодирования в заблуждение, и вы не должны использовать его. Если вы хотите, вы можете иметь две переменные для мужчин и женщин; это называется уровень означает кодирование. Однако, если вы сделаете это, вам нужно будет подавить перехват, иначе матрица модели будет единственной, и регрессия не может быть подобрана, как @Affine отмечает выше и как я объясняю здесь: Качественное кодирование переменных приводит к особенностям . Чтобы подавить перехват, вы изменяете свою формулу, добавляя -1или +0вроде этого: y~... -1или y~... +0.

Использование средств на уровень кодирования вместо эталонного уровня кодирования изменят коэффициенты просчитаны и смысл проверки гипотез, которые печатаются с выходом. Если у вас есть фактор два уровня (например, мужские и женская) и использовать кодирование опорного уровня, вы увидите перехватывать называемые (constant)и только одну переменные , перечисленные в выводе (возможно sexM). Перехват - это среднее значение контрольной группы (возможно, женщин) и sexMразница между средним значением для мужчин и средним для женщин. Значение p, связанное с перехватом, является тестом одной выборки того, имеет ли опорный уровень среднее значение и значением p, связанным сt0тsexMговорит вам, если пол отличается в вашем ответе. Но если вы вместо этого используете уровень, означающий кодирование, у вас будет две переменные в списке, и каждое значение p будет соответствовать тесту для одной выборки того, равно ли среднее значение этого уровня . То есть ни одно из p-значений не будет проверять, различаются ли полы. t0

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
Спасибо за добавление кода: это наглядно демонстрирует, что перехват в ссылочной ячейке coding = sexFemale в ячейке означает кодирование (меня дополнительно смутило «что случилось» с переменной N-1 ...) Возможно, нужен другой вопрос, но это легко понять с помощью одной переменной, как насчет 2 или более? например, возраст: "старый", "молодой". При кодировании ячеек ref будут отображаться коэффициенты для sexMale, ageYoung (например) и счет перехвата для обоих: sexFemale и ageOld?
Брайан

1
Если у вас есть коэффициент с 3 уровнями, перехват является средним значением уровня ссылки, а остальные 2 будут представлены в выходных данных. Их коэффициенты будут как разница между ними, так и уровень реферирования, а их ps - значимость этих различий. Если у вас есть 2 фактора, у обоих будут уровни реферирования, и перехват будет означать тех людей, которые находятся в обеих реферирующих группах (например, young F), а другие уровни будут отличаться от данного уровня фактора 1 с уровень ссылки другого фактора и обе группы уровней ссылок. Например , oldэто old F- `молодой F , & M` это young M- young F.
gung - Восстановить Монику

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

@ hans0l0, я понятия не имею. Там не должно быть никакой разницы.
gung - Восстановить Монику

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

2

Оценочные коэффициенты будут одинаковыми при условии, что вы создадите фиктивные переменные (то есть числовые), соответствующие R. Например: давайте создадим фальшивые данные и подгоним коэффициент Пуассона, используя коэффициент. Обратите внимание, что 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

Поскольку результат имеет три уровня, я создаю две фиктивные переменные (dummy.1 = 0, если result = 2, и dummy.2 = 1, если result = 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

Как видите, расчетные коэффициенты одинаковы. Но вы должны быть осторожны при создании фиктивных переменных, если хотите получить тот же результат. Например, если я создаю две фиктивные переменные как (dummy.1 = 0, если результат = 1, и dummy.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.