Hiểu về việc tạo biến giả (thủ công hoặc tự động) trong GLM


13

Nếu một biến nhân tố (ví dụ: giới tính với các mức M và F) được sử dụng trong công thức glm, (các) biến giả được tạo ra và có thể được tìm thấy trong bản tóm tắt mô hình glm cùng với các hệ số liên quan của chúng (ví dụ: maleM)

Nếu, thay vì dựa vào R để phân tách nhân tố theo cách này, thì yếu tố này được mã hóa thành một chuỗi các biến số 0/1 (ví dụ: maleM (1 cho M, 0 cho F), maleF (1 cho F, 0 cho M) và các biến này sau đó được sử dụng làm biến số trong công thức glm, kết quả hệ số có khác nhau không?

Về cơ bản câu hỏi là: R có sử dụng phép tính hệ số khác khi làm việc với các biến nhân tố so với biến số không?

Câu hỏi tiếp theo (có thể được trả lời ở trên): ngoài hiệu quả của việc cho phép R tạo các biến giả, có vấn đề gì với các yếu tố mã hóa lại như một chuỗi các biến số 0,1 và thay vào đó sử dụng các biến số trong mô hình không?


2
Các hệ số sẽ giống nhau, mã hóa mặc định của R cho các yếu tố chính xác như bạn mô tả (đây được gọi là mã hóa "giả"). Nếu làm điều này bằng tay, bạn sẽ cần biết về "bẫy biến giả" - bạn không thể bao gồm tất cảNN1

@Affine dự đoán của tôi là nếu tôi cho ăn cả hai giới tính và giới tính, một trong số họ sẽ trả về NA cho các hệ số (với thông báo rằng một biến đã bị loại trừ vì số ít). Điều này có ý nghĩa bởi vì chúng hoàn toàn liên quan tuyến tính trong trường hợp này. Nhưng bạn nói rằng tôi không thể bao gồm tất cả N; điều đó có nghĩa là, mặc dù giới tính được đặt thành NA, nhưng điều đó sẽ dẫn đến sự khác biệt / vấn đề đối với hệ số giới tính? Hoặc, đơn giản hơn, nếu GLM / LM loại trừ các biến vì số ít, thì việc sử dụng một mô hình quá xác định có phải là một vấn đề không? (Tôi đồng ý với quan điểm của bạn - chỉ cần truy vấn các phân nhánh thực tế)
Bryan

Câu trả lời:


22

Các biến phân loại (được gọi là " các yếu tố " trong R) cần được biểu diễn bằng các mã số trong nhiều mô hình hồi quy. Có rất nhiều cách có thể để xây dựng mã số một cách thích hợp (xem danh sách tuyệt vời này tại trang trợ giúp thống kê của UCLA). Theo mặc định, R sử dụng mã hóa mức tham chiếu (mà R gọi là "contr.treatment") và gần như toàn bộ số liệu thống kê mặc định. Điều này có thể được thay đổi cho tất cả các độ tương phản cho toàn bộ phiên R của bạn bằng cách sử dụng các tùy chọn? Hoặc cho các phân tích / biến cụ thể bằng cách sử dụng ? Độ tương phản hoặc ? C (lưu ý vốn). Nếu bạn cần thêm thông tin về mã hóa mức tham chiếu, tôi sẽ giải thích nó ở đây: Hồi quy dựa trên các ngày trong tuần.

Một số người thấy mã hóa mức tham chiếu khó hiểu và bạn không phải sử dụng nó. Nếu bạn muốn, bạn có thể có hai biến cho nam và nữ; đây được gọi là cấp độ có nghĩa là mã hóa. Tuy nhiên, nếu bạn làm điều đó, bạn sẽ cần triệt tiêu chặn hoặc ma trận mô hình sẽ là số ít và hồi quy không thể phù hợp như @Affine lưu ý ở trên và như tôi giải thích ở đây: Mã hóa biến định tính dẫn đến điểm kỳ dị . Để chặn chặn, bạn sửa đổi công thức của mình bằng cách thêm -1hoặc +0tương tự: y~... -1hoặc y~... +0.

Sử dụng cấp độ có nghĩa là mã hóa thay vì mã hóa mức tham chiếu sẽ thay đổi các hệ số ước tính và ý nghĩa của các kiểm tra giả thuyết được in với đầu ra của bạn. Khi bạn có một yếu tố hai cấp độ (ví dụ: nam so với nữ) và bạn sử dụng mã hóa mức tham chiếu, bạn sẽ thấy phần chặn được gọi (constant)và chỉ có một biến được liệt kê trong đầu ra (có lẽ sexM). Chặn là giá trị trung bình của nhóm tham chiếu (có lẽ là nữ) và sexMlà sự khác biệt giữa giá trị trung bình của nam và trung bình của nữ. Giá trị p được liên kết với phần chặn là một test một mẫu cho dù mức tham chiếu có giá trị trung bình bằng và giá trị p được liên kết vớit0sexMcho bạn biết nếu giới tính khác nhau về phản ứng của bạn. Nhưng nếu bạn sử dụng mức có nghĩa là mã hóa thay vào đó, bạn sẽ có hai biến được liệt kê và mỗi giá trị p sẽ tương ứng với một test một mẫu cho dù giá trị trung bình của mức đó là . Đó là, không có giá trị p nào sẽ là một thử nghiệm cho dù giới tính có khác nhau hay không. 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
Cảm ơn bạn đã thêm mã: điều này chứng tỏ rõ ràng rằng việc chặn mã hóa tham chiếu = sexFbang trong ô có nghĩa là mã hóa (tôi cũng bị nhầm lẫn bởi "chuyện gì đã xảy ra" với biến N-1 ...) Có thể cần một câu hỏi khác, nhưng Điều này là dễ hiểu với một biến, còn 2 hoặc nhiều hơn thì sao? ví dụ: tuổi: "già" "trẻ". Trong mã hóa tế bào ref, các hệ số sẽ hiển thị cho sexMale, ageYoung (ví dụ) và tài khoản chặn cho cả hai sexF Gay và ageOld?
Bryan

1
Nếu bạn có một yếu tố w / 3 cấp độ, thì phần chặn là giá trị trung bình của cấp độ ref, và 2 mức còn lại sẽ được thể hiện trong đầu ra. Các hệ số của chúng sẽ là sự khác biệt giữa chúng và cấp độ ref & ps của chúng sẽ là tầm quan trọng của những khác biệt đó. Nếu bạn có 2 yếu tố, cả hai sẽ có cấp độ ref, và mức chặn sẽ là giá trị trung bình của những người thuộc cả hai nhóm ref (ví dụ young F:) và các cấp độ khác sẽ khác với cấp độ của yếu tố 1 w / cấp độ ref của yếu tố khác & nhóm cả hai cấp độ ref. Ví dụ oldold F- `trẻ F , & M` là young M- young F.
gung - Phục hồi Monica

1
Tôi đã chơi một chút với điều này và trải nghiệm sự R^2khác biệt đáng kể giữa cả hai phương pháp. Tôi biết đó chỉ là một R^2, nhưng có một lời giải thích cho điều đó?
hans0l0

@ hans0l0, tôi không có ý kiến ​​gì. Không nên có sự khác biệt.
gung - Phục hồi Monica

1
@ bối rối, bạn có thể tìm thấy trong tài liệu , ? glm .
gung - Tái lập Monica

2

Các hệ số ước tính sẽ cùng chủ đề với điều kiện bạn tạo các biến giả (tức là các số) phù hợp với R. Ví dụ: cho phép 'tạo dữ liệu giả và phù hợp với hệ số sử dụng Poisson glm. Lưu ý rằng glchức năng tạo ra một biến yếu tố.

> 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

Vì kết quả có ba cấp độ, tôi tạo hai biến giả (dummy.1 = 0 if result = 2 và dummy.2 = 1 if result = 3) và tái sử dụng các giá trị số này:

> 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

Như bạn có thể thấy các hệ số ước tính là như nhau. Nhưng bạn cần cẩn thận khi tạo các biến giả nếu bạn muốn có kết quả tương tự. Ví dụ: nếu tôi tạo hai biến giả là (dummy.1 = 0 if result = 1 và dummy.2 = 1 if result = 2) thì kết quả ước tính sẽ khác nhau như sau:

> 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

Điều này là do khi bạn thêm outcomebiến trong glm.1, R theo mặc định sẽ tạo hai biến giả là outcome2outcome3định nghĩa chúng tương tự dummy.1dummy.2trong glm.2, tức là mức kết quả đầu tiên là khi tất cả các biến giả ( outcome2outcome3) khác được đặt thành số không.


Cảm ơn các bằng chứng mã của các hệ số ước tính là như nhau. Ngoài ra, cảnh báo về việc tạo riêng của tôi rất hữu ích: Tôi muốn tạo riêng vì sau đó một biến mô hình sẽ liên kết trực tiếp với cột cơ sở dữ liệu theo tên (có thể hữu ích ở phía dưới), nhưng có vẻ như tôi cần hiểu các vấn đề với cách Tôi đi về làm điều này.
Bryan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.