将残差绑定到具有缺失值的输入数据集

时间:2012-12-02 19:06:44

标签: r dataframe plyr regression

我正在寻找一种方法将lm残差绑定到输入数据集。该方法必须为缺失的残差添加NA,并且残差应对应于正确的行。

示例数据:

N <- 100 
Nrep <- 5 
X <- runif(N, 0, 10) 
Y <- 6 + 2*X + rnorm(N, 0, 1) 
X[ sample(which(Y < 15), Nrep) ] <- NA
df <- data.frame(X,Y)

residuals(lm(Y ~ X,data=df,na.action=na.omit))

残差应该与df绑定。

5 个答案:

答案 0 :(得分:7)

只需将na.action更改为na.exclude

即可
residuals(lm(Y ~ X, data = df, na.action = na.exclude))

na.omitna.exclude都会针对预测变量和标准进行逐式删除。它们的不同之处在于,residuals()fitted()这样的提取器函数会将其输出填充为具有na.exclude的省略情况的NA,因此具有与输入变量相同长度的输出。 / p>

(这是找到的最佳解决方案here

答案 1 :(得分:1)

使用合并或加入。

N <- 100 
Nrep <- 5 
X <- runif(N, 0, 10) 
Y <- 6 + 2*X + rnorm(N, 0, 1) 
X[ sample(which(Y < 15), Nrep) ] <- NA
df <- data.frame(X,Y)

df$id <- rownames(df)

res <- residuals(lm(Y ~ X,data=df,na.action=na.omit))
tmp <- data.frame(res=res)
tmp$id <- names(res)

merge(df,tmp,by="id",sort=FALSE,all.x=TRUE)

如果您需要维护订单。使用plyr包中的join():

library(plyr) 
join(df,tmp)

答案 2 :(得分:0)

这可能是解决方案,但首先,您不需要data.frame

中的c()
df <- data.frame(X,Y)
df$Res[!is.na(X)]<-residuals(lm(Y ~ X,data=df,na.action=na.omit))

答案 3 :(得分:0)

"[<-"(df, !is.na(df$X), "res", residuals(lm(Y ~ X,data=df,na.action=na.omit)))

会做到这一点。

答案 4 :(得分:0)

N <- 100 
Nrep <- 5 
X <- runif(N, 0, 10) 
Y <- 6 + 2*X + rnorm(N, 0, 1) 
X[ sample(which(Y < 15), Nrep) ] <- NA
df <- data.frame(X,Y)

R.all=as.numeric(rep(NA,length(X)))  # numeric vector with missing values
res=residuals(lm(Y ~ X,data=df,na.action=na.omit))  
i=as.numeric(names(res)) # vector locations of non-missing residuals
R.all[i]=res;R.all     # assign residuals to their correct positions.