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

Как и следовало ожидать от DSL, предназначенного для анализа данных, R очень хорошо обрабатывает отсутствующие / неполные данные, например:

Многие функции R имеют флаг na.rm , который при установке на TRUE удаляет NA:

>>> v = mean( c(5, NA, 6, 12, NA, 87, 9, NA, 43, 67), na.rm=T)
>>> v
      (5, 6, 12, 87, 9, 43, 67)

Но если вы хотите иметь дело с NA до вызова функции, вам нужно сделать что-то вроде этого:

для удаления каждого 'NA' из вектора:

vx = vx[!is.na(a)]

чтобы убрать каждое «NA» из вектора и заменить его на «0»:

ifelse(is.na(vx), 0, vx)

для удаления всей строки, содержащей «NA», из фрейма данных:

dfx = dfx[complete.cases(dfx),]

Все эти функции постоянно удаляют 'NA' или строки с 'NA' в них.

Иногда это не совсем то, что вы хотите - создание вырезанной из NA копии фрейма данных может потребоваться для следующего шага в рабочем процессе, но на последующих шагах вы часто хотите вернуть эти строки (например, вычислить статистику по столбцам для столбца, в котором отсутствуют строки, вызванные предыдущим вызовом «завершенных случаев», но в этом столбце нет значений «NA»).

, чтобы быть как можно более понятным о том, что я ищу: python / numpy имеет класс, маскированный массив , с mask методом, который позволяет вам скрыть - но не удалить - NA во время вызова функции. Есть ли аналогичная функция в R?

Ответы [ 3 ]

19 голосов
/ 10 апреля 2010

Что именно делать с отсутствующими данными - которые могут быть помечены как NA, если мы знаем, что они отсутствуют - может сильно отличаться от домена к домену.

В качестве примера, относящегося к временным рядам, где вы можете пропустить, или заполнить, или интерполировать, или интерполировать по-другому, ... это просто (очень полезный и популярный) zoo имеет все эти функции, связанные с обработкой NA:

zoo::na.approx  zoo::na.locf    
zoo::na.spline  zoo::na.trim    

позволяет приближаться (используя разные алгоритмы), переносить или назад, использовать сплайн-интерполяцию или усечение.

Другим примером могут быть многочисленные отсутствующие пакеты вменения в CRAN, часто предлагающие решения для конкретных областей [Итак, если вы называете R DSL, что это? «Решения для отдельных доменов для языков, специфичных для домена» или SDSSFDSL? Довольно полный рот :)]

Но по вашему конкретному вопросу: нет, мне не известен флаг уровня битов в базе R, который позволяет пометить наблюдения как «исключенные». Я предполагаю, что большинство пользователей R прибегнут к таким функциям, как na.omit() и др., Или используют опцию na.rm=TRUE, которую вы упомянули.

15 голосов
/ 08 июня 2010

Это хорошая практика, чтобы посмотреть на данные, следовательно, сделать вывод о типе пропущенных значений: MCAR (пропущено полное и случайное), MAR (пропущено случайно) или MNAR (пропущено не случайно)?Основываясь на этих трех типах, вы можете изучить основную структуру пропущенных значений и сделать вывод, применимо ли вменение вообще (вам повезло, если это не MNAR, потому что в этом случае пропущенные значения считаются не игнорируемыми исвязанные с каким-то неизвестным влиянием, фактором, процессом, переменной ... что угодно).

Глава 3. в "Интерактивная и динамическая графика для аналитика данных с R и GGobi" от Di Cook и Дебора Суэйн является отличным справочным материалом по этой теме.

В этой главе вы увидите, как пакет norm в действии, но *В пакете 1014 * есть процедуры ввода данных.См. Также Amelia, cat (для вменения категорических пропусков), mi, mitools, VIM, vmv (для визуализации отсутствующих данных).

Честно говоря, я до сих пор неЯ не совсем понимаю, есть ли у вас вопрос о статистике или о том, что у R отсутствуют возможности вложения данных?Я считаю, что я предоставил хорошие ссылки на второй и первый: вы можете заменить ваши NA либо центральной тенденцией (среднее, медианное или подобное), следовательно, уменьшить изменчивость, либо случайной постоянной «вытащить»наблюдаемых (зарегистрированных) случаев, или вы можете применить регрессионный анализ с переменной, содержащей NA в качестве критериев, и другими переменными в качестве предикторов, а затем назначить невязки для NA ... это элегантный способ иметь дело с NA, но довольно часто это не такбудьте осторожны с вашим процессором (у меня Celeron на 1,1 ГГц, поэтому я должен быть осторожным).

Это проблема оптимизации ... нет однозначного ответа, вы должны решить, что / почему вы придерживаетеськакой-то метод.Но всегда полезно смотреть на данные!=) Обязательно проверьте Cook & Swayne - это отличное, грамотно написанное руководство. "Линейные модели с R" от Далекий также содержит главу о пропущенных значениях.

Итак, есть.

Хорошоудачи!=)

8 голосов
/ 13 мая 2014

Функция na.exclude() звучит как то, что вы хотите, хотя это только опция для некоторых (важных) функций.

В контексте подгонки и работы с моделями R имеет семейство универсальных функций для работы с NA: na.fail(), na.pass(), na.omit() и na.exclude(). Это, в свою очередь, аргументы для некоторых ключевых функций моделирования R, таких как lm(), glm() и nls(), а также функций в MASS, rpart и пакетах выживания.

Все четыре универсальные функции в основном действуют как фильтры. na.fail() будет передавать данные только в том случае, если нет NA, в противном случае произойдет сбой. na.pass() проходит через все дела. na.omit() и na.exclude() и пропускают дела с NA, и пропускают остальные дела. Но na.exclude() имеет другой атрибут, который указывает функциям, обрабатывающим результирующий объект, принимать во внимание NA. Вы можете увидеть этот атрибут, если вы сделали attributes(na.exclude(some_data_frame)). Вот демонстрация того, как na.exclude() изменяет поведение predict() в контексте линейной модели.

fakedata <- data.frame(x = c(1, 2, 3, 4), y = c(0, 10, NA, 40))

## We can tell the modeling function how to handle the NAs
r_omitted <- lm(x~y, na.action="na.omit", data=fakedata) 
r_excluded <- lm(x~y, na.action="na.exclude", data=fakedata)

predict(r_omitted)
#        1        2        4 
# 1.115385 1.846154 4.038462 
predict(r_excluded)
#        1        2        3        4 
# 1.115385 1.846154       NA 4.038462 

Кстати, ваше действие по умолчанию na.action определяется options("na.action") и начинается как na.omit(), но вы можете установить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...