В матрице неожиданно отсутствуют ячейки при сборе z-статистики из mlogit - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу запустить серию полиномиальных логитов (600 по каждому ковариате интереса) и собрать z-статистику для каждого из них (мне все равно, в каком порядке они записываются).

Эти журналы запускаются на небольшом фрагменте моих данных (с общим идентификатором группы).Млогиты имеют различное количество связанных результатов (n), и будет (n - 1) z статистика, которую нужно собрать из каждого млогита.Каждый mlogit имеет вид: y = a + _b * x + \ epsilon, где y может принимать от 2 до 9 значений (по моим данным), хотя среднее значение составляет 3,7.

Я считаю, что трудности возникаютвытащить эти z-stats из mlogit, так как я не знаю, как напрямую вызвать матрицу z-stats.Мое решение состоит в том, чтобы построить z-stats из матриц e (V) и e (b).Для каждой итерации mlogit я строю матрицу z-статистики;Затем я добавляю это к предыдущей матрице z-статов (тем самым выстраивая матрицу из всех вычисленных).К сожалению, мой код, кажется, не делает это должным образом.

Симптомы следующие.Матрица mat_covariate включает в себя множество пропущенных значений (более половины значений матрицы отсутствовало в устранении неполадок, которые я сделал).Он также включает в себя много нулей (которые возможны, но маловероятны - особенно с такой скоростью, около 16%).Как написано, код еще не подавляет млогиты, которые я запускаю, и поэтому я могу вернуться и проверить, что превращается в матрицу.Не более одного значения из каждого mlogit записывается, но они часто записываются несколько раз.40% млогитов ничего не записали.

Ниже приведен соответствующий цикл:

local counter = 1
forvalues i = 1/`times' {
    preserve
    keep if group_id==`i'
    foreach covariate in `covariates' {
        if `counter' == 1 {
            mlogit class `covariate'
            sum outcomes_n, meanonly
            local max = `r(max)'
            local max_minus = `max' - 1
            matrix mat_`covariate' = J(`max_minus',1,0)
            forvalues j = 1/`max_minus' {
                mat V = e(V)
                mat b = e(b)
                local z = b[1+2*(`j'-1),1] / ( V[1+2*(`j'-1),1+2*(`j'-1)] ) ^ (.5)

                matrix mat_`covariate'[`j',1] = `z'
            }
        }
        else {
            mlogit class `covariate'
            sum outcomes_n, meanonly
            local max `r(max)'
            local max_minus = `max' - 1
            matrix mat_`covariate'_temp = J(`max_minus',1,0)
            forvalues j = 1/`max_minus' {
                mat V = e(V)
                mat b = e(b)
                local z = b[1+2*(`j'-1),1] / ( V[1+2*(`j'-1),1+2*(`j'-1)] ) ^ (.5)
                matrix mat_`covariate'_temp[`j',1] = `z'
                matrix mat_`covariate' = mat_`covariate' \ mat_`covariate'_temp
            }
            matrix mat_`covariate' = mat_`covariate' \ mat_`covariate'_temp
        }
    }
    local counter = `counter'+1
    restore
}

Некоторые причины, по которым я сделал некоторые вещи в цикле.Я верю, что эти вещи работают, но они не мои первые инстинкты, и мне непонятно, почему мой первый инстинкт не работает.Если есть более простой / более элегантный способ их решения, это было бы хорошим бонусом:

  • главный if / else (и счетчик) - это решение проблемы, которую я не могу определить как матрицуфункция сама по себе, когда она еще не была определена.
  • Я определяю локальную для максимума и отдельную для (макс-1).Цикл forvalues ​​не будет принимать «1 / (` max'-1) {», и я не уверен, почему.

Я создал несколько примеров данных, которые можно использовать для репликации этой проблемы.Ниже приведен код файла .do, который устанавливает данные, локальные значения для цикла, цикл выше и демонстрирует симптомы, отображая соответствующую матрицу:

clear all
version 14

//================== sample data: ================== 
set obs 500
set seed 12345

gen id = _n

gen group_id = .
replace group_id = 1 if id <= 50
replace group_id = 2 if id <= 100 & missing(group_id)
replace group_id = 3 if id <= 150 & missing(group_id)
replace group_id = 4 if id <= 200 & missing(group_id)
replace group_id = 5 if id <= 250 & missing(group_id)
replace group_id = 6 if id <= 325 & missing(group_id)
replace group_id = 7 if id <= 400 & missing(group_id)
replace group_id = 8 if id <= 500 & missing(group_id)

gen temp_subgroup_id = .
replace temp_subgroup_id = floor((3)*runiform() + 2) if group_id < 6
replace temp_subgroup_id = floor((4)*runiform() + 2) if group_id < 8 & missing(temp_subgroup_id)
replace temp_subgroup_id = floor((5)*runiform() + 2) if missing(temp_subgroup_id)

egen subgroup_id = group(group_id temp_subgroup_id)

bysort subgroup_id : gen subgroup_size = _N
bysort group_id subgroup_id : gen tag = (_n == 1)
bysort group_id : egen outcomes_n = total(tag)

gen binary_x = floor(2*runiform())


//================== locals: ================== 
local covariates binary_x
local times = 8
// times is equal to the number of group_ids

//================== loop in question: ================== 
local counter = 1
forvalues i = 1/`times' {
    preserve
    keep if group_id==`i'
    foreach covariate in `covariates' {
        if `counter' == 1 {
            mlogit subgroup_id `covariate'
            sum outcomes_n, meanonly
            local max = `r(max)'
            local max_minus = `max' - 1
            matrix mat_`covariate' = J(`max_minus',1,0)
            forvalues j = 1/`max_minus' {
                mat V = e(V)
                mat b = e(b)
                local z = b[1+2*(`j'-1),1] / ( V[1+2*(`j'-1),1+2*(`j'-1)] ) ^ (.5)

                matrix mat_`covariate'[`j',1] = `z'
            }
        }
        else {
            mlogit subgroup_id `covariate'
            sum outcomes_n, meanonly
            local max `r(max)'
            local max_minus = `max' - 1
            matrix mat_`covariate'_temp = J(`max_minus',1,0)
            forvalues j = 1/`max_minus' {
                mat V = e(V)
                mat b = e(b)
                local z = b[1+2*(`j'-1),1] / ( V[1+2*(`j'-1),1+2*(`j'-1)] ) ^ (.5)
                matrix mat_`covariate'_temp[`j',1] = `z'
                matrix mat_`covariate' = mat_`covariate' \ mat_`covariate'_temp
            }
            matrix mat_`covariate' = mat_`covariate' \ mat_`covariate'_temp
        }
    }
    local counter = `counter' + 1
    restore
}

//================== symptoms: ================== 
matrix list mat_binary_x

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

1 Ответ

0 голосов
/ 14 декабря 2018

Рассмотрим простейший случай, когда i == 1 и max_minus == 2:

preserve
keep if group_id == 1

summarize outcomes_n, meanonly           
local max = `r(max)'
local max_minus = `max' - 1

mlogit subgroup_id binary_x

matrix V = e(V)
matrix b = e(b)

Это приводит к следующему:

. matrix list V

symmetric V[6,6]
                       1:          1:          2:          2:          3:          3:
                                               o.          o.                        
                binary_x       _cons    binary_x       _cons    binary_x       _cons
  1:binary_x   .46111111
     1:_cons       -.225        .225
2:o.binary_x           0           0           0
   2:o._cons           0           0           0           0
  3:binary_x    .2111111  -.09999999           0           0   .47896825
     3:_cons  -.09999999   .09999999           0           0  -.24285714   .24285714


. matrix list b

b[1,6]
             1:          1:          2:          2:          3:          3:
                                     o.          o.                        
      binary_x       _cons    binary_x       _cons    binary_x       _cons
y1   .10536052  -.22314364           0           0   .23889194  -.35667502


. local j = `max_minus'

. display "z = `= b[1+2*(`j'-1),1] / ( V[1+2*(`j'-1),1+2*(`j'-1)] ) ^ (.5)'"
z = .

Значение z отсутствует, поскольку выделение значения строки в матрице e(b), которая не существует.Другими словами, ваши циклы установлены неправильно и заменяют неправильные значения.

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