2012-12-02 23 views
2

我正在寻找一种方法将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。

+0

类似问题[这里](http://stackoverflow.com/q/6882709/684229)和[这里](HTTP://统计。 stackexchange.com/questions/11000/how-does-r-handle-missing-values-in-lm)。 – TMS

回答

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

会做的伎俩。相对于这两个预测结果及评价casewise删除

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

na.omitna.exclude都这样做:

+0

你能解释一下吗?什么是'“[< - ”'? –

+0

@BrandonBertelsen函数'“[< - ”(x1,x2,x3,x4)'与x1 [x2,x3] < - x4相似,但是x1不变并返回一个新对象。 –

0

这也许可能是解决方案,但首先,你不需要C()在data.frame

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

这会复制残差。而不是追加NA –

+0

我已经删除了'data.frame'中的'c()' – metasequoia

+0

如果Y是NA,该怎么办?如果另一个预测变量是NA,该怎么办?对此不太强大,因此可能不是一种方法。 – TMS

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) 

如果您需要维护订单。使用join()方法从plyr包:

library(plyr) 
join(df,tmp) 
+0

无法通过[按行名称合并](http://stackoverflow.com/a/7739757/684229)简化此代码? – TMS

+0

有更简单的解决方案,请参阅我的回答 – TMS

7

简单地改变na.actionna.exclude。它们仅区别于residuals()fitted()之类的提取器函数将使用NAs填充其输出,对于na.exclude省略的情况,因此具有与输入变量相同长度的输出。

(这是最好的解决办法找到here

+0

这是您正在寻找的一般解决方案,它可以处理任意数量的预测变量或DV中的错误,以及lm和lme4。 – Ruben

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.