Matrix 从mlogit收集z统计信息时,矩阵有意外丢失的单元格

Matrix 从mlogit收集z统计信息时,矩阵有意外丢失的单元格,matrix,stata,mlogit,Matrix,Stata,Mlogit,我希望运行一系列多项式logit(每个感兴趣的协变量600 ish)并收集其中每个变量的z统计数据(我不关心这些数据的记录顺序) 这些MLogit在我的一小块数据(共享组ID)上运行。mlogit有不同数量的结果(n),从每个mlogit收集(n-1)z统计数据。每个mlogit的形式为:y=a+_b*x+\epsilon,其中y可以取2到9个值(在我的数据中),尽管平均值为3.7 我相信困难在于将这些z-stats从mlogit中拉出来,因为我不知道如何直接调用z-stats矩阵。我的解决方案

我希望运行一系列多项式logit(每个感兴趣的协变量600 ish)并收集其中每个变量的z统计数据(我不关心这些数据的记录顺序)

这些MLogit在我的一小块数据(共享组ID)上运行。mlogit有不同数量的结果(n),从每个mlogit收集(n-1)z统计数据。每个mlogit的形式为:y=a+_b*x+\epsilon,其中y可以取2到9个值(在我的数据中),尽管平均值为3.7

我相信困难在于将这些z-stats从mlogit中拉出来,因为我不知道如何直接调用z-stats矩阵。我的解决方案是从e(V)和e(b)矩阵构造z-stats。对于mlogit的每次迭代,我构造一个z-stats矩阵;然后,我将其附加到之前的z-stats矩阵中(从而构建一个所有已计算的z-stats矩阵)。不幸的是,我的代码似乎没有正确地完成这项工作

症状如下。矩阵mat_协变量包括许多缺失值(在我所做的故障排除中,超过一半的矩阵值缺失)。它还包括许多零(这是可能的,但不太可能——特别是在这种情况下,大约16%)。正如所写的,代码还没有抑制我运行的mlogit,因此我可以返回并检查是什么使它进入矩阵。每个mlogit最多记录一个值,但这些值通常记录多次。40%的MLOGIT没有任何记录

相关循环如下所示:

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(和计数器)是为了解决一个问题,即当矩阵尚未定义时,我无法将其定义为自身的函数
  • 我为max定义了一个局部变量,为(max-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
全部清除
版本14
//=================================样本数据:====================================
设置obs 500
种子12345
发电机id=\u n
gen group_id=。

如果id则替换组id=1,考虑最简单的情况,即
i==1
max\u减号==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)
不存在。换句话说,您的循环是
未正确设置并替换不正确的值。

我没有尝试详细了解这一点。但我的策略可能是从一开始就设置一个矩阵,其中包含尽可能多的行和列,并用缺失填充;然后循环模型并替换尽可能多的值。但我不会从这里开始。您的不同ent适合不同的组,因此我将从
statsby
开始。Pearly:是的,我想你是对的。我在调用e(b)时切换了行/列。我还以为mlogit中遗漏的变量是最后一个,但情况似乎并非如此。这意味着我经常除以零和/或β为零。我将花一些时间研究它,看看解决这两个问题是否能解决我的问题。谢谢!尼克:我不熟悉-statsby-,看起来这可能是一种更简单的解决方法做事。谢谢你指出这一点!我能够根据你的建议解决这个问题,而且循环似乎运行顺利。如果你想把它作为一个答案,我会接受的。