Eingeschränkte Probit-Regression in R.
Ich möchte ein Probit-Modell in R ausführen, um bestimmte Koeffizienten gleich zu setzen.
Betrachten Sie das einfache Beispiel, in dem vier Teams einmal zu Hause und einmal unterwegs gegeneinander spielen:
Home <- c('NY','NY','NY','LA','LA','LA','BOS','BOS','BOS','CHI','CHI','CHI')
Away <- c('LA','CHI','BOS','NY','CHI','BOS','LA','CHI','NY','LA','NY','BOS')
HomeWin <- c(1,1,0,1,0,1,0,1,0,0,0,1)
results <- data.frame(Home,Away,HomeWin)
Angenommen, ich möchte ein Probit-Modell ausführen, in das ich Dummy-Variablen für die Heimmannschaft und die Auswärtsmannschaft einbinde.
model <- glm(HomeWin ~ as.factor(Home) + as.factor(Away), family = binomial(link="probit"), data = results)
Das Ergebnis des Modells liefert Koeffizientenschätzungen für drei der Heimmannschaften (im Vergleich zu einer ausgeschlossenen Heimmannschaft) und drei der Auswärtsteams (im Vergleich zu einer ausgeschlossenen Auswärtsmannschaft). Angenommen, ich möchte das Modell so einstellen, dass die Schätzung des Heimatkoeffizienten für NY gleich der Schätzung des Abwesenheitskoeffizienten für NY ist (und dieselbe für die anderen Städte). Wie würde ich das machen? Meine vollständigen Daten enthalten 30 dieser Gruppen und deutlich mehr Variablen.
Antworten
Wenn ich die Frage richtig verstanden hat , was Sie eigentlich auf der Suche nach ist zu haben homeund awayauf entgegengesetzte Wirkungen haben. Z.B. beta_{home=NY} = - beta_{away=NY}. Es ist jedoch nicht ganz klar. Aber eine einfache Möglichkeit , dies zu erreichen, wäre manuell Variablen Dummy zu entwerfen, so dass Sie einen Dummy haben für NY_home_or_awaymit home=1und away=-1. In diesem Fall beta_NY_home_or_awaywürde sowohl zu Hause als auch unterwegs sein, aber ein negatives Vorzeichen haben.
library(dplyr)
competitors <- unique(unlist(results[, c('Home', 'Away')]))
new_cols <- lapply(competitors, function(x){
home <- results[['Home']] == x
away <- results[['Away']] == x
case_when(home ~ 1,
away ~ -1,
TRUE ~ 0)
})
names(new_cols) <- competitors
results_wide <- bind_cols(results, new_cols)
fit <- glm(HomeWin ~ NY + LA + CHI + BOS, data = results_wide, family = binomial('probit'))
summary(fit)
Call:
glm(formula = HomeWin ~ NY + LA + CHI + BOS, family = binomial("probit"),
data = results_wide)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.64597 -0.73997 0.01633 1.19731 1.19731
Coefficients: (1 not defined because of singularities)
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.927e-02 3.823e-01 -0.077 0.939
NY 6.786e-01 6.676e-01 1.017 0.309
LA 6.786e-01 6.676e-01 1.017 0.309
CHI -2.898e-16 6.527e-01 0.000 1.000
BOS NA NA NA NA
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 16.636 on 11 degrees of freedom
Residual deviance: 14.537 on 8 degrees of freedom
AIC: 22.537
Number of Fisher Scoring iterations: 5
Beachten Sie, dass das Zeichen jetzt vom Zeichen abhängt, ob das Team ist Awayund Homewie Away=-1. Auch jeder statistische Test sollte nach einer solchen Transformation wahrscheinlich mit einiger Sorgfalt durchgeführt werden, da ihre Interpretation und Gültigkeit von anderen Variablen abhängt. Beachten Sie auch, dass ein Team NASchätzungen erhält , da die Dummies linear abhängig sind.
Sie können Dummy-Variablen für jeden Teamnamen erstellen, der entweder als Heim- oder Auswärtsname aufgeführt ist, und diese Dummies in der Regression verwenden.
(Das folgende Beispiel kann bei den von Ihnen angegebenen Beispieldaten eine numerische Leistung aufweisen, sollte jedoch mit den tatsächlichen Daten funktionieren.)
library(dplyr)
library(fastDummies)
teams <- results$Home %>% unique()
# function to add a dummy for a given team is either Home or Away
add_HoA <- function(df, team) {
HoA_str <- paste0('HoA_',team)
HoA <- ensym(HoA_str)
df <- df %>% mutate(!!HoA := (Home ==team | Away==team) %>% as.integer())
return (df)
}
for (team in teams) {
results <- add_HoA(results, team)
}
# using HoA_ variables for all teams
model2 <- glm(HomeWin ~ ., family = binomial(link="probit"),
data = results %>% dplyr::select(HomeWin, starts_with('HoA_')))
summary(model2)
results <- fastDummies::dummy_cols(results, select_columns = c('Home','Away'))
# using HoA_ variables for NY
model3 <- glm(HomeWin ~ ., family = binomial(link="probit"),
data = results %>%
dplyr::select(HomeWin, HoA_NY, starts_with('Home_'), starts_with('Away_')) %>%
dplyr::select(-Home_NY, -Away_NY))
summary(model3)
# using HoA_ variables for BOS
model4 <- glm(HomeWin ~ ., family = binomial(link="probit"),
data = results %>%
dplyr::select(HomeWin, HoA_BOS, starts_with('Home_'), starts_with('Away_')) %>%
dplyr::select(-Home_BOS, -Away_BOS))
summary(model4)