добавьте точную пропорцию случайных пропущенных значений к данным.рамка


Я хотел бы добавить случайный NA к данным.фрейм в R. до сих пор я рассматривал эти вопросы:

R: произвольно вставить NAs в кадр данных пропорционально

Как добавить случайные NAs в кадр данных

Добавление случайных пропущенных значений в полный фрейм данных (в R)

Здесь было представлено много решений, но я не смог найти ни одного, которое соответствовало бы этим 5 условиям:

  • добавьте действительно случайный NA, а не то же самое количество по строке или по столбцу
  • работа с каждым классом переменных, которые можно встретить в данных.фрейм (числовой, символьный, факторный, логический, ТС..), поэтому выходные данные должны иметь тот же формат, что и входные данные.рамка или матрица.
  • гарантировать точное число или пропорцию [Примечание] NA на выходе (многие решения приводят к меньшему числу NA, так как несколько генерируются в одном и том же месте)
  • вычислительно эффективен для больших наборов данных.
  • Добавить доля/число НС независимо от уже присутствующих на входной.

У кого-нибудь есть идея? Я уже пытался написать функцию для этого (в ответе первой ссылки), но она не соответствует пунктам N°3&4. Спасибо.

[Примечание] точная пропорция, округленная на + / - 1NA, конечно.

1 4

1 ответ:

Именно так я делаю это для своей статьи о library(imputeMulti), которая в настоящее время находится на рассмотрении в JSS. Это вставляет NA в случайный процент от всего набора данных и хорошо масштабирует, это не гарантируетточное число из-за случая n * p * pctNA %% 1 != 0.

createNAs <- function (x, pctNA = 0.1) {
  n <- nrow(x)
  p <- ncol(x)
  NAloc <- rep(FALSE, n * p)
  NAloc[sample.int(n * p, floor(n * p * pctNA))] <- TRUE
  x[matrix(NAloc, nrow = n, ncol = p)] <- NA
  return(x)
}
Очевидно, что для воспроизводимости следует использовать случайное начальное число, которое можно указать перед вызовом функции.

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

Edit : я действительно предполагаю, что x является полным. Поэтому я не уверен, как он будет обрабатывать существующие недостающие данные. Конечно, вы можете изменить код, если хотите, хотя это, вероятно, увеличит время выполнения по крайней мере на O (n*p)