Как выбрать строки с определенным отсутствующим рисунком?
Итак, у меня есть набор данных, который содержит много пропущенных значений. Я хочу отделить данные от разных отсутствующих моделей. Я нашел пакет "мыши", который очень удобен для суммирования шаблонов пропущенных значений. Однако, когда я хочу выбрать строки с определенным отсутствующим шаблоном, количество выбранных строк намного меньше, чем количество, как предполагает матрица отсутствующего шаблона.
Мой код выглядит следующим образом.
Чтобы получить отсутствующий шаблон:
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,])
}