【问题标题】:Bind residuals to input dataset with missing values [duplicate]将残差绑定到具有缺失值的输入数据集[重复]
【发布时间】:2012-11-20 07:05:27
【问题描述】:

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

【问题讨论】:

标签: r dataframe plyr regression


【解决方案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)

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.

【讨论】:

    【解决方案2】:

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

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

    na.omitna.exclude 都对预测变量和标准进行逐个删除。它们的区别仅在于residuals()fitted() 之类的提取器函数将对na.exclude 省略的情况用NA 填充它们的输出,因此输出的长度与输入变量的长度相同。

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

    【讨论】:

    • 这是您正在寻找的通用解决方案,它适用于任意数量的预测变量或 DV 中的缺失,使用 lm 和 lme4。
    【解决方案3】:
    "[<-"(df, !is.na(df$X), "res", residuals(lm(Y ~ X,data=df,na.action=na.omit)))
    

    会成功的。

    【讨论】:

    • 你能解释一下吗? "[&lt;-" 是什么?
    • @BrandonBertelsen 函数"[&lt;-"(x1, x2, x3, x4) 类似于x1[x2, x3] &lt;- x4,但保持x1 不变并返回一个新对象。
    【解决方案4】:

    使用合并或连接。

    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)
    

    【讨论】:

    • 这段代码不能用merging by row names简化吗?
    • 有更简单的解决方案,看我的回答
    【解决方案5】:

    这可能是一个解决方案,但首先,你不需要在 data.frame 中使用 c()

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

    【讨论】:

    • 这会复制残差。而不是附加 NA
    • 我已经删除了data.frame中的c()
    • 如果 Y 是 NA 怎么办?如果另一个预测变量是 NA 怎么办?对此不是很健壮,因此可能不是一条路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多