如何告诉R从相关计算中删除异常值?

时间:2012-10-12 03:31:18

标签: r correlation outliers

如何在计算相关性时告诉R删除异常值?我从散点图中发现了一个潜在的异常值,并且我试图比较有和没有这个值的相关性。这是一个介绍统计课程;我只是在玩这些数据来开始理解相关性和异常值。

我的数据如下:

"Australia" 35.2 31794.13
"Austria" 29.1 33699.6
"Canada" 32.6 33375.5
"CzechRepublic" 25.4 20538.5
"Denmark" 24.7 33972.62
...

等等,对于26行数据。我试图找到第一个和第二个数字的相关性。

读了这个question,但是,我只想删除一个点,而不是一个点的百分比。 R中是否有命令执行此操作?

5 个答案:

答案 0 :(得分:6)

您无法使用基本cor()功能,但您可以

  • 使用其中一个健壮的统计数据包中的相关函数,例如来自包robustrobCov()

  • 使用winsorize()功能(例如来自robustHD)来处理您的数据

以下是第二种方法的快速示例:

R> set.seed(42)
R> x <- rnorm(100)
R> y <- rnorm(100)
R> cor(x,y)             # correlation of two unrelated series: almost zero
[1] 0.0312798

我们用一个大的异常值“污染”了一个点:

R> x[50] <- y[50] <- 10
R> cor(x,y)             # bigger correlation due to one bad data point
[1] 0.534996

所以让我们赢得胜利:

R> x <- robustHD::winsorize(x)
R> y <- robustHD::winsorize(y)
R> cor(x,y)
[1] 0.106519
R> 

我们又回到了一个不那么相关的衡量标准。

答案 1 :(得分:4)

如果对两个矢量应用相同的条件表达式,则可以排除该“点”。

cor( DF[2][ DF[2] > 100 ],   # items in 2nd column excluded based on their values
   DF[3][ DF[2] > 100 ] )  # items in 3rd col excluded based on the 2nd col values

答案 2 :(得分:2)

在下文中,我从假设(我在你的行之间阅读)开始工作,你已经在视觉上确定了单个异常值(即,从图中)。根据您的有限数据集,可能很容易根据其值识别该点。如果你有更多的数据点,你可以使用这样的东西。

tmp <- qqnorm(bi$bias.index)
qqline(bi$bias.index)
(X <- identify(tmp, , labels=rownames(bi)))
qqnorm(bi$bias.index[-X])
qqline(bi$bias.index[-X])

请注意,我只是复制了自己的代码,因为我无法使用您的示例代码。另请先检查?identify

答案 3 :(得分:2)

将所有数据放在数据框上是有意义的,因此更容易处理。 我总是希望通过在数据框中使用额外的列(在本例中为B)来跟踪异常值。

df       <-  data.frame(A=c(1,2,3,4,5), B=c(T,T,T,F,T))

然后在进入好的分析之前过滤掉我不想要的数据。

myFilter <-  with(df, B==T)
df[myFilter, ]

这样,您就不会忘记异常值,并且您可以根据需要管理它们。

编辑:

根据我上面的答案改进,您还可以使用条件来定义异常值。

df  <-  data.frame(A=c(1,2,15,1,2))
df$B<-  with(df, A > 2)
subset(df, B == F)

答案 4 :(得分:1)

你在这里得到了一些很好的信息,但它们似乎是更复杂问题的答案。如果我错了,请纠正我,但听起来你只想手动删除一个观察。指定其索引的否定将删除它。

假设您的数据帧是A,列是V1和V2。

WithAus <- cor(A$V1,A$V2)
WithoutAus <- cor(A$V1[-1],a$V2[-1])

或者您可以删除多个索引。比方说1,5和20

ToRemove <- c(-1,-5,-20)
WithAus <- cor(A$V1,A$V2)
WithoutAus <- cor(A$V1[ToRemove],a$V2[ToRemove])