我正在寻找关于如何在所有出现的独立/解释变量都是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)的解释?
答案 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]