2015-12-07 8 views
5

Ich passte ein generalisiertes Additivmodell mit gam aus dem mgcv Paket. Ich habe eine Datentabelle, die meine abhängige Variable Y, eine unabhängige Variable X, andere unabhängige Variablen Oth und einen zweistufigen Faktor Fac enthält. Ich mag folgendes ModellR: GAM mit Fit auf Teilmenge von Daten

Y ~ s(X) + Oth

aber mit der zusätzlichen Einschränkung passen, dass der s(X) Begriff nur auf einem der beiden Stufen des Faktors fit ist, sagen Fac==1. Die anderen Begriffe Oth sollten mit den ganzen Daten übereinstimmen.

Ich versuchte zu erkunden s(X,by=Fac), aber dies beeinflusst die Passform für Oth. Mit anderen Worten, ich möchte die Überzeugung zum Ausdruck bringen, dass sich X nur dann auf Y bezieht, wenn Fac==1, sonst macht es keinen Sinn zu modellieren X.

Antwort

1

Wenn ich es richtig verstehe, denken Sie über einige Modell mit Interaktion wie folgt aus:

Y ~ 0th + (Fac==1)*s(X) 

Wenn Sie wollen „die Überzeugung Ausdruck verleihen, dass X-Y bezieht sich nur, wenn Fac==1“ don Behandle Fac nicht als factor, sondern als numeric Variable. In diesem Fall erhalten Sie numeric Interaktion und nur einen Satz von coefficients (wenn es ein factor gibt, wo zwei). Diese Art von Modell ist ein varying coefficient model.

# some data 
data <- data.frame(th = runif(100), 
       X = runif(100), 
       Y = runif(100), 
       Fac = sample(0:1, 100, TRUE)) 
data$Fac<-as.numeric(as.character(data$Fac)) #change to numeric 
# then run model 
gam(Y~s(X, by=Fac)+th,data=data) 

finden Sie in der Dokumentation für by Option in der Dokumentation ?s

+0

Bitte geben Sie ein funktionierendes Beispiel an. Bonusfrage: Was ist, wenn mein Modell komplizierter ist und ich bereits einen anderen Faktor in meinem Modell habe, sagen wir 's (X, by = Fac2)'. Wie kann ich das oben genannte Design integrieren? Kann ich 's (X, mit = c (Fac, Fac2))' '? Das scheint der Doc nicht zu erlauben. – yannick

+0

Ich füge das Beispiel hinzu. Mit dem zweiten Faktor kommt es darauf an, was du erreichen willst? Was ist das Modell in diesem Fall? Zum Beispiel, wenn 'X' sich auf' Y' bezieht, nur wenn 'Fac == 0' und' Fac2 == 0', können Sie eine neue Variable 'New_Fac = Fac * Fac1' erstellen und dann' s (X, durch = New_Fac) '. Bitte akzeptieren Sie die Antwort, wenn es hilfreich war. Wenn Sie mir die Spezifikation Ihres Modells geben, kann ich darüber nachdenken :) – Maju116

+0

Ihre Antwort, die korrekt ist, erlaubt es nicht, eine Anpassung pro Faktor Faktor 'Fac2' zu machen, zusätzlich zu dem, was hier offengelegt wird, nämlich den Fall auszuschließen' Fac == 0'. Ich habe das in der Frage nicht erwähnt, aber es ist etwas, was ich in meiner Bewerbung brauche, und ich habe es aus Gründen der Klarheit weggelassen. Also werde ich Ihre sehr willkommene Antwort akzeptieren, aber es wäre großartig, wenn Sie eine Lösung dafür vorschlagen könnten. Ich kann die Frage auch ändern, wenn Sie bevorzugen. – yannick

5

Billig Trick: Verwenden Sie eine Hilfsvariable, die X ist, wenn Fac == 1 und 0 woanders.

library("mgcv") 
library("ggplot2") 


# simulate data 

N <- 1e3 

dat <- data.frame(covariate = runif(N), 
        predictor = runif(N), 
        group = factor(sample(0:1, N, TRUE))) 

dat$outcome <- rnorm(N, 
        1 * dat$covariate + 
        ifelse(dat$group == 1, 
          .5 * dat$predictor + 
          1.5 * sin(dat$predictor * pi), 
          0), .1) 

# some plots 

ggplot(dat, aes(x = predictor, y = outcome, 
       col = group, group = group)) + 
    geom_point() 

ggplot(dat, aes(x = covariate, y = outcome, 
       col = group, group = group)) + 
    geom_point() 

# create auxiliary variable 

dat$aux <- ifelse(dat$group == 1, 
        dat$predictor, 
        0) 

# fit the data 

fit1 <- gam(outcome ~ covariate + s(predictor, by = group), 
      data = dat) 

fit2 <- gam(outcome ~ covariate + s(aux, by = group), 
      data = dat) 

# compare fits 

summary(fit1) 

summary(fit2) 
+0

Ist dies die richtige Antwort war, der Wert, den Sie auf die Hilfsgröße in dem Fall geben, wo der Prädiktor (hier nicht zu modellierenden ist, 0) sollte keinen Einfluss auf die Passgenauigkeit haben. Wenn Sie es jedoch auf 10 setzen, sehen Sie, dass sich der Schnittpunkt stark ändert. – yannick

+0

Sure @yannick, das ist nur ein Trick, um die Gam-Funktion zu "betrügen", um die 'model.matrix' zu erstellen, wie Sie sie brauchen. Ich bin mir nicht sicher, wie ich es sonst machen soll. – qenvio

Verwandte Themen