Как мне справиться с несколькими видами пропусков в R? - PullRequest
18 голосов
/ 17 марта 2011

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

0-99 Данные

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

-5 Не знаю

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

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

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

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

Ответы [ 6 ]

10 голосов
/ 17 марта 2011

Я знаю, что вы ищете, и это не реализовано в 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

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

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

6 голосов
/ 17 марта 2011

Наиболее очевидный способ - использовать два вектора:

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

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

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

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

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

4 голосов
/ 17 марта 2011

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

-Ральф Винтерс

4 голосов
/ 17 марта 2011

Это больше, чем просто «техническая» проблема.Вы должны иметь тщательный статистический опыт в анализе недостающих значений и вменении.Одно из решений требует игры с R и Ggobi.Вы можете назначить крайне отрицательные значения нескольким типам NA (поместить NA в поле) и выполнить некоторую диагностику «вручную».Следует помнить, что существует три типа NA:

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

ИМХО этот вопрос больше подходит для CrossValidated .

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

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

1 голос
/ 11 ноября 2011

Я бы хотел добавить сюда «статистический фоновый компонент». Статистический анализ с отсутствующими данными - очень хорошее прочтение по этому вопросу.

1 голос
/ 19 марта 2011

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

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

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

Allan.

...