Ich habe festgestellt, dass bei R-, Poisson- und negativen Binomial- (NB-) Regressionen für kategoriale, aber nicht kontinuierliche Prädiktoren immer dieselben Koeffizienten zu passen scheinen.
Beispiel: Hier ist eine Regression mit einem kategorialen Prädiktor:
data(warpbreaks)
library(MASS)
rs1 = glm(breaks ~ tension, data=warpbreaks, family="poisson")
rs2 = glm.nb(breaks ~ tension, data=warpbreaks)
#compare coefficients
cbind("Poisson"=coef(rs1), "NB"=coef(rs2))
Hier ist ein Beispiel mit einem kontinuierlichen Prädiktor, bei dem Poisson und NB unterschiedliche Koeffizienten haben:
data(cars)
rs1 = glm(dist ~ speed, data=cars, family="poisson")
rs2 = glm.nb(dist ~ speed, data=cars)
#compare coefficients
cbind("Poisson"=coef(rs1), "NB"=coef(rs2))
(Natürlich zählen diese Daten nicht und die Modelle sind nicht aussagekräftig ...)
Dann habe ich den Prädiktor in einen Faktor umcodiert und die beiden Modelle passen wieder zu den gleichen Koeffizienten:
library(Hmisc)
speedCat = cut2(cars$speed, g=5)
#you can change g to get a different number of bins
rs1 = glm(cars$dist ~ speedCat, family="poisson")
rs2 = glm.nb(cars$dist ~ speedCat)
#compare coefficients
cbind("Poisson"=coef(rs1), "NB"=coef(rs2))
summary(rs2)
Warum sind die Koeffizienten genau gleich? Und warum nur für kategoriale Prädiktoren?
Bearbeiten Sie # 1
Hier ist ein Beispiel mit zwei nicht orthogonalen Prädiktoren. In der Tat sind die Koeffizienten nicht mehr dieselben:
data(cars)
#make random categorical predictor
set.seed(1); randomCats1 = sample( c("A","B","C"), length(cars$dist), replace=T)
set.seed(2); randomCats2 = sample( c("C","D","E"), length(cars$dist), replace=T)
rs1 = glm(dist ~ randomCats1 + randomCats2, data=cars, family="poisson")
rs2 = glm.nb(dist ~ randomCats1 + randomCats2, data=cars)
#compare coefficients
cbind("Poisson"=coef(rs1), "NB"=coef(rs2))
Das Einbeziehen eines weiteren Prädiktors bewirkt, dass die Modelle unterschiedliche Koeffizienten anpassen, auch wenn der neue Prädiktor kontinuierlich ist. Hat das etwas mit der Orthogonalität der Dummy-Variablen zu tun, die ich in meinem ursprünglichen Beispiel erstellt habe?
rs1 = glm(dist ~ randomCats1 + speed, data=cars, family="poisson")
rs2 = glm.nb(dist ~ randomCats1 + speed, data=cars)
#compare coefficients
cbind("Poisson"=coef(rs1), "NB"=coef(rs2))