Подтвердить что ты не робот

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

Многие опросы имеют коды для разных видов недостатков. Например, в кодовой книге может указываться:

0-99 Данные

-1 Вопрос не задан

-5 Не знаю

-7 Отказаться от ответа

-9 Модуль не задан

У Stata есть прекрасное средство для обработки этих множественных недостатков, поскольку оно позволяет вам назначить общий. к отсутствующим данным, но допускаются более конкретные виды пропусков (.a,.b,.c,...,.z). Все команды, которые смотрят на пропущенность, сообщают ответы на все отсутствующие записи, но указали, но позже вы можете разобраться с различными видами пропусков. Это особенно полезно, если вы считаете, что отказ от ответа имеет разные последствия для стратегии вменения, чем вопрос, который не задан.

Я никогда не сталкивался с таким средством в R, но мне бы очень хотелось иметь эту возможность. Существуют ли какие-либо способы маркировки нескольких типов NA? Я мог представить себе создание большего количества данных (либо вектора длины nrow (my.data.frame), содержащего типы пропусков, либо более компактного индекса, из которых были какие типы пропусков), но это кажется довольно громоздким.

4b9b3361

Ответ 1

Я знаю, что вы ищете, и это не реализовано в R. Я не знаю о пакете, где это реализовано, но его не так сложно самому закодировать.

Эффективным способом является добавление кадра данных в атрибуты, содержащие коды. Чтобы предотвратить дублирование всего кадра данных и сэкономить место, я бы добавил индексы в этом фреймворке данных вместо того, чтобы восстановить полный фрейм данных.

например:

NACode <- function(x,code){
    Df <- sapply(x,function(i){
        i[i %in% code] <- NA
        i
    })

    id <- which(is.na(Df))
    rowid <- id %% nrow(x)
    colid <- id %/% nrow(x) + 1
    NAdf <- data.frame(
        id,rowid,colid,
        value = as.matrix(x)[id]
    )
    Df <- as.data.frame(Df)
    attr(Df,"NAcode") <- NAdf
    Df
}

Это позволяет:

> Df <- data.frame(A = 1:10,B=c(1:5,-1,-2,-3,9,10) )
> code <- list("Missing"=-1,"Not Answered"=-2,"Don't know"=-3)
> DfwithNA <- NACode(Df,code)
> str(DfwithNA)
'data.frame':   10 obs. of  2 variables:
 $ A: num  1 2 3 4 5 6 7 8 9 10
 $ B: num  1 2 3 4 5 NA NA NA 9 10
 - attr(*, "NAcode")='data.frame':      3 obs. of  4 variables:
  ..$ id   : int  16 17 18
  ..$ rowid: int  6 7 8
  ..$ colid: num  2 2 2
  ..$ value: num  -1 -2 -3

Функция также может быть настроена для добавления дополнительного атрибута, который дает вам ярлык для разных значений, см. также этот вопрос. Вы можете выполнить обратное преобразование:

ChangeNAToCode <- function(x,code){
    NAval <- attr(x,"NAcode")
    for(i in which(NAval$value %in% code))
        x[NAval$rowid[i],NAval$colid[i]] <- NAval$value[i]

    x
}

> Dfback <- ChangeNAToCode(DfwithNA,c(-2,-3))
> str(Dfback)
'data.frame':   10 obs. of  2 variables:
 $ A: num  1 2 3 4 5 6 7 8 9 10
 $ B: num  1 2 3 4 5 NA -2 -3 9 10
 - attr(*, "NAcode")='data.frame':      3 obs. of  4 variables:
  ..$ id   : int  16 17 18
  ..$ rowid: int  6 7 8
  ..$ colid: num  2 2 2
  ..$ value: num  -1 -2 -3

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

Но в одной строке: использование атрибутов и индексов может быть хорошим способом сделать это.

Ответ 2

Наиболее очевидным способом, по-видимому, является использование двух векторов:

  • Вектор 1: вектор данных, где все отсутствующие значения представлены с помощью NA. Например, c(2, 50, NA, NA)
  • Вектор 2: вектор факторов, указывающий тип данных. Например, factor(c(1, 1, -1, -7)), где коэффициент 1 указывает на правильно ответивший вопрос.

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

Обновить следующие вопросы из @gsk3

  • Хранение данных значительно увеличится: хранение данных удвоится. Однако, если удвоение размера вызывает реальную проблему, возможно, стоит подумать о других стратегиях.
  • Программы не обрабатывают автоматически. Это странный комментарий. Некоторые функции по умолчанию обрабатывают NAs разумным способом. Тем не менее, вы хотите по-разному относиться к НС, поэтому подразумевается, что вам придется делать что-то на заказ. Если вы хотите просто проанализировать данные, где NA "Вопрос не задан", просто используйте подмножество фреймов данных.
  • теперь вам нужно манипулировать двумя векторами вместе каждый раз, когда вы хотите концептуально манипулировать переменной. Предположим, я предусмотрел кадр данных двух векторов. Я бы подмножал кадр данных на основе второго вектора.
  • Нет стандартной реализации, поэтому мое решение может отличаться от другого. Правда. Однако, если пакет с полками не отвечает вашим потребностям, тогда (почти) по определению вы хотите сделать что-то другое.

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

Ответ 3

Это больше, чем просто "техническая" проблема. Вы должны иметь подробный статистический фон в анализе недостающих значений и вменении. Для одного решения требуется играть с R и ggobi. Вы можете назначить крайне отрицательные значения нескольким типам NA (поместить NAs в margin) и выполнить некоторую диагностику "вручную". Вы должны иметь в виду, что существует три типа NA:

  • MCAR - отсутствует полностью случайно, где P (отсутствует | наблюдаемое, ненаблюдаемое) = P (отсутствует)
  • MAR - отсутствует в случайном порядке, где P (отсутствует | наблюдаемое, ненаблюдаемое) = P (отсутствует | наблюдаемое)
  • MNAR - отсутствует не случайно (или не игнорируется), где P (отсутствует | наблюдаемый, ненаблюдаемый) никак не может быть количественно определен.

IMHO этот вопрос более подходит для CrossValidated.

Но здесь ссылка из SO, которую вы можете найти полезной:

Обработка отсутствующих/неполных данных в R - существует ли функция маскировки, но не удалить NA?

Ответ 4

Вы можете полностью отказаться от NA и просто использовать закодированные значения. Затем вы можете свернуть их до глобального отсутствующего значения. Я часто предпочитаю кодировать без NA, так как NA может вызвать проблемы с кодированием, и мне нравится иметь возможность точно контролировать, что происходит в анализе. Если также использовала строку "NA" для представления NA, которая часто упрощает процесс.

-Ralph Winters

Ответ 5

Я обычно использую их как значения, как уже указывал Ральф, поскольку тип отсутствующего значения представляется как данные, но в один или два раза, когда я в основном хотел его для документации, я использовал атрибут для значения, например

> a <- NA
> attr(a, 'na.type') <- -1
> print(a)
[1] NA
attr(,"na.type")
[1] -1

Таким образом, мой анализ чист, но я все еще храню документацию. Но, как я сказал: обычно я сохраняю значения.

Allan.