Как выбрать строки с определенным отсутствующим рисунком?

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

Мой код выглядит следующим образом.

Чтобы получить отсутствующий шаблон:

library(mice)
# md.pattern returns a matrix, I convert the matrix into a data frame with the first column as its frequency in the data frame 
pattern = md.pattern(data)
freq = dimnames(pattern)[[1]][-nrow(pattern)] 
pattern = data.frame(pattern[1:nrow(pattern)-1, 1:ncol(pattern)-1], row.names = NULL)
pattern$freq = freq
pattern = pattern[order(freq,decreasing = TRUE),]

Однако, когда я пытаюсь подсчитать отсутствующие шаблоны вручную по определенному шаблону в pattern, Количество намного меньше.

count = 0
for (i in 1:nrow(data)){
    # match the missingness by the entire row
    if (all(!is.na(data[i, names(data)[1:ncol(pattern)-1]]) == test[1,1:ncol(pattern)-1])){
        count = count +1
  }
}

У кого-нибудь есть идеи, где идет не так? Спасибо!

Данные имеют много переменных (всего 107) и более 70000 наблюдений. Этот код хорошо работает в примере данных nhanes в mice пакет. Но это просто идет не так в моем файле данных.

Например:

V1 V2 V3 V4 V5
1  NA  3  5  2
NA  3 23  2  9
NA  3 90  7  5
3   3  2 34 NA
3  NA  2  1  3
4  NA  7  3  1

1 ответ

Во всяком случае, я проверил оригинальный код для md.pattern в mice пакет. Он основан на функции prelim.norm Шефера, а не на проверке пропущенных значений строк за строкой.

Я нашел count в plyr пакет действительно делает свое дело. Я написал эту функцию, чтобы вернуть вершину n отсутствующие шаблоны в наборе данных. x это фрейм данных. Это хорошо работает в моем случае.

library(plyr)
miss.pattern <- function(x, topn) {
  # find missingness patterns, 1 represents missing
  r <- 1 * data.frame(is.na(x))
  pattern <- data.frame(count(r))
  pattern <- pattern[order(-pattern$freq),]
  return(pattern[1:topn,])
}
Другие вопросы по тегам