【问题标题】:How do I tell R to remove the outlier from a correlation calculation?如何告诉 R 从相关计算中删除异常值?
【发布时间】:2012-10-02 20:10:44
【问题描述】:

在计算相关性时如何告诉 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中有一个命令可以做到这一点吗?

【问题讨论】:

    标签: r correlation outliers


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      假设您的数据框是 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])
      

      【讨论】:

        【解决方案3】:

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

        那么让我们来进行winsorize:

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

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

        【讨论】:

          【解决方案4】:

          在下文中,我假设(我在您的字里行间读到)您已经在视觉上(即,从图表中)识别出单个异常值。从您有限的数据集中,根据它的值可能很容易识别该点。如果你有更多的数据点,你可以使用这样的东西。

          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

          【讨论】:

            【解决方案5】:

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

            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
            

            【讨论】:

              猜你喜欢
              • 2011-06-07
              • 2015-01-18
              • 2018-05-09
              • 2019-04-11
              • 2012-10-03
              • 2012-08-11
              • 1970-01-01
              • 2021-12-26
              • 1970-01-01
              相关资源
              最近更新 更多