在R中编写命令以去除残差图中的异常值

时间:2014-10-08 00:09:19

标签: r outliers

我想在残差图中删除异常值(定义为平均值超过2个标准偏差)?

我应该写什么命令?

DF.mod.2<- lm(X ~ A+ B+ C+ D+ F, data=DF)

我通过这个命令获得了残差的平均值:

mean(resid(DF.mod.2))

和此命令的标准偏差:

sqrt(deviance(DF.mod.2)/df.residual(DF.mod.2))

那么如何从我的数据框中排除残差(距离平均值的距离超过2个标准差)?

残差图:

enter image description here

请帮助我...我正在处理这些数据一周,我不知道如何删除异常值!我被允许删除200个异常值(不是更多)。

2 个答案:

答案 0 :(得分:4)

我认为您可以使用以下内容进行过滤:

z[abs(z-mean(z))<2*sd(z)])

其中z为resid(DF.mod.2)

答案 1 :(得分:4)

有多种方法可以做到这一点。一个简单的策略是首先将残差保存到data.frame作为新列。然后,您可以添加第二个新列来标记残差是否为异常值。然后,您可以使用该列创建一个没有异常值的新data.frame,或者将当前data.frame或您需要的任何其他内容分组。这是一个例子:

set.seed(20) #sets the random number seed.

# Test data and test linear model
DF<-data.frame(X=rnorm(200), Y=rnorm(200), Z=rnorm(200))
LM<-lm(X~Y+Z, data=DF)

# Store the residuals as a new column in DF
DF$Resid<-resid(LM)

# Find out what 2 standard deviations is and save it to SD2
SD2<-2*sd(resid(LM))
SD2
#[1] 1.934118

# Make DF$Outs 1 if a residual is 2 st. deviations from the mean, 0 otherwise
DF$Outs<-ifelse(abs(DF$Resid)>SD2, 1, 0)

# Plot this, note that DF$Outs is used to set the color of the points.
plot(DF$Resid, col=DF$Outs+1, pch=16,ylim=c(-3,3))

Plot with outliers

#Make a new data.frame with no outliers
DF2<-DF[!DF$Outs,]
nrow(DF2)
#[1] 189    Was 200 before, 11 outliers removed

# Plot new data
plot(DF2$Resid, col=DF2$Outs+1,pch=16, ylim=c(-3,3))

Plot with outliers removed

这是基本的想法。您可以组合使用其中一些命令 - 例如,您可以创建异常值列而不保存SD2,并且您实际上不需要两个data.frames - 您可以在排除异常值行时排除需要。