【问题标题】:Calculating a correlation coefficient that includes missing values计算包含缺失值的相关系数
【发布时间】:2011-12-02 07:48:29
【问题描述】:

我希望在 R(或任何常见的统计数据包)中计算某种形式的相关系数,其中相关值受缺失值的影响。我不确定这是否可行并且正在寻找一种方法。我不想估算数据,但实际上希望根据以某种系统方式包含的不完整案例的数量来减少相关性。数据是由不同个体生成的一系列时间点,相关系数用于计算可靠性。在许多情况下,一个人的数据将包含比另一个人多几个时间点...

同样,不确定是否有任何标准程序来处理这种情况。

【问题讨论】:

  • 如果您要降低相关性,实际上就是在输入数据以影响该更改。

标签: r sas correlation reliability spss


【解决方案1】:

要查看的一件事是对是否缺少点进行逻辑回归。如果没有关系,则支持假设缺失值不会提供任何信息。如果这是您的情况,那么您将无需估算任何内容,并且可以在没有缺失值的情况下执行您的计算。 R中的glm可用于逻辑回归。

另外,请参阅 cor 的 use="pairwise.complete.obs" 参数,该参数可能适用于您,也可能不适用于您。

编辑:我根据重新阅读问题修改了这个答案。

【讨论】:

    【解决方案2】:

    我的感觉是,当有一个数据对具有显示 NA 的时间序列之一时,该对不能用于计算相关性,因为此时没有信息。由于没有关于这一点的信息,因此无法知道它将如何影响相关性。指定 NA 降低相关性似乎很棘手,如果在某个点上存在观察结果,这同样可以很容易地改善相关性。

    如果存在 NA,则 R 中的默认行为是为相关性返回 NA。可以使用 'use' 参数调整此行为。有关详细信息,请参阅该函数的文档。

    【讨论】:

    • 我同意你的观点,并且描述得很好。在某种程度上,相关性已经受到数据缺失的影响,因为这将减少用于计算 p 值的样本量。
    【解决方案3】:

    正如 Paul Hiemstra 在回答中所指出的,如果没有缺失值,则无法知道相关性会更高还是更低。然而,对于某些应用程序,对不匹配缺失值的观察到的相关性进行惩罚可能是合适的。例如,如果我们比较两个单独的编码器,当且仅当编码器 A 也说“NA”时,我们可能希望编码器 B 说“NA”,而且我们希望它们的非 NA 值相关。

    在这些假设下,惩罚不匹配缺失值的一种简单方法是计算完整案例的相关性,然后乘以根据其 NA 状态匹配的观测值的比例。然后可以将惩罚项定义为:1 - mean((is.na(coderA) & !is.na(coderB)) | (!is.na(coderA) & is.na(coderB)))。下面是一个简单的例子。

    fun = function(x1, x2, idx_rm) {
      temp = x2
      # remove 'idx_rm' points from x2
      temp[idx_rm] = NA
    
      # calculate correlations
      r_full = round(cor(x1, x2, use = 'pairwise.complete.obs'), 2)
      r_NA = round(cor(x1, temp, use = 'pairwise.complete.obs'), 2)
      penalty = 1 - mean((is.na(temp) & !is.na(x1)) |
                           (!is.na(temp) & is.na(x1)))
      r_pen = round(r_NA * penalty, 2)
    
      # plot
      plot(x1, temp, main = paste('r_full =', r_full, 
                                  '; r_NA =', r_NA,
                                  '; r_pen =', r_pen),
           xlim = c(-4, 4), ylim = c(-4, 4), ylab = 'x2')
      points(x1[idx_rm], x2[idx_rm], col = 'red', pch = 16)
    
      regr_full = as.numeric(summary(lm(x2 ~ x1))$coef[, 1])
      regr_NA = as.numeric(summary(lm(temp ~ x1))$coef[, 1])
      abline(regr_full[1], regr_full[2])
      abline(regr_NA[1], regr_NA[2], lty = 2)
    }
    

    运行一个简单的模拟来说明缺失值和惩罚的可能影响:

    set.seed(928)
    x1 = rnorm(20)
    x2 = x1 * rnorm(20, mean = 1, sd = .8)
    # A case when NA's artifically inflate the correlation, 
    # so penalization makes sense:
    myfun(x1, x2, idx_rm = c(13, 19))
    
    # A case when NA's DEflate the correlation, 
    # so penalization may be misleading:
    myfun(x1, x2, idx_rm = c(6, 14))
    
    # When there are a lot of NA's, penalization is much stronger
    myfun(x1, x2, idx_rm = 7:20)
    
    # Some NA's in x1:
    x1[1:5] = NA
    myfun(x1, x2, idx_rm = c(6, 14))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-18
      • 2023-03-18
      • 1970-01-01
      • 2023-03-14
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多