Стратегии, чтобы компенсировать влияние построчной коррекции на отсутствующие данные - PullRequest
0 голосов
/ 13 апреля 2020

Вот набор данных

data <- t(data.frame(met1 = c(2,2,2,2,2),
                   met2 = c(5,4,NA,2,1),
                   met3 = c(2,2,2,NA,2),
                   met4 = c(2,4,6,8,6),
                   met5 = c(1,3,4,7,2)))

Это дает:

     [,1] [,2] [,3] [,4] [,5]
met1    2    2    2    2    2
met2    5    4   NA    2    1
met3    2    2    2   NA    2
met4    2    4    6    8    6
met5    1    3    4    7    2

Я часто выполняю построчную коррекцию в моем наборе данных. Которые делят все значения после суммирования, что означает, что все значения находятся в диапазоне от 0 до 1.

data <- data / rowSums(data, na.rm = TRUE)

Это прекрасно работает, когда нет отсутствующих данных. Но, как вы можете видеть при сравнении met1 и met3, каждое значение met3 значительно выше, чем met1 из-за отсутствующих данных.

           [,1]      [,2]      [,3]      [,4]       [,5]
met1 0.20000000 0.2000000 0.2000000 0.2000000 0.20000000
met2 0.41666667 0.3333333        NA 0.1666667 0.08333333
met3 0.25000000 0.2500000 0.2500000        NA 0.25000000
met4 0.07692308 0.1538462 0.2307692 0.3076923 0.23076923
met5 0.05882353 0.1764706 0.2352941 0.4117647 0.11764706

Как можно компенсировать этот эффект? В настоящее время я удалил все столбцы с отсутствующими данными, но предпочитаю не делать этого, поскольку некоторые важные данные могут быть удалены.

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете взять среднее значение, считая NA в знаменателе, но это сделает значения в met3 "значительно" меньше, чем met1. Еще один вариант - вменять пропущенные значения по среднему значению строки, а затем нормализовать их, используя rowSums().

# Data
data <- t(data.frame(met1 = c(2,2,2,2,2),
                     met2 = c(5,4,NA,2,1),
                     met3 = c(2,2,2,NA,2),
                     met4 = c(2,4,6,8,6),
                     met5 = c(1,3,4,7,2)))
> data
     [,1] [,2] [,3] [,4] [,5]
met1    2    2    2    2    2
met2    5    4   NA    2    1
met3    2    2    2   NA    2
met4    2    4    6    8    6
met5    1    3    4    7    2

# Data imputation
data = apply(data, 1, function(x) {
  x[is.na(x)] = mean(x, na.rm = TRUE)
  return(x)
}) %>% t()
> data
     [,1] [,2] [,3] [,4] [,5]
met1    2    2    2    2    2
met2    5    4    3    2    1
met3    2    2    2    2    2
met4    2    4    6    8    6
met5    1    3    4    7    2

# Normalizing
data <- data / rowSums(data, na.rm = TRUE)
> data
           [,1]      [,2]      [,3]      [,4]       [,5]
met1 0.20000000 0.2000000 0.2000000 0.2000000 0.20000000
met2 0.33333333 0.2666667 0.2000000 0.1333333 0.06666667
met3 0.20000000 0.2000000 0.2000000 0.2000000 0.20000000
met4 0.07692308 0.1538462 0.2307692 0.3076923 0.23076923
met5 0.05882353 0.1764706 0.2352941 0.4117647 0.11764706
...