5

在计算相关性时,如何告诉 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行数据。我试图找到第一个和第二个数字的相关性。

确实读过这个问题,但是,我只是想删除一个点,而不是百分比。R中有一个命令可以做到这一点吗?

4

5 回答 5

6

你不能用基本cor()功能做到这一点,但你可以

  • 使用来自鲁棒统计包之一的相关函数,例如robCov()来自鲁棒包

  • 使用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

所以让我们进行winsorize:

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

我们又回到了一个相关性较低的衡量标准。

于 2012-10-12T03:40:24.303 回答
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
于 2012-10-12T03:51:40.463 回答
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)
于 2012-10-12T12:59:10.183 回答
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一下。

于 2012-10-12T10:05:20.517 回答
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])
于 2012-10-13T22:36:24.883 回答