Eingeschränkte Probit-Regression in R.

Oct 06 2020

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

3 Oliver Oct 07 2020 at 01:06

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.

2 KM_83 Oct 07 2020 at 01:01

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)