Як виконати імпутацію значень у дуже великій кількості точок даних?


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

Чи існує (найкращий) спосіб вписати пропущені значення в цій ситуації? Чи корисний алгоритм Random Forest? Будь-яке робоче рішення в R буде дуже вдячним.

Зміни:

(1) Пропущені значення випадковим чином розподілені серед змінних і samples.As числа змінних є дуже великим (тут в прикладі - 10000), в той час як число вибірок мало тут , в наведеному вище прикладі фіктивної вона становить близько 200. Тому , коли ми дивимось будь-яку вибірку за всіма змінними (10000), є велика ймовірність того, що у якоїсь змінної буде відсутнє значення - через велику кількість змінних. Тому просто видалити зразок - це не варіант.

(2) Змінна може трактуватися як кількісною, так і якісною (бінарною) у процесі імпультування. Єдине судження - наскільки добре ми можемо це передбачити (точність). Тож прогнози на зразок 0,98 замість 1 можуть бути прийнятними, а не 0 проти 1 або -1 проти 1. Мені може знадобитися компроміс між часом обчислень та точністю.

(3) Я замислююся над питанням, як перевитрата може вплинути на результати, оскільки кількість змінних велика порівняно з кількістю вибірок.

(4) Оскільки загальна кількість пропущених значень становить близько 5% і є випадковою (не концентрується в жодних змінних чи зразках, оскільки вжито заходів обережності для видалення змінних або зразків, які мають дуже високі відсутні значення)

(5) Здійснення повних даних для аналізу є першим об'єктивним, а точність - другорядною. Тож не надто чутливі до точності.

r  random-forest  missing-data  data-imputation  multiple-imputation  large-data  definition  moving-window  self-study  categorical-data  econometrics  standard-error  regression-coefficients  normal-distribution  pdf  lognormal  regression  python  scikit-learn  interpolation  r  self-study  poisson-distribution  chi-squared  matlab  matrix  r  modeling  multinomial  mlogit  choice  monte-carlo  indicator-function  r  aic  garch  likelihood  r  regression  repeated-measures  simulation  multilevel-analysis  chi-squared  expected-value  multinomial  yates-correction  classification  regression  self-study  repeated-measures  references  residuals  confidence-interval  bootstrap  normality-assumption  resampling  entropy  cauchy  clustering  k-means  r  clustering  categorical-data  continuous-data  r  hypothesis-testing  nonparametric  probability  bayesian  pdf  distributions  exponential  repeated-measures  random-effects-model  non-independent  regression  error  regression-to-the-mean  correlation  group-differences  post-hoc  neural-networks  r  time-series  t-test  p-value  normalization  probability  moments  mgf  time-series  model  seasonality  r  anova  generalized-linear-model  proportion  percentage  nonparametric  ranks  weighted-regression  variogram  classification  neural-networks  fuzzy  variance  dimensionality-reduction  confidence-interval  proportion  z-test  r  self-study  pdf 

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)

Якщо ваш набір даних дуже великий, використовуйте швидкий алгоритм або масштабований.


дякую, чи є у вас які-небудь пропозиції щодо книг?
Іван

нічого зокрема. але якщо ви ввімкнете дані Google, ви можете знайти багато речей
Донбео,

У будь-якому випадку, якщо відсутні лише декілька значень, ви можете просто видалити всі рядки. З ваших наборів даних
Донбео

3
Хоча ви завжди можете просто видалити випадки з відсутніми значеннями, але іноді це буде поганий вибір, залежно від того, чому дані відсутні.
whuber

@whuber Я повністю згоден з вами, але багато разів це просто безпечніший вибір.
Донбео

5

Це справді цікаве питання. Я теж шукаю те саме. Насправді існує багато різних способів впоратися з цим.

Першим ділом, на мою думку, буде визначити, який тип пропущених даних у вас є - цілком відсутні випадковим чином (MCAR), відсутні випадково (MAR) або відсутні без випадкових ознак (NMAR). Це важко і суперечливо довести, але цей документ показує цікавий спосіб перегляду даних MAR.

Для роботи з багаторазовою імпутацією R має кілька пакетів:

  • MICE (що здається дуже використаним),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

Це лише декілька пакунків, які я знайшов поки що.

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

Це не так багато, але може допомогти вам з’ясувати деякі речі. Щойно я отримаю результати або вирішу, з яким методом я буду діяти, я відредагую публікацію.

Удачі!


Мої дані MCAR.
Іван

1
Якщо ваші дані є MCAR, ви можете використовувати лише повний аналіз справ. Багато робіт повідомляють, що найкращим рішенням є використання повного аналізу справ із даними MCAR. Принаймні, деякі статті, які я знайшов, повідомляють про це, навіть порівнюючи інші методи
імпутації

3

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

Комбінований аспект вибору особливостей (великий ) та навчання імітаційної моделі змушує мене думати, що байєсівський підхід є найкращим. Це також означає, що до цього немає чіткого підходу. Для мене найкращим підходом був би такий підхід:p

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

3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.