Вменение недостающих значений для PCA

23

Я использовал эту prcomp()функцию для выполнения PCA (анализа главных компонентов) в R. Однако в этой функции есть ошибка, из-за которой na.actionпараметр не работает. Я попросил помощи по stackoverflow ; два пользователя предложили два разных способа работы со NAзначениями. Однако проблема обоих решений заключается в том, что при наличии NAзначения эта строка отбрасывается и не учитывается в анализе PCA. Мой реальный набор данных представляет собой матрицу 100 x 100, и я не хочу терять всю строку только потому, что она содержит одно NAзначение.

В следующем примере показано, что prcomp()функция не возвращает никаких основных компонентов для строки 5, поскольку она содержит NAзначение.

d       <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10), 
                      V3 = sample(1:100, 10))
result  <- prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x                                # $
d$V1[5] <- NA                           # $
result  <- prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x

Мне было интересно, могу ли я установить NAзначения на определенное числовое значение, когда centerи scaleустановлены TRUEтак, чтобы prcomp()функция работала и не удаляла строки, содержащие NAs, но также не влияла на результат анализа PCA.

Я думал о замене NAзначений медианным значением в одном столбце или значением, очень близким к 0. Однако я не уверен, как это влияет на анализ PCA.

Кто-нибудь может придумать хороший способ решения этой проблемы?

user969113
источник
8
Ваша проблема не в PCA, а в более широкой проблеме обработки недостающих значений . Если вы не знакомы с ним, пожалуйста, прочитайте немного об этом. У вас есть много возможностей: (1) удалить списки по списку или (2) попарно, или (3) заменить пропуски средним или медианным. Или (4) заменить случайно выбранными действительными значениями (подход с использованием «горячей» колоды). Или вменять пропуски с помощью (5) подхода взаимной регрессии (с добавлением или без добавления шума) или с помощью лучшего (6) подхода EM.
ttnphns
Как показывают комментарии и ответы, ключ к получению хорошего ответа заключается в том, чтобы объяснить, что означаютNA значения : в чем причина «пропущенности»?
whuber
2
Я думаю, что пакет "pcaMethods" может решить вашу проблему ( здесь )
ToNoY

Ответы:

22

На самом деле существует хорошо документированный способ работы с gappy-матрицами - вы можете разложить ковариационную матрицу созданную из ваших данных X , которая масштабируется по количеству общих значений n : C = 1CXn

C=1nXTX,                Cjl=X.jY.l¯

а затем расширьте главные коэффициенты с помощью подгонки по методу наименьших квадратов (как упоминает @ user969113). Вот пример .

Xprcomp

Обновить

Другой вариант проведения PCA для набора данных с gappy - это «Рекурсивно вычтенные эмпирические ортогональные функции» (Taylor et al. 2013). Это также исправляет некоторые проблемы в методе наименьших квадратов и в вычислительном отношении намного быстрее, чем DINEOF. В этом посте сравниваются все три подхода с точки зрения точности восстановления данных с использованием ПК.

Ссылки

Беккерс, Жан-Мари и М. Риксен. «Расчеты EOF и заполнение данных из неполных наборов океанографических данных». Журнал атмосферных и океанических технологий 20.12 (2003): 1839-1856.

Тейлор М., Лош М., Венцель М. & Шрётер Дж. (2013). О чувствительности реконструкции и прогнозирования поля с использованием эмпирических ортогональных функций, полученных на основе данных gappy. Журнал Климата, 26 (22), 9194-9205.

Марк в коробке
источник
(+1) Это выглядит как ценный вклад для меня, потому что это новая идея. Я давно задал похожий вопрос, который поразительно похож: как вы оцениваете ковариационную матрицу, когда данные подвергаются цензуре (а не отсутствуют)? Если у вас есть какие-либо мысли об этой ситуации, я был бы рад получить ответ!
whuber
Спасибо @whuber - я считаю, что этот метод также имеет много достоинств. Даже если вас не интересуют интерполированные значения, этот метод намного лучше, чем описание EOF / ПК для набора данных - например, ошибка между восстановленными данными и оригиналом минимизируется с помощью алгоритма.
Марк в коробке
@whuber - Относительно цензурированных данных - это не входит в мои компетенции, и, что интересно, я задал вопрос в этом направлении несколько недель назад (который вы прокомментировали!) . Я догадываюсь, что нужно заполнить нули случайными значениями ниже предела обнаружения, которые приблизительно соответствуют распределению наблюдаемых значений. Я буду смотреть на цитируемую литературу из вашего поста - это действительно очень интересная тема.
Марк в коробке
@whuber - Вас может заинтересовать следующая статья, описывающая подобную процедуру подбора итеративной ковариационной матрицы для разреженных данных: Бьен, Джейкоб и Роберт Дж. Тибширани. «Разреженная оценка ковариационной матрицы». Биометрика 98,4 (2011): 807-820.
Марк в коробке
Спасибо @Marc. К сожалению, цензура и простота - это две разные вещи с разными проблемами.
whuber
6

Мое предложение зависит от того, сколько данных не хватает и почему они отсутствуют. Но это никак не связано с PCA. Если пропущено очень мало данных, то не имеет большого значения, что вы делаете. Замена на медиану не идеальна, но если ее не так много, она не будет сильно отличаться от лучшего решения. Вы можете попробовать сделать PCA с медианной заменой и списочным удалением и посмотреть, есть ли существенные различия в результатах.

Далее, если пропущено больше данных, вы должны подумать о том, отсутствует ли оно полностью случайно, случайно или нет. Я бы предложил множественное вменение в первых двух случаях и некоторое время в третьем случае - если данные сильно не искажены состоянием NMAR, я думаю, что множественное вменение будет лучше, чем удаление по списку (Джо Шафер из Penn State сделал много работы над отсутствующими данными - я вспоминаю некоторые его работы, показывающие, что множественное вменение работало довольно хорошо даже в некоторых случаях NMAR). Однако, если данные MCAR или MAR, свойства множественного вменения могут быть доказаны.

Если вы решите пойти с MI, следует обратить особое внимание на то, что знаки компонентов в PCA являются произвольными, и небольшое изменение в данных может поменять знак. Тогда, когда вы делаете PCA, вы получите ерунду. Давным-давно я разработал решение в SAS - это не сложно, но с этим нужно быть осторожным.

Питер Флом - Восстановить Монику
источник
1

Нет правильного решения проблемы. Каждая координата в векторе должна быть указана, чтобы получить правильный набор главных компонентов. Если координата отсутствует и заменена каким-либо вмененным значением, вы получите результат, но он будет зависеть от вмененного значения. поэтому, если есть два разумных варианта вмененного значения, разные варианты дадут разные ответы.

Майкл Р. Черник
источник
3
Я просто погуглил PCA и отсутствующие данные и обнаружил, что: 4.2 Как SIMCA справляется с отсутствующими данными? Проще говоря, алгоритм NIPALS интерполирует отсутствующую точку с использованием подгонки по методу наименьших квадратов, но не дает отсутствующим данным никакого влияния на модель. Последовательные итерации уточняют недостающее значение, просто умножая оценку и загрузку для этой точки. Существует много разных методов для пропущенных данных, таких как оценка, но они обычно сходятся к одному и тому же решению. Отсутствующие данные допустимы, если они распределены случайным образом. Систематические блоки отсутствующих данных проблематичны.
user969113
1
Я не знаю, что вы имеете в виду, не влияя на модель. Любой выбор отсутствующего значения для координаты повлияет на главные компоненты.
Майкл Р. Черник
1

Недавний документ, в котором рассматриваются подходы к работе с пропущенными значениями в анализах PCA, называется «Анализ основных компонентов с пропущенными значениями: сравнительный обзор методов» Dray & Josse (2015) . Двумя наиболее известными методами методов PCA, которые допускают пропущенные значения, являются алгоритм NIPALS, реализованный в nipalsфункции ade4пакета, и итеративный PCA (Ipca или EM-PCA), реализованный в imputePCAфункции missMDAпакета. В работе сделан вывод, что метод Ипка лучше всего работает в самых разных условиях.

Для вашего примера синтаксис:

Для НИПАЛОВ:

library(ade4)
nipals(d[,c(1,2)])

Для Ipca:

library(missMDA)
imputePCA(d[,c(1,2)],method="EM",ncp=1)
Том Венселерс
источник