我正在寻找一种方法将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 :(得分:7)
只需将na.action
更改为na.exclude
:
residuals(lm(Y ~ X, data = df, na.action = na.exclude))
na.omit
和na.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.