GLM'de kukla (manuel veya otomatik) değişken oluşturmayı anlama


13

Glm formülünde bir faktör değişkeni (örn. M ve F seviyeli cinsiyet) kullanılırsa, kukla değişkenler oluşturulur ve glm modeli özetinde ilişkili katsayılarıyla (örn. Cinsiyet C) bulunabilir.

Faktörü bu şekilde bölmek için R'ye güvenmek yerine, faktör bir dizi sayısal 0/1 değişkeni (örneğin, cinsiyetM (M için 1, F için 0), cinsiyetF (F için 1, M) ve bu değişkenler daha sonra glm formülünde sayısal değişkenler olarak kullanılır, katsayı sonucu farklı olur mu?

Temel olarak soru şudur: R, faktör değişkenleriyle sayısal değişkenlere karşı çalışırken farklı bir katsayı hesabı kullanıyor mu?

Takip sorusu (muhtemelen yukarıdakiler tarafından cevaplanmıştır): R'nin kukla değişkenler oluşturmasına izin vermenin verimliliğinin yanı sıra, bir dizi sayısal 0,1 değişkeni olarak yeniden kodlama faktörleri ve bunun yerine modelde kullanılmasıyla ilgili herhangi bir sorun var mı?


2
Katsayılar aynı olacaktır, R'nin faktörler için varsayılan kodlaması tam olarak tanımladığınız gibidir (buna "kukla" kodlama denir). Bunu manuel olarak yapıyorsanız, "kukla değişken tuzağı" nı bilmeniz gerekir - oluşturulan tüm değişkenleri dahil edemezsiniz, ancak sadece içerebilir (alternatif olarak kesişmeyi hariç tutun); aksi takdirde modeliniz aşılır. Faktör değişkenlerini kodlamanın başka yöntemleri de vardır. NN1
Affine

@ Tahminimce, hem cinsiyet hem de cinsiyet F ile beslenirsem, bunlardan biri katsayılar için NA döndürür (tek değişkenliğinden dolayı bir değişkenin hariç tutulduğu mesajıyla). Bu mantıklıdır, çünkü bu durumda mükemmel doğrusal olarak ilişkilidirler. Ama diyorsun ki bütün N'leri dahil edemem; bu, genderF NA olarak ayarlanmış olsa bile, cinsiyetM katsayısı için farklılıklara / sorunlara neden olacağı anlamına mı geliyor? Ya da, daha basit olarak, GLM / LM tekilliklerden dolayı değişkenleri dışlarsa, overidentified modeli kullanmak bir problem midir? (Ben sizin fikrinize katılıyorum - sadece pratik sonuçları sorgulayarak)
Bryan

Yanıtlar:


22

Kategorik değişkenlerin ( R'de " faktörler " olarak adlandırılır ) çoklu regresyon modellerinde sayısal kodlarla temsil edilmesi gerekir. Sayısal kodları uygun şekilde oluşturmanın pek çok olası yolu vardır ( UCLA'nın istatistik yardım sitesindeki bu harika listeye bakın ). Varsayılan olarak, R referans seviyesi kodlaması kullanır (R, "contr.treatment" olarak adlandırılır) ve hemen hemen varsayılan istatistik çapındadır. Bu,? Seçenekleri kullanılarak tüm R oturumunuz için tüm kontrastlar için veya ? Kontrastlar veya ? C (büyük harf notu) kullanılarak belirli analizler / değişkenler için değiştirilebilir . Referans seviyesi kodlaması hakkında daha fazla bilgiye ihtiyacınız varsa, bunu burada açıklarım : Örneğin haftanın günlerine dayanan regresyon.

Bazı insanlar referans seviyesi kodlamasını kafa karıştırıcı bulurlar ve kullanmak zorunda değilsiniz. İsterseniz, erkek ve kadın için iki değişkeniniz olabilir; buna seviye kodlama denir. Ancak, bunu yaparsanız, kesişimi bastırmanız gerekir veya model matrisi tekil olur ve regresyon yukarıdaki @Afine notları ve burada açıkladığım gibi sığamaz: Kalitatif değişken kodlaması tekilliklere yol açar . Kesmeyi bastırmak için formülü değiştirerek -1veya +0beğenerek: y~... -1veya y~... +0.

Seviyenin kullanılması, referans seviyesi kodlaması yerine kodlamanın, tahmin edilen katsayıları ve çıktınızla yazdırılan hipotez testlerinin anlamını değiştirecektir. İki seviyeli bir faktörünüz varsa (örn. Erkek ve kadın) ve referans seviyesi kodlaması kullandığınızda, kesilen çağrıyı görürsünüz (constant)ve çıktıda yalnızca bir değişken listelenir (belki de sexM). Kesişme, referans grubunun (belki de dişilerin) sexMortalamasıdır ve erkeklerin ortalaması ile kadınların ortalaması arasındaki farktır. Kesişim ile ilişkili p-değeri , referans seviyesinin ortalaması ve p-değeri ile ilişkili olup olmadığının tek örnekli bir - testidirt0sexMtepkinizde cinsiyetlerin farklı olup olmadığını söyler. Ancak bunun yerine seviye anlamına gelir kodlama kullanırsanız, listelenen iki değişkeniniz olur ve her bir p değeri , bu düzeyin ortalamasının olup olmadığının tek örnekli bir testine karşılık gelir . Yani, p değerlerinin hiçbiri cinsiyetlerin farklı olup olmadığının bir testi olmayacaktır. 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
Kodun eklenmesi için teşekkürler: Bu açıkça referans hücre kodlamada kesişme = hücrede sexFemale kodlama anlamına gelir (Ben ayrıca N-1 değişkenine "ne oldu" ile karıştırıldı ...) Belki başka bir soruya ihtiyacı var, ama bu bir değişkenle anlaşılması kolaydır, ya 2 ya da daha fazla? örneğin yaş: "yaşlı" "genç". Ref hücre kodlamasında, katsayılar sexMale, ageYoung (örneğin) ve kesişim hesabı İKİ sexFemale ve ageOld için gösterilir mi?
Bryan

1
3 seviyeli bir faktörünüz varsa, kesme noktası ref seviyesinin ortalamasıdır ve diğer 2 çıktıda temsil edilir. Onların katsayıları hem b / t arasındaki fark, hem de ref seviyesi ve ps'leri bu farkların önemi olacaktır. 2 faktörünüz varsa, her ikisinde de ref düzeyleri olacaktır ve kesişme, her iki ref grubunda (örneğin young F) bulunan kişilerin ortalaması olacaktır ve diğer seviyeler, verilen faktör 1 w / t seviyesinden farklı olacaktır. diğer faktörün ref seviyesi ve her iki ref seviyesi grubudur. Ör old. old F- `` genç , & FM '' young M- young F.
gung - Monica'yı eski

1
Bununla biraz oynadım ve R^2her iki yaklaşım arasında da önemli bir fark yaşadım . Bunun sadece bir olduğunu biliyorum R^2, ama bunun için bir açıklama var mı?
hans0l0

@ hans0l0, hiçbir fikrim yok. Hiçbir fark olmamalı.
gung - Monica'yı eski

1
@confused, bunu belgelerde bulabilirsiniz ,? glm .
gung - Monica'yı eski durumuna getirin

2

Tahmini katsayılar, R ile tutarlı olan kukla değişkenlerinizi (yani sayısal değişkenleri) yaratmanız koşuluyla aynı olacaktır. Örneğin: sahte bir veri oluşturalım ve bir Poisson glm faktörü kullanarak sığdıralım. glFonksiyonun bir faktör değişkeni oluşturduğunu unutmayın .

> 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

Sonucun üç seviyesi olduğundan, iki yapay değişken (sonuç = 2 ise yapay = 1 = 0 ve sonuç = 3 ise yapay = 2 = 1) oluşturuyorum ve bu sayısal değerleri kullanarak yeniden yerleştiriyorum:

> 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

Gördüğünüz gibi tahmini katsayılar aynı. Ancak aynı sonucu elde etmek istiyorsanız, kukla değişkenlerinizi oluştururken dikkatli olmanız gerekir. Örneğin (sonuç = 1 ise kukla = 1 ve sonuç = 2 ise kukla 2 = 1) olarak iki kukla değişken oluşturursam, tahmini sonuçlar aşağıdaki gibi farklıdır:

> 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

Eklediğinizde Bunun nedeni outcomeglm.1 içinde değişken varsayılan olarak Ar iki yapay değişken yani oluşturur outcome2ve outcome3ve benzer tanımlar onları dummy.1ve dummy.2sonucun ilk seviye tüm diğer kukla değişkenleri (zaman olduğu glm.2 yani içinde outcome2ve outcome3) olarak ayarlanır sıfır.


Tahmini katsayıların aynı olduğunun kod kanıtı için teşekkürler. Ayrıca kendi oluşturmayla ilgili uyarı yararlıdır: Kendi modelimi oluşturmak istedim, çünkü o zaman bir model değişkeni doğrudan bir veritabanı sütununa adıyla (aşağı akışta yararlı olabilir) geri bağlanır, ancak sorunları nasıl anladığım gibi görünüyor Bunu yapmaya devam ediyorum.
Bryan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.