Ошибка с пакетом oaxaca в r — несоответствующие аргументы

Я пытаюсь запустить декомпозицию Oaxaca с помощью пакета oaxaca, но включение определенных переменных, по-видимому, вызывает ошибку "несовместимые аргументы". Насколько я могу судить, ошибка возникает только при включении определенных факторных/категориальных переменных, но не всех факторных/категориальных переменных.

Вот минимальный воспроизводимый пример моего набора данных, wvs_reduc:

structure(list(emp = c(1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 
1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 
0, 0, 0, 0, 0, 0), education = structure(c(4L, 3L, 2L, 2L, 3L, 
3L, 2L, 6L, 4L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 4L, 4L, 1L, 2L, 4L, 
4L, 4L, 4L, 4L, 4L, 3L, 4L, 4L, 4L, 4L, 3L, 2L, 4L, 4L, 4L, 3L, 
2L, 4L, 3L), .Label = c("No Formal Education", "Primary or Less", 
"Incomplete Secondary", "Secondary", "Incomplete University", 
"University or More"), class = "factor"), marital = structure(c(1L, 
1L, 3L, 3L, 1L, 3L, 3L, 1L, 1L, 3L, 3L, 1L, 3L, 4L, 3L, 1L, 1L, 
4L, 3L, 1L, 3L, 4L, 1L, 3L, 3L, 3L, 3L, 1L, 3L, 4L, 4L, 4L, 4L, 
3L, 3L, 4L, 3L, 3L, 4L, 3L), .Label = c("single", "cohabiting", 
"married", "previously married"), class = "factor"), Arab = c(1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, 
-40L), class = c("tbl_df", "tbl", "data.frame"))

Когда я запускаю команду:

library(oaxaca)
oaxaca(emp ~ education + marital | Arab, 
       data = wvs_reduc, group.weights = 0, R = 10)

Я получаю сообщение об ошибке: Ошибка в t(x.mean.A) %*% delta.A: несоответствующие аргументы.

Если это уместно, когда я запускаю команду для своего большего набора данных, вместо этого я получаю аналогичную, но не идентичную ошибку с включением переменной «брак», но не «образование» или другие переменные фактора:

Ошибка в t(x.mean.A - x.mean.B) %*% beta.B: несоответствующие аргументы


person Ella Wind    schedule 25.03.2020    source источник
comment
Хм, хорошо, ошибка возникает из-за того, что один из ваших факторов закончился только одним наблюдением в начальной загрузке. Таким образом, ошибка возникает с действительно ошибочной частью исходного кода, где предполагается матрица, но если у вас n = 1, это вектор   -  person StupidWolf    schedule 25.03.2020
comment
это базовая оболочка oaxaca:::.oaxaca.wrap, а часть ошибки - это набор строк, E ‹- as.numeric(t(x.mean.A - x.mean.B) %*% beta.B ) ...   -  person StupidWolf    schedule 25.03.2020
comment
вряд ли вы сможете обойти это .. вопрос, который вы знаете, нужен ли вам бутстрап?   -  person StupidWolf    schedule 25.03.2020
comment
Хм... поэтому я настроил его так, чтобы он не выполнял начальную загрузку, и с моим уменьшенным набором данных, который я представил здесь, это не решило проблему, но с моим большим набором данных это позволило мне добавить одну из моих ранее неработающих переменных, но не другую один. Если проблема в том, что n = 1, как вы думаете, может ли помочь свертывание некоторых категорий для моих категориальных переменных?   -  person Ella Wind    schedule 26.03.2020
comment
Да, это будет работать без бутстрапа. Установите R=1. Например, в приведенном вами примере все арабское одно, поэтому это не сработает. Вы всегда можете попробовать свои переменные, чтобы убедиться, что с вашими данными все в порядке.   -  person StupidWolf    schedule 26.03.2020


Ответы (1)


Глядя на базовый код oaxaca:::.oaxaca.wrap и часть с ошибкой, вы видите эту кучу строк:

E <- as.numeric(t(x.mean.A - x.mean.B) %*% beta.B)
C <- as.numeric(t(x.mean.B) %*% (beta.A - beta.B))
I <- as.numeric(t(x.mean.A - x.mean.B) %*% (beta.A - beta.B))

Если любой из x.mean.A является вектором, он выдаст ошибку. Глядя на ваш дизайн в этом примере набора данных:

table(wvs_reduc$education,wvs_reduc$Arab)

                         0  1
  No Formal Education    0  2
  Primary or Less        2 10
  Incomplete Secondary   4  3
  Secondary             14  4
  Incomplete University  0  0
  University or More     0  1

Таким образом, все нули будут удалены, и я бы сказал, что вам нужно убедиться, что уровни распределены по вашей категории группировки. Мы можем подтвердить это, моделируя эту переменную:

set.seed(111)
wvs_reduc$test_education =sample(levels(wvs_reduc$education),nrow(wvs_reduc),replace=TRUE)
wvs_reduc$test_marital =sample(levels(wvs_reduc$marital),nrow(wvs_reduc),replace=TRUE)

Мы запускаем это и отключаем загрузку:

oaxaca(emp ~ test_education + test_marital  | Arab, data=wvs_reduc,R=NULL)

И если мы установим bootstrap, он вылетает, потому что при субдискретизации может столкнуться с той же ошибкой:

oaxaca(emp ~ test_education + test_marital  | Arab, data=wvs_reduc,R=2)
oaxaca: oaxaca() performing analysis. Please wait.

Bootstrapping standard errors:
1 / 2 (50%)
Error in t(x.mean.A) %*% delta.A : non-conformable arguments
In addition: There were 11 warnings (use warnings() to see them)

Поэтому, чтобы он работал на всем вашем фрейме данных, вам нужно проверить, есть ли уровни с n = 1 (с учетом групп)

person StupidWolf    schedule 26.03.2020