У меня очень большой набор данных и около 5% случайных значений отсутствуют. Эти переменные связаны друг с другом. В следующем примере набор данных R - просто игрушечный пример с фиктивными коррелированными данными.
set.seed(123)
# matrix of X variable
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated
N <- 2000000*0.05 # 5% random missing values
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA
> xmat[1:10,1:10]
M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1 -1 -1 1 NA 0 -1 1 -1 0 -1
sample2 1 1 -1 1 0 0 1 -1 -1 1
sample3 0 0 1 -1 -1 -1 0 -1 -1 -1
sample4 1 0 0 -1 -1 1 1 0 1 1
sample5 NA 0 0 -1 -1 1 0 NA 1 NA
sample6 -1 1 0 1 1 0 1 1 -1 -1
sample7 NA 0 1 -1 0 1 -1 0 1 NA
sample8 1 -1 -1 1 0 -1 -1 1 -1 0
sample9 0 -1 0 -1 1 -1 1 NA 0 1
sample10 0 -1 1 0 1 0 0 1 NA 0
Есть ли (лучший) способ вменять пропущенные значения в этой ситуации? Полезен ли алгоритм случайного леса? Любое рабочее решение в R будет высоко ценится.
Редактирование:
(1) Пропущенные значения случайным образом распределены среди переменных и samples.As числа переменных является очень большим (здесь в примере - 10000), в то время как число выборок мало здесь , в приведенном выше примере фиктивной она составляет около 200. Поэтому , когда мы смотрим на любую выборку по всем переменным (10000), есть большие шансы, что будет отсутствовать значение для некоторой переменной - из-за большого количества переменных. Так что просто удалить образец не вариант.
(2) Переменная может рассматриваться как количественная или качественная (двоичная) в процессе вменения. Единственное суждение - насколько хорошо мы можем предсказать это (точность). Таким образом, такие прогнозы, как 0,98 вместо 1, могут быть приемлемыми, а не 0 против 1 или -1 против 1. Мне может потребоваться компромисс между временем и точностью вычислений.
(3) У меня есть проблема, как переоснащение может повлиять на результаты, так как количество переменных велико по сравнению с количеством выборок.
(4) Поскольку общее количество пропущенных значений составляет около 5% и является случайным (не сконцентрировано ни в каких переменных или выборках, поэтому были приняты меры предосторожности для удаления переменных или выборок, которые имеют очень высокие пропущенные значения)
(5) Подготовка данных для анализа является первой целью, а точность - вторичной. Так что не слишком чувствителен к точности.
источник
Ответы:
В зависимости от ситуации и набора данных может быть два способа решения проблемы большой переменной и небольшой выборки (наблюдения).
(1) просто используйте выборки (наблюдения) в качестве переменной при условии, что оценки по переменным одинаковы или нормализованы.
(2) Используйте переменные в качестве переменных, но производите некоторую случайную выборку, в то время как вменяйте так, чтобы числовая переменная была меньше количества выборок и, наконец, объединяла данные
Ниже приведена тренировка, которую вы можете настроить в соответствии с вашими потребностями. У меня есть предположение, что переменная непрерывна, но вы тренируетесь аналогично для дискретных переменных. Здесь я приведу небольшой пример для быстрой проверки.
Во-первых, для тренировки, генерирующей коррелированные данные, здесь наблюдения (выборки) коррелированы, могут быть реалистичными в ситуациях, когда переменные предполагаются независимыми, а наблюдения коррелируются. Но в других ситуациях, когда и наблюдения, и переменные взаимосвязаны.
Я использую
missForest
пакет для вменения, которые зависят отrandomForest
пакета, чтобы сделать это. Вы можете выполнять параллельные вычисления, если у вас есть очень большое количество точек данных для вменения.Поскольку это моделируемый набор данных, мы можем оценить точность вменения, сравнивая исходные значения до пропущенных значений, введенных с вмененными.
Вы можете работать вокруг, чтобы повысить точность. Удачи !
источник
Есть полные книги вменения данных, поэтому трудно дать ответ в этой структуре.
Если ваш набор данных очень большой, убедитесь, что вы используете быстрый или масштабируемый алгоритм.
источник
Это действительно интересный вопрос. Я тоже ищу то же самое. На самом деле, есть много разных способов справиться с этим.
Первым делом, на мой взгляд, будет определение того, какой тип пропущенных данных у вас есть - пропущено полностью случайно (MCAR), пропущено случайно (MAR) или пропущено не случайно (NMAR). Это сложно и спорно , чтобы доказать , но эта бумага показывает интересный способ взглянуть на данных С.
Чтобы справиться с множественным вменением, R имеет несколько пакетов:
MICE
(который кажется очень используемым),randomForest
,Hmisc
Amelia
mi
Это только несколько пакетов, которые я нашел до сих пор.
MICE
также реализовал случайный лес и несколько других методов, таких как прогнозирование среднего значения.Это не так много, но может помочь вам разобраться в некоторых вещах. Как только я получу результаты или решу, каким методом я буду продолжать, я отредактирую сообщение.
Удачи!
источник
Интересный вопрос. Хитрость заключается в том, что для выполнения множественного вменения вам нужно больше, чем просто прогнозирующая модель (которую можно / было бы легко получить, скажем, в подходе машинного обучения). Мы будем называть эти модели имитирующими моделями, поскольку они не совсем вероятностные модели.
источник
Ваша проблема кажется специально разработанной для какого-то низкого уровня завершения матрицы. Попробуйте использовать
impute.svd()
функцию изbcv
пакета . Я бы предложил использовать маленький ранг (аргументk
) - что-то вроде 5.источник