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

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

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

Многие функции R имеют флаг na.rm, который, когда установлен в значение ИСТИНА, удаляет NAs:

>>> 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" из вектора и заменить его w/a '0':

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Итак, там.

Удачи! =)

Ответ 3

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

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

Все четыре общие функции в основном действуют как фильтры. na.fail() будет передавать данные только в том случае, если нет NA, иначе это не сработает. na.pass() проходит все случаи через. na.omit() и na.exclude() будут оба исключать случаи с NA и передавать другие случаи. Но na.exclude() имеет другой атрибут, который сообщает функциям, обрабатывающим результирующий объект, учитывать УН. Вы можете увидеть этот атрибут, если вы сделали 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(), но вы можете установить его.