当所有出现的自变量都是NA时的线性模型

时间:2013-03-13 22:12:36

标签: r dataframe lm na

我正在寻找关于如何在所有出现的独立/解释变量都是NA(即x3以下)的情况下处理NA的线性回归的建议。

我知道明显的解决方案是从模型中排除有问题的独立/解释变量,但我循环遍历多个区域,不希望每个区域都有不同的功能形式

以下是一些示例数据:

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

我已阅读lm的文档并尝试了各种na.action设置但未成功:

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)

有没有办法让lm无误地运行,只需返回一个系数,用于解释所讨论的变量缺乏解释力(即零或NA)的解释?

2 个答案:

答案 0 :(得分:3)

您将无法包含所有NA值的列。这对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"

因此,您可以选择以编程方式根据数据创建模型公式。

像...一样的东西。

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"

我使用deparse返回一个字符串,以便在函数中创建公式时没有environment个问题。 lm可以愉快地获取一个有效公式的字符串。

答案 1 :(得分:3)

这是一个想法:

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 

因此,将仅包含NA的变量替换为仅包含0的变量。你得到系数值NA,但模型拟合的所有相关部分是相同的(期望qr分解,但如果需要有关它的信息,可以很容易地修改它)。请注意,组件summary(fit)$alias(请参阅?alias)可能很有用。

这似乎与您的其他问题有关:Replace lm coefficients in [r]