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



如何告诉 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 中是否有执行此操作的命令?

你不能

用基本的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

所以让我们赢了:

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

我们又回到了一个不太相关的度量。

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

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

在下文中,我从假设(我从你的字里行间读到)工作,你已经直观地(即,从图表中)识别了那个异常值。从有限的数据集中,根据其值可能很容易识别该点。如果你有更多的数据点,你可以使用这样的东西。

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之前。

将所有

数据放在数据框中是有意义的,因此更容易处理。我总是喜欢通过在数据框中使用额外的列(在本例中为 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)

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

假设数据帧为 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])

最新更新