Расчет коэффициента корреляции, который включает пропущенные значения - PullRequest
2 голосов
/ 02 декабря 2011

Я рассчитываю рассчитать некоторую форму коэффициента корреляции в R (или любой другой пакет общей статистики), в котором значение корреляции зависит от отсутствующих значений.Я не уверен, возможно ли это, и ищу метод.Я не хочу вменять данные, но на самом деле хочу, чтобы корреляция была уменьшена на основе количества неполных дел, включенных в какой-то систематический способ.Данные представляют собой ряд моментов времени, сгенерированных разными людьми, и коэффициент корреляции используется для расчета надежности.Во многих случаях данные одного человека будут включать в себя несколько больше моментов времени, чем другой человек ...

Опять же, не уверен, существует ли какая-либо стандартная процедура для решения такой ситуации.

Ответы [ 3 ]

3 голосов
/ 02 декабря 2011

Одна вещь, на которую стоит обратить внимание, это подгонка логистической регрессии к тому, отсутствует точка или нет. Если нет никакой связи, то это обеспечивает поддержку для предположения, что пропущенные значения не предоставят никакой информации. Если это ваш случай, вам не нужно ничего вменять, и вы можете просто выполнить вычисления без пропущенных значений. glm в R может использоваться для логистической регрессии.

Также в другой заметке см. Аргумент use="pairwise.complete.obs" для cor, который может относиться или не относиться к вам.

РЕДАКТИРОВАТЬ: я пересмотрел этот ответ на основе перечитывания вопроса.

2 голосов
/ 02 декабря 2011

У меня такое ощущение, что когда существует пара данных, в которой один из временных рядов показывает NA, эта пара не может быть использована для расчета корреляции, так как в этой точке нет информации. Поскольку по этому вопросу нет информации, нет способа узнать, как это повлияет на корреляцию. Указание, что NA уменьшает корреляцию, кажется сложным, если бы наблюдение присутствовало в точке, которая с такой же легкостью могла бы улучшить корреляцию.

Поведение по умолчанию в R - возвращать NA для корреляции, если присутствует NA. Это поведение можно настроить с помощью аргумента use. См. Документацию этой функции для получения более подробной информации.

1 голос
/ 13 июля 2017

Как указано в ответе Пола Химстры, нет способа узнать, была бы корреляция выше или ниже без пропущенных значений. Однако для некоторых применений может быть целесообразным штрафовать наблюдаемую корреляцию за несовпадающие пропущенные значения. Например, если мы сравниваем два отдельных кодера, мы можем захотеть, чтобы кодер B сказал «NA» тогда и только тогда, когда кодер A также говорит «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))
...