2017-11-30 9 views
3

Ich verwende derzeit eine Methode zur Variablenauswahl, bei der ich feststellen muss, ob sich der Koeffizient für eine bestimmte Variable zwischen Modellen mit verschiedenen Kombinationen von Variablen um mehr als 20% geändert hat. Ich habe versucht:Vergleichen von Koeffizienten zweier verschiedener linearer Modelle in R

abs(model1$coefficients - model2$coefficients)/model1$coefficients 

aber die Vektoren sind nicht die gleiche Länge (da gibt es verschiedene Variablen in jedem Modell), so dass sie nicht richtig ausgerichtet ist. Gibt es eine Möglichkeit, Koeffizienten über Modelle hinweg mit demselben Variablennamen zu vergleichen? Ich könnte das mit der Hand machen, aber es gibt 50+ Koeffizienten und 10 Modelle, also würde es ewig dauern.

Tut mir leid, wenn das offensichtlich ist, aber ich konnte es nicht herausfinden. Ich habe nach Antworten gesucht, um mich in die richtige Richtung zu lenken, aber sie alle haben mit statistischen Vergleichen von Koeffizienten zu tun und enthalten keinen Code, der mir hilft, dieses Problem zu lösen.

Antwort

1

Sie geben keine Beispieldaten, daher werde ich Daten basierend auf einem Modell y = a + b * x1 + c * x2 + e simulieren, wobei e ~ N(0, 1).

Ich passte dann zwei Modelle: y ~ x1 und y ~ x1 + x2 und verwenden Sie eine benutzerdefinierte Funktion getEstimates, um Parameter für den gleichen Prädiktor aus beiden Modellen zu extrahieren. Es ist auch eine gute Idee, die Bedeutung zusätzlicher Prädiktoren mithilfe einer ANOVA zu bewerten.

# Simulate some data 
set.seed(2017); 
generateData <- function(a = 1, b = 2, c = -2, nPoints = 1000) { 
    x1 <- runif(nPoints); 
    x2 <- runif(nPoints); 
    y <- a + b * x1 + c * x2 + rnorm(nPoints); 
    return(data.frame(y = y, x1 = x1, x2 = x2)); 
} 
df <- generateData(); 


# Fit1: y ~ a + b * x1 
fit1 <- lm(y ~ x1, data = df); 

# Fit2: y ~ a + b * x1 + c * x2 
fit2 <- lm(y ~ x1 + x2, data = df); 

# ANOVA to explore importance of variable 
anova(fit1, fit2); 
#Analysis of Variance Table 
# 
#Model 1: y ~ x1 
#Model 2: y ~ x1 + x2 
# Res.Df  RSS Df Sum of Sq  F Pr(>F) 
#1 998 1292.20 
#2 997 994.46 1 297.74 298.5 < 2.2e-16 *** 
#--- 
#Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

# Function to get estimates for parameter(s) par 
# from two models fit1 and fit2 
getEstimates <- function(par, fit1, fit2) { 
    lst <- lapply(par, function(x) 
     c(summary(fit1)$coef[x, 1], summary(fit2)$coef[x, 1])); 
    names(lst) <- par; 
    return(lst); 
} 

# Get coefficient for predictor x1 
est <- getEstimates("x1", fit1, fit2); 

Basierend auf der Ausgabe von getEstimates können Sie dann die relative Änderung eines Parameters zwischen zwei Modellen berechnen.

# Calculate relative change in estimated x1 coefficient from both models 
lapply(est, function(x) abs(x[1] - x[2])/x[1]); 
#$x1 
#[1] 0.0282493 
+0

Danke für die Antwort. Ich erhalte diesen Fehler, wenn ich versuche, die Funktion auszuführen: "Fehler in der Zusammenfassung (fit1) $ coef [x, 1]: Index außerhalb der Grenzen". Weißt du, warum das ein Problem sein könnte? Auch verwende ich die GLM-Funktion, weil es ein Probit-Modell ist, falls sich irgendetwas ändert. – bbernicker

+0

@bbernicker Es ist ein bisschen schwierig, ohne irgendwelche Beispieldaten zu debuggen. Wie hast du 'getEstimates' genannt? Können Sie Ihre Quelldaten "dutchieren" (oder als Beispiel angeben) und Ihre ursprüngliche Frage aktualisieren, um die "glm" -Aufrufe für zwei verschiedene Modelle einzubeziehen. 'getEstimates' funktioniert immer noch, wenn ich ein verallgemeinertes lineares Modell verwende. –

+0

@bbernicker PS. Offensichtlich funktioniert 'getEstimates' nur mit Prädiktorparametern, die in beiden Modellen vorhanden sind. In meinem Beispiel wird 'getEstimates (" x2 ", fit1, fit2)' einen Fehler verursachen, da 'fit1' nicht' x2' als Modellvorhersage enthält. Sie können 'getEstimates' optimieren, um eine Sicherheitsprüfung durchzuführen. –

Verwandte Themen