4

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

4

5 回答 5

8

只需将其更改na.actionna.exclude

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

na.omit并且na.exclude两者都对预测变量和标准进行逐案删除。它们的不同之处仅在于提取器函数类似于residuals()fitted()将用 NA 填充它们的输出以用于省略的情况na.exclude,因此具有与输入变量相同长度的输出。

(这是在这里找到的最佳解决方案)

于 2013-07-31T18:23:07.017 回答
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)
于 2012-12-02T19:19:36.023 回答
0

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

df <- data.frame(X,Y)
df$Res[!is.na(X)]<-residuals(lm(Y ~ X,data=df,na.action=na.omit))
于 2012-12-02T19:15:37.547 回答
0
"[<-"(df, !is.na(df$X), "res", residuals(lm(Y ~ X,data=df,na.action=na.omit)))

会成功的。

于 2012-12-02T19:44:18.773 回答
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.
于 2017-07-19T18:56:06.233 回答