如何在计算相关性时告诉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中是否有命令执行此操作?
答案 0 :(得分:6)
您无法使用基本cor()
功能,但您可以
以下是第二种方法的快速示例:
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])