所以我在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
在这个简单的示例中,NA
值会使其中一个残差丢失。当我提取残差时,我可以清楚地看到第三个索引丢失。到目前为止这么好,这里没有抱怨。问题是相应的数字向量现在是一个较短的项目,所以第三个索引实际上是第四个。如何让R返回这些残差,即明确显示NA
而不是跳过索引?
test$residuals
# 1 2 3 4 5
# 0.2757677 -0.5772193 NA -5.3061303 4.5102816
我需要跟踪所有个体残差,这样如果我能用这种方式提取它们会让我的生活变得更轻松。
答案 0 :(得分:16)
我刚刚发现this谷歌搜索更深一点。 resid
上的lm
功能na.action=na.exclude
是可行的方法。
答案 1 :(得分:3)
另一个想法是利用与作为lm
的输入提供的数据框相关联的行名称。在这种情况下,残差应保留源数据中的名称。访问示例中的残差,test$residuals["4"]
的值为-5.3061303,test$residuals["3"]
的值为NA。
然而,这并不能完全回答你的问题。在将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
如果您正在根据回归结果进行预测,则可能需要在na.action=na.exclude
中指定lm
。有关讨论,请参阅na.omit
的帮助结果。请注意,仅指定na.exclude
实际上并未将NA值放回残差向量本身。
如前面的回答所述,resid
(residuals
的同义词)提供了一种通用访问函数,如果na.exclude
中指定lm
,则残差将包含所需的NA值1}}。使用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)
答案 2 :(得分:1)
这里是一个说明策略,在lm帮助页面上使用了略微修改的示例。这是残差定义的直接应用:
## Annette Dobson (1990) "An Introduction to Generalized Linear Models".
## Page 9: Plant Weight Data.
# Two NA's introduced
weight <- c(4.17,5.58,NA,6.11,4.50,4.61,5.17,4.53,5.33,5.14,
4.81,4.17,4.41,3.59,5.87,3.83,6.03,NA,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
lm.D9 <- lm(weight ~ group)
rr2 <- weight- predict(lm.D9, na.action=na.pass)
Warning message:
In weight - predict(lm.D9, na.action = na.pass) :
longer object length is not a multiple of shorter object length
> rr2
[1] -0.8455556 0.5644444 NA 1.0944444 -0.5155556 -0.4055556 0.1544444
[8] -0.4855556 0.3144444 0.5044444 0.1744444 -0.4655556 -0.2255556 -1.0455556
[15] 1.2344444 -0.8055556 1.3944444 NA -0.6955556 -0.3255556
我认为直接修改lm对象是危险的,这样lm.D9 $残余就会返回该结果。