Как выполнить вменение значений в очень большом количестве точек данных?

12

У меня очень большой набор данных и около 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
Причина , почему данные отсутствуют сильно опирается на выбор соответствующей техники. Например, если данные полностью отсутствуют случайным образом, вы потеряете немного, отбросив все случаи с пропущенными значениями (поскольку набор данных большой и относительно небольшое количество значений пропущено); но если отсутствие связано с важными переменными в анализе, отбрасывание этих случаев может привести к смещению.
whuber
1
@whuber Я согласен, невозможно удалить для набора данных такого размера, поскольку в каждом случае будет отсутствующее значение хотя бы для одной переменной. Это приведет к полной потере данных.
Джон
4
Это существенно меняет вопрос, Джон, потому что в его нынешнем виде он прямо заявляет об обратном: он утверждает, что только 5% значений отсутствуют. Даже если мы понимаем, что 5% применяются ко всем записям в матрице данных, а не 5% случаев, любой , кто воспользуется этим примером в качестве примера характера ваших данных, сможет сделать правильный вывод, что не более 10 * 5% = 50 В% случаев отсутствуют значения. Три вещи, которые наиболее важны для описания в таких вопросах: (1) цель анализа, (2) природа пропущенности и (3) количество пропущенных.
whuber

Ответы:

8

В зависимости от ситуации и набора данных может быть два способа решения проблемы большой переменной и небольшой выборки (наблюдения).

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

(2) Используйте переменные в качестве переменных, но производите некоторую случайную выборку, в то время как вменяйте так, чтобы числовая переменная была меньше количества выборок и, наконец, объединяла данные

Ниже приведена тренировка, которую вы можете настроить в соответствии с вашими потребностями. У меня есть предположение, что переменная непрерывна, но вы тренируетесь аналогично для дискретных переменных. Здесь я приведу небольшой пример для быстрой проверки.

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

# example correlated data, correlated by observations 
# number of observations 
nobs = 200
nvars = 100
# number of variables 
# covariance matrix matrixCR to create correlated data 
matrixCR <- matrix(NA, nrow = nobs, ncol = nobs)
diag(matrixCR) <- 1
matrixCR[upper.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[lower.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[1:10,1:10]
L = chol(matrixCR)# Cholesky decomposition
nvars = dim(L)[1]
set.seed(123)
rM = t(L) %*% matrix(rnorm(nvars*nobs), nrow=nvars, ncol=nobs)
rownames(rM) <- paste("V", 1:nvars, sep = "") 
colnames(rM) <- paste("O", 1:nobs, sep = "")
rM[1:10,1:10]



# introduce missing values in random places 
N <- round(nobs*nvars*0.05,0) # 5% random missing values 
set.seed(123)
inds <- round ( runif(N, 1, length(rM)) )
rM1 <- rM
rM1[inds] <- NA

Я использую missForestпакет для вменения, которые зависят от randomForestпакета, чтобы сделать это. Вы можете выполнять параллельные вычисления, если у вас есть очень большое количество точек данных для вменения.

# now use the rM1 matrix in imputation. 
require(missForest)
out.m <- missForest(rM1, maxiter = 10, ntree = 300)
# imputed 
imp.rM1 <- out.m$ximp

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

# actual values that were made missing 
aval <- rM[inds]
impv <- imp.rM1[inds]

# accuracy - defined as correlation between actual (before na introduction) and imputed values 
cor(aval,impv)
[1] 0.6759404

Вы можете работать вокруг, чтобы повысить точность. Удачи !

Рам Шарма
источник
5

Есть полные книги вменения данных, поэтому трудно дать ответ в этой структуре.

yx

y=f(x)

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

Donbeo
источник
спасибо, у вас есть какие-либо предложения книги?
Джон
Ничего особенного. но если вы
верите
В любом случае, если пропущено всего несколько значений, вы можете просто удалить всю строку. Из ваших наборов данных
Donbeo
3
Хотя вы всегда можете просто удалить случаи с отсутствующими значениями, иногда это будет плохим выбором, в зависимости от того, почему отсутствуют данные.
whuber
@whuber Я полностью с тобой согласен, но во многих случаях это просто более безопасный выбор.
Donbeo
5

Это действительно интересный вопрос. Я тоже ищу то же самое. На самом деле, есть много разных способов справиться с этим.

Первым делом, на мой взгляд, будет определение того, какой тип пропущенных данных у вас есть - пропущено полностью случайно (MCAR), пропущено случайно (MAR) или пропущено не случайно (NMAR). Это сложно и спорно , чтобы доказать , но эта бумага показывает интересный способ взглянуть на данных С.

Чтобы справиться с множественным вменением, R имеет несколько пакетов:

  • MICE (который кажется очень используемым),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

Это только несколько пакетов, которые я нашел до сих пор.

MICE также реализовал случайный лес и несколько других методов, таких как прогнозирование среднего значения.

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

Удачи!

psoares
источник
Мои данные MCAR.
Джон
1
Если ваши данные MCAR, вы можете использовать только полный анализ случая. Многие газеты сообщают, что наилучшим решением является использование полного анализа случаев с данными MCAR. По крайней мере, некоторые статьи, которые я нашел, сообщают об этом, даже если сравнивать с другими методами вменения
psoares
3

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

p

  1. Определите все модели пропусков
  2. Для каждого шаблона используйте подход выбора байесовских признаков, чтобы назначить апостериорные веса для завершения наблюдений в данных.
  3. Произвольная выборка завершенных случаев итеративно для создания полных кадров данных.
Adamo
источник
3

Ваша проблема кажется специально разработанной для какого-то низкого уровня завершения матрицы. Попробуйте использовать impute.svd()функцию из bcvпакета . Я бы предложил использовать маленький ранг (аргумент k) - что-то вроде 5.

Innuo
источник