2014-10-08 209 views
0

我想删除残差图中的异常值(定义为平均值超过2个标准差)?在R中写入命令以删除残差图中的异常值

我应该写什么命令?

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

请用一些示例数据编辑您的文章。有关在R中创建可重复示例的提示,请参阅[此问题](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – voidHead 2014-10-08 00:12:17

+1

如果你有超过200分的排位赛资格,你会如何决定排除哪些排位? – 2014-10-08 00:22:06

+0

我不知道!你有什么建议吗?我甚至不知道我的数据框有多少离群值! – 2014-10-08 00:39:51

回答

3

我认为你可以使用类似过滤:

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

其中Z是resid(DF.mod.2)

+0

非常感谢。我应该如何在RStudio中编写它?首先我应该写:z < - resid(DF.md.2)然后我应该写z [abs(z-mean(z))<2 * sd(z)])?如果我想绘制残差,我应该使用这个命令:z < - lm(X〜A + B + C + D + F,data = DF)和residualPlot(z)?我对吗? – 2014-10-08 00:25:38

+0

我写了这些命令。你能否告诉我如何绘制过滤数据farme的残留图? – 2014-10-08 01:11:20

+5

尊重@PotentialScientist,你看起来有点超出你的深度。您可能需要获得一些本地帮助或坐下来,并通过R的介绍工作 - 堆栈溢出适合克服偶尔的障碍,但它不能教您一种新的编程语言...... – 2014-10-08 01:59:40

2

有很多种方法可以做到这一点。一个简单的策略是首先将您的残差保存为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 - 只需在需要时排除异常值行即可。