Я хотел бы использовать вменение для замены отсутствующих значений в моем наборе данных при определенных ограничениях.
Например, я бы хотел, чтобы вмененная переменная x1
была больше или равна сумме двух других моих переменных, скажем, x2
и x3
. Я также хочу x3
быть вмененным либо 0
или, >= 14
и я хочу x2
быть вмененным либо 0
или >= 16
.
Я попытался определить эти ограничения в SPSS для множественного вменения, но в SPSS я могу определить только максимальные и минимальные значения. Есть ли способ определить дополнительные ограничения в SPSS или вы знаете какой-нибудь пакет R, который позволил бы мне определить такие ограничения для вменения пропущенных значений?
Мои данные таковы:
x1 =c(21, 50, 31, 15, 36, 82, 14, 14, 19, 18, 16, 36, 583, NA,NA,NA, 50, 52, 26, 24)
x2 = c(0, NA, 18,0, 19, 0, NA, 0, 0, 0, 0, 0, 0,NA,NA, NA, 22, NA, 0, 0)
x3 = c(0, 0, 0, 0, 0, 54, 0 ,0, 0, 0, 0, 0, 0, NA, NA, NA, NA, 0, 0, 0)
dat=data.frame(x1=x1, x2=x2, x3=x3)
> dat
x1 x2 x3
1 21 0 0
2 50 NA 0
3 31 18 0
4 15 0 0
5 36 19 0
6 82 0 54
7 14 NA 0
8 14 0 0
9 19 0 0
10 18 0 0
11 16 0 0
12 36 0 0
13 583 0 0
14 NA NA NA
15 NA NA NA
16 NA NA NA
17 50 22 NA
18 52 NA 0
19 26 0 0
20 24 0 0
0 or 16 or >= 16
на0 or >= 16
так как>=16
включает в себя значение16
. Надеюсь, что это не испортило ваш смысл. То же самое для0 or 14 or >= 14
Ответы:
Одним из решений является написание ваших собственных функций вменения для
mice
пакета. Пакет подготовлен для этого, и установка на удивление безболезненна.Сначала мы настроим данные как предложено:
Далее мы загружаем
mice
пакет и видим, какие методы он выбирает по умолчанию:pmm
Означает предсказательной среднего соответствия - вероятно, самый популярный алгоритм вменения для вменения непрерывных переменных. Он рассчитывает прогнозируемое значение с использованием регрессионной модели и выбирает 5 ближайших элементов к прогнозируемому значению (по евклидову расстоянию ). Эти выбранные элементы называются донорским пулом, и окончательное значение выбирается случайным образом из этого донорского пула.Из матрицы прогнозирования мы находим, что методы получают переданные переменные, которые представляют интерес для ограничений. Обратите внимание, что строка является целевой переменной, а столбец - предикторами. Если x1 не имеет 1 в столбце x3, мы должны добавить это в матрицу:
imp_base$predictorMatrix["x1","x3"] <- 1
Теперь самое интересное, генерация методов вменения. Я выбрал довольно грубый метод, где я отбрасываю все значения, если они не соответствуют критериям. Это может привести к продолжительному циклу, и, возможно, будет более эффективно сохранить действительные вменения и только повторить оставшиеся, однако потребуется немного больше настроек.
Как только мы закончили с определением методов, мы просто изменили предыдущие методы. Если вы хотите изменить только одну переменную, вы можете просто использовать,
imp_base$method["x2"] <- "pmm_x2"
но для этого примера мы изменим все (наименование не обязательно):Теперь давайте посмотрим на третий вмененный набор данных:
Хорошо, это делает работу. Мне нравится это решение, так как вы можете использовать верхнюю часть основных функций и просто добавить ограничения, которые вы считаете значимыми.
Обновить
Чтобы применить строгие ограничения @ t0x1n, упомянутые в комментариях, мы можем захотеть добавить следующие функции в функцию-обертку:
Это приводит к несколько более сложной функции-обертке:
Обратите внимание, что это не очень хорошо работает, скорее всего из-за того, что предлагаемый набор данных не пропускает ограничения для всех случаев. Мне нужно увеличить длину цикла до 400-500, прежде чем он начнет себя вести. Я предполагаю, что это непреднамеренно, ваше вменение должно имитировать, как генерируются фактические данные.
оптимизация
Аргумент
ry
содержит не пропущенные значения, и мы могли бы ускорить цикл, удалив элементы, которые мы нашли приемлемые вменения, но, поскольку я не знаком с внутренними функциями, я воздержался от этого.Я думаю, что наиболее важная вещь, когда у вас есть серьезные ограничения, требующие времени для полного заполнения, - это распараллелить ваши вменения ( см. Мой ответ на CrossValidated ). Большинство из них сегодня имеют компьютеры с 4-8 ядрами, и R по умолчанию использует только одно из них. Время можно (почти) разрезать пополам, удвоив количество ядер.
Отсутствующие параметры при вменении
Что касается проблемы
x2
отсутствия во время вменения - мыши фактически никогда не подают пропущенные значения вx
-data.frame
. Метод мышей включает заполнение некоторого случайного значения при запуске. Цепная часть вменения ограничивает влияние этого начального значения. Если вы посмотрите наmice
-функцию, вы можете найти ее до вызова вменения (mice:::sampler
-функция):Функция
data.init
может быть передана вmice
функцию, и мыши. Imput.sample является основной процедурой выборки.Последовательность посещений
Если последовательность посещений важна, вы можете указать порядок, в котором
mice
-функция запускает вычисления. По умолчанию используется значение from,1:ncol(data)
но вы можете установитьvisitSequence
все, что вам нравится.источник
pmm_x1
Хотя меня беспокоит несколько вещей : (1) Взятие максимальной суммы любой возможной комбинацииx2
иx3
из всего набора данных намного строже, чем исходное ограничение. Правильная вещь должна была бы проверить , что для каждой строки ,x1 < x2 + x3
. Конечно, чем больше у вас строк, тем меньше у вас шансов на соблюдение такого ограничения (поскольку одна плохая строка разрушает все), и тем дольше цикл может потенциально получить.x1
иx2
отсутствуют, вы можете вменять значение, дляx1
которого удерживаются ограничения (скажем, 50), но послеx2
вменения они нарушаются (например, вменяется как 55). Есть ли способ вменять «горизонтально», а не вертикально? Таким образом , мы могли бы приписывать один рядx1
,x2
иx3
и просто повторно Условная оценка его до тех пор , что конкретная строка не подпадает под ограничения. Это должно быть достаточно быстро, и как только это будет сделано, мы можем перейти к следующему ряду. Конечно, если MI "вертикальный" по своей природе, нам не повезло. В таком случае, может быть, подход, о котором говорил Александр?mice
пакет. Спасибо, что поделился.debug()
, чтобы увидеть, какmice.impute.pmm
и его братья и сестры работают под капотом.Самая близкая вещь, которую я мог найти, является предварительным информационным включением Амелии . Смотрите главу 4.7 в виньетке , в частности 4.7.2:
Таким образом, хотя вы не сможете вообще сказать что-то подобное
x1<x2+x3
, вы можете зациклить свой набор данных и добавить уровень наблюдения до каждого соответствующего случая. Также могут быть применены постоянные границы (например, установка x1, x2 и x3 как неотрицательные). Например:источник
Ограничения, вероятно, легче реализовать в предсказывающем среднем совпадении множественного вменения. Это предполагает, что существует значительное количество наблюдений с не отсутствующими ограничивающими переменными, которые удовлетворяют ограничениям. Я думаю о реализации этого в функции
Hmisc
пакета R.aregImpute
Вы можете проверить через месяц или около того. Будет важно указать максимальное расстояние от цели, которым может быть наблюдение донора, потому что ограничения будут отталкивать доноров от идеального неограниченного донора.источник
x<y<z
.x1<x2
)?aregImpute
функцией R с прогнозирующим соответствием среднего. Но что, если ни одно из донорских наблюдений (близких совпадений прогнозов) не удовлетворяет ограничениям для целевого наблюдения, вменяемым, даже если они, очевидно, должны были соответствовать ограничениям на набор донорных переменных?Я считаю, что
Amelia
пакет (Amelia II) в настоящее время имеет наиболее полную поддержку для определения ограничений диапазона значений данных. Однако проблема состоит в том, чтоAmelia
предполагается, что данные многомерны нормально.Если в вашем случае предположение о многомерной нормальности не применимо, вы можете проверить
mice
пакет, который реализует множественное вменение (MI) через цепочечные уравнения . Этот пакет не предполагает многомерной нормальности . Он также имеет функцию, которая может быть достаточно для определения ограничений , но я не уверен, в какой степени. Функция называетсяsqueeze()
. Вы можете прочитать об этом в документации: http://cran.r-project.org/web/packages/mice/mice.pdf . Дополнительным преимуществомmice
является его гибкость с точки зрения возможности задания пользовательских функций вменения и более широкого выбора алгоритмов. Вот учебник по выполнению MI, используяmice
:http://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .Насколько я понимаю,
Hmisc
пакет доктора Харрелла , использующий тот же подход цепных уравнений ( прогнозирующее совпадение среднего ), вероятно, поддерживает ненормальные данные (за исключениемnormpmm
метода). Возможно, он уже реализовал функциональность спецификации ограничений согласно ответу выше. Я не использовалaregImpute()
, поэтому не могу сказать больше об этом (я использовалAmelia
иmice
, но я определенно не эксперт в области статистики, просто пытаюсь узнать как можно больше).Наконец, вам может быть интересен следующий, немного устаревший, но все же хороший обзор подходов, методов и программного обеспечения для многократного ввода данных с пропущенными значениями: http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . Я уверен, что есть новые обзорные статьи по МИ, но это все, что я знаю в настоящее время. Я надеюсь, что это несколько полезно.
источник
aregImpute
.squeeze
том, что его границы постоянны, поэтому вы не можете указать ничего подобногоx1<x2
. Кроме того, это, кажется, вызывается на вмененном векторе результата, который я считаю слишком поздно. Мне кажется, что границы должны учитываться в процессе вменения, поэтому они имеют большее значение, чем корректировка по факту.Amelia
, потому что я переключился с них наmice
, как только мои тесты подтвердили, что мои данные не являются многомерными нормальными. Однако недавно я натолкнулся на этот замечательный набор слайдов, посвященных теме (методы и программное обеспечение MI): statistik.lmu.de/~fkreuter/imputation_sose2011/downloads/… . Если я правильно понял, он описывает потенциальное решение проблемы ограничений (см. PDF-страницу 50, а не слайд № 50!). Надеюсь это поможет.Если я правильно понимаю ваш вопрос, мне кажется, что вы уже знаете, какие значения должны принимать отсутствующие переменные с учетом некоторых ограничений. Я не очень разбираюсь в SPSS, но в RI думаю, что вы можете написать функцию для этого (что не должно быть слишком сложным, в зависимости от вашего опыта, я должен сказать). Я не знаю ни одного пакета, который работает с такими ограничениями.
источник