Обработка отсутствующих/неполных данных в 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?
Ответы
Ответ 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()
, но вы можете установить его.