Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算包含缺失值的相关系数_R_Sas_Correlation_Reliability_Spss - Fatal编程技术网

R 计算包含缺失值的相关系数

R 计算包含缺失值的相关系数,r,sas,correlation,reliability,spss,R,Sas,Correlation,Reliability,Spss,我希望计算R(或任何常见的统计数据包)中的某种形式的相关系数,其中的相关值受缺失值的影响。我不确定这是否可行,我正在寻找一种方法。我不想对数据进行插补,但实际上我希望根据以某种系统方式包含的不完整案例的数量减少相关性。数据是由不同个体产生的一系列时间点,相关系数用于计算可靠性。在许多情况下,一个人的数据会比另一个人包含更多的时间点 同样,我也不确定是否有任何标准程序来处理这种情况。我的感觉是,当有一个数据对的一个时间序列显示NA时,该对不能用于计算相关性,因为此时没有信息。由于没有关于这一点的信

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


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

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


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

需要查看的一件事是将逻辑回归拟合到是否缺少一个点。如果没有关系,那么它就支持假设缺少的值不会提供任何信息。如果这是你的情况,那么你将不必插补任何东西,只需执行你的计算,而不丢失值glm可用于逻辑回归

另请注意,请参见
cor
use=“pairwise.complete.obs”
参数,该参数可能适用于您,也可能不适用于您


编辑:我在重读问题的基础上修改了这个答案

正如保罗·希姆斯特拉(Paul Hiemstra)在回答中指出的那样,如果没有缺失值,就无法知道相关性是高还是低。然而,对于某些应用,对于不匹配的缺失值,可以对观察到的相关性进行惩罚。例如,如果我们比较两个单独的编码器,我们可能希望编码器B说“NA”,当且仅当编码器A也说“NA”,并且我们希望它们的非NA值相互关联

在这些假设下,惩罚不匹配缺失值的简单方法是计算完整案例的相关性,并乘以根据NA状态匹配的观察值的比例。然后可以将惩罚项定义为:
1-平均值((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))

如果你在降低相关性,实际上你是在输入数据来影响这种变化。我同意你的观点,并且描述得很好。在某种程度上,相关性已经受到缺失数据的惩罚,因为这将减少用于计算p值的样本量。