2013-03-13 16 views
5

Ich bin auf der Suche nach Vorschlägen für den Umgang mit NA in linearen Regressionen, wenn alle Vorkommen einer unabhängigen/erklärenden Variable NA sind (d. H. unten).lineares Modell, wenn alle Vorkommen von unabhängigen Variablen sind NA

Ich weiß, die offensichtliche Lösung wäre, die unabhängige/erklärende Variable aus dem Modell auszuschließen, aber ich bin durch mehrere Regionen Looping und würde bevorzugen, keine anderen funktionalen Formen für jede Region haben.

Unten finden Sie einige Beispieldaten:

set.seed(23409) 
n <- 100 

time <- seq(1,n, 1) 
x1 <- cumsum(runif(n))   
y <- .8*x1 + rnorm(n, mean=0, sd=2) 
x2 <- seq(1,n, 1)  
x3 <- rep(NA, n)    
df <- data.frame(y=y, time=time, x1=x1, x2=x2, x3=x3) 

# Quick plot of data 
library(ggplot2) 
library(reshape2) 
df.melt <-melt(df, id=c("time")) 

p <- ggplot(df.melt, aes(x=time, y=value)) + 
    geom_line() + facet_grid(variable ~ .) 
p 

ich die Dokumentation für lm gelesen haben und versucht, verschiedene na.action Einstellungen ohne Erfolg:

lm(y~x1+x2+x3, data=df, singular.ok=TRUE) 

lm(y~x1+x2+x3, data=df, na.action=na.omit) 
lm(y~x1+x2+x3, data=df, na.action=na.exclude) 

lm(y~x1+x2+x3, data=df, singular.ok=TRUE, na.exclude=na.omit) 
lm(y~x1+x2+x3, data=df, singular.ok=TRUE, na.exclude=na.exclude) 

Gibt es eine Möglichkeit lm ohne Fehler zu laufen zu bekommen und geben Sie einfach einen Koeffizienten für die erklärende Reflexion der fehlenden Erklärungskraft (dh entweder Null oder NA) von der betreffenden Variable zurück?

+0

Ein interessantes Problem, es ist interessant, die Ergebnisse von 'model.matrix suchen (y ~ x1 + x2 + x3, df)' - Ich denke, das ist, wo das Problem auftritt. Das Problem bei der Verwendung von "na.action" ist, dass dies von Fall zu Fall funktioniert. Wenn also irgendwelche Werte der erklärenden Variablen NA sind, wird der Fall (Zeile) weggelassen. – mnel

+3

Könnten Sie einfach überprüfen, ob die bestimmte Variable fehlt, indem Sie 'all (is.na (var))' verwenden und dann die Formel erstellen, um mit 'paste' und' as.formula' an 'lm' zu übergeben? I.e. - Wenn die Variable ganz aus NA besteht, löschen Sie sie aus dem Modell und speichern Sie möglicherweise eine Liste aller Formelaufrufe, die am Ende verwendet wurden. – thelatemail

+1

Wenn Sie @thelatemails Kommentar hinzufügen, sollten Sie wahrscheinlich in Betracht ziehen, Variablen zu entfernen, wenn ein Teil (z. B. die Hälfte oder ein Drittel) ihrer Werte fehlt. Andernfalls werden viele Ihrer Fälle innerhalb der Gruppe (wie bei der listenweisen Löschung) verworfen und die Koeffizienten könnten für die Schätzung stark verzerrt sein. – ndoogan

Antwort

2

Hier ist eine Idee:

set.seed(23409) 
n <- 100 

time <- seq(1,n, 1) 
x1 <- cumsum(runif(n))   
y <- .8*x1 + rnorm(n, mean=0, sd=2) 
x2 <- seq(1,n, 1)  
x3 <- rep(NA, n)    
df <- data.frame(y=y, time=time, x1=x1, x2=x2, x3=x3) 

replaceNA<-function(x){ 
    if(all(is.na(x))){ 
    rep(0,length(x)) 
    } else x 

} 

lm(y~x1+x2+x3, data= data.frame(lapply(df,replaceNA))) 
Call: 
lm(formula = y ~ x1 + x2 + x3, data = data.frame(lapply(df, replaceNA))) 

Coefficients: 
(Intercept)   x1   x2   x3 
    0.05467  1.01133  -0.10613   NA 

lm(y~x1+x2, data=df) 
Call: 
lm(formula = y ~ x1 + x2, data = df) 

Coefficients: 
(Intercept)   x1   x2 
    0.05467  1.01133  -0.10613 

So ersetzen Sie die Variablen, die nur NA ‚s mit variabler enthalten, die nur 0'en enthält. Sie erhalten den Koeffizientenwert NA, aber alle relevanten Teile der Modellanpassungen sind gleich (erwarte qr-Zerlegung, aber wenn Informationen darüber benötigt werden, können sie leicht modifiziert werden). Beachten Sie, dass die Komponente summary(fit)$alias (siehe ?alias) möglicherweise nützlich ist.

Dies scheint Ihre andere Frage zu beziehen: Replace lm coefficients in [r]

3

Sie können keine Spalte mit allen NA Werten einfügen. Es tut seltsame Dinge zu model.matrix

x1 <- 1:5 
x2 <- rep(NA,5) 

model.matrix(~x1+x2) 
    (Intercept) x1 x2TRUE 
attr(,"assign") 
[1] 0 1 2 
attr(,"contrasts") 
attr(,"contrasts")$x2 
[1] "contr.treatment" 

So Ihre Alternative, um die Modellformel auf der Basis der Daten programmatisch zu erstellen ist. wie

Etwas ...

make_formula <- function(variables, data, response = 'y'){ 
    if(missing(data)){stop('data not specified')} 
    using <- Filter(variables,f= function(i) !all(is.na(data[[i]]))) 

    deparse(reformulate(using, response)) 
} 

variables <- c('x1','x2','x3') 

make_formula(variables, data =df) 

[1] "y ~ x1 + x2" 

I deparse verwendet habe eine Zeichenfolge zurück, so dass es von der Erstellung der Formel in der Funktion keine environment Probleme ist. lm kann glücklich eine Zeichenkette nehmen, die eine gültige Formel ist.

+0

+1 Sehr schönes Stück Code, da ich gerade einige Modellbau-Funktionen etc. entwerfe, enthielt dies einige interessante und möglicherweise nützliche Ideen (Neuformatierungsfunktion war für mich völlig neu). –

Verwandte Themen