如何在R中的回归中处理残差中的NA?

c00*_*ter 9 regression r missing-data

所以我在R NA中的lm横截面回归的残差中遇到了一些问题.

问题本身不是NA价值观,而是R呈现它们的方式.

例如:

test$residuals
#          1          2          4          5 
#  0.2757677 -0.5772193 -5.3061303  4.5102816 
test$residuals[3]
#        4 
# -5.30613 
Run Code Online (Sandbox Code Playgroud)

在这个简单的例子中,一个NA值会使其中一个残差丢失.当我提取残差时,我可以清楚地看到第三个索引丢失.到目前为止这么好,这里没有抱怨.问题是相应的数字向量现在是一个较短的项目,所以第三个索引实际上是第四个.我怎样才能让R返回这些残差,即明确显示NA而不是跳过索引?

test$residuals
#          1          2          3          4          5 
#  0.2757677 -0.5772193         NA -5.3061303  4.5102816
Run Code Online (Sandbox Code Playgroud)

我需要跟踪所有个体残差,这样如果我能用这种方式提取它们会让我的生活更轻松.

c00*_*ter 16

我刚发现这个谷歌搜索更深一点.该resid上的功能lmna.action=na.exclude是要走的路.


J B*_*ker 6

另一个想法是利用与作为 的输入提供的数据框关联的行名称lm。在这种情况下,残差应保留源数据中的名称。访问示例中的残差将为 提供 -5.3061303 的值,为test$residuals["4"]提供 NA的值test$residuals["3"]

然而,这并不能完全回答你的问题。下面说明了一种完全按照您的要求将 NA 值返回到残差中的方法:

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA)
> Z<-lm(y~x,data=D)
> D[names(Z$residuals),"residual"]<-Z$residuals
> D
   x   y residual
1 NA 2.1       NA
2  2 3.2    -0.28
3  3 4.9     0.55
4  4 5.0    -0.22
5  5 6.0    -0.09
6  6 7.0     0.04
Run Code Online (Sandbox Code Playgroud)

如果您要根据回归结果进行预测,您可能需要na.action=na.exclude在 中指定lm。请参阅帮助结果na.omit进行讨论。请注意,简单地指定na.exclude实际上并不会将 NA 值放回到残差向量本身中。

正如之前的答案中所述,resid( 的同义词residuals)提供了一个通用访问函数,其中如果na.exclude在 中指定,则残差将包含所需的 NA 值lm。使用resid可能是更通用和更干净的方法。在这种情况下,上述示例的代码将更改为:

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA)
> Z<-lm(y~x,data=D,na.action=na.exclude)
> D$residuals<-residuals(Z)
Run Code Online (Sandbox Code Playgroud)