使用多重插补和复杂样本设计的多因素相关(Stata)

使用多重插补和复杂样本设计的多因素相关(Stata),stata,correlation,Stata,Correlation,我有一个数据库(我使用Stata 13),该数据库具有复杂样本设计(Strate和Pweight)的多重插补,因此我通常在分析之前使用以下命令:mi estimate,esampvaryok:svy: 我只是想知道,在这种情况下,有没有办法在Stata中使用polychoric命令?或者,如果不可能,您知道其他允许我这样做的软件吗 对每个插补数据集应用polychoric,然后对结果进行平均。尽管polychoric不了解调查,但只需要概率权重来估计相关性。下面是计算相关性的两个估计值的代码:1

我有一个数据库(我使用Stata 13),该数据库具有复杂样本设计(Strate和Pweight)的多重插补,因此我通常在分析之前使用以下命令:
mi estimate,esampvaryok:svy:


我只是想知道,在这种情况下,有没有办法在Stata中使用
polychoric
命令?或者,如果不可能,您知道其他允许我这样做的软件吗

对每个插补数据集应用
polychoric
,然后对结果进行平均。尽管polychoric不了解调查,但只需要概率权重来估计相关性。下面是计算相关性的两个估计值的代码:1)来自
polychoric
的单个相关性的平均值;2) 基于这些相关性的平均反双曲正切变换的估计。在这个例子中,它们是相似的,但我通常更喜欢后者。见:尼克·考克斯,《发言状态:与自信的相关性》,或《重新审视费舍尔的z》。《国家统计局杂志》(2008)8,第3期,第413-439页

更新:将相关性输出到Stata矩阵,并添加行和列名

/* Create MI data set */
set seed 43228226
sysuse auto, clear
recode rep78 1/2=3
replace foreign = . in 3/5
mi set flong
mi register impute rep78 foreign
mi impute chained ///
(ologit) rep78  ///
(logit) foreign =  turn weight mpg ///
[pw = turn], add(5) double

/* Set up polychoric */

/* local macro with variables */
local pvars rep78 foreign mpg weight

local nvars : word count("`pvars'")
mata: nv = strtoreal(st_local("nvars"))

qui mi des
mata: nreps = st_numscalar("r(M)")

/* loop through MI data sets to get sums*/
mata: sum_r = J(nv,nv,0)
mata: sum_atr = J(nv,nv,0)

forvalues i = 1/`=r(M)'{
qui polychoric `pvars' [pw = turn] if _mi_m==`i'
mata: r = st_matrix("r(R)")
mata: sum_r = sum_r  + r
mata: sum_atr = sum_atr +atanh(r)
}
/* Now average and get estimates */
mata:
st_matrix("rho1",sum_r/nreps)
/* For version based on atanh:
1) Get average of atanh transforms.
2) Diagonal elements are missing; substitute 0s.
3) Back transform to correlation scale.
4) Put 1s on diagonal.
5) Make the matrix symmetric. */
 st_matrix("rho2",  ///
 makesymmetric(tanh(lowertriangle(sum_atr/nreps,0))) +I(nv))
end


/* rho1 : average correlations
   rho2 : back transform of average atanh(r) */
forvalues i = 1/2 {
mat colnames rho`i' = `pvars'
mat rownames rho`i' = `pvars'
mat list rho`i'
}
更新2:主要是Mata

/* Set up variables & pweight  */
local pcvars rep78 foreign mpg weight
local pwtvar turn

mata:
stata("qui mi query")
M= st_numscalar("r(M)") 

vnames = tokens(st_local("pcvars"))
nv = cols(vnames)

/*Initialize sums for average numerators */
sum_r = J(nv,nv,0)
sum_atr = J(nv,nv,0)

/* Run -polychoric- on each imputed data set */
for (j = 1; j<=M; j++) {
  st_numscalar("j",j)
  stata("qui polychoric `pcvars' [pw = `pwtvar'] if _mi_m==j")
  r = st_matrix("r(R)")
  sum_r = sum_r  + r
  sum_atr = sum_atr + atanh(r)
}
/* Create Stata correlation matrices from average over imputations*/
st_matrix("rho1",sum_r/M)
st_matrix("rho2",  ///
  makesymmetric(tanh(lowertriangle(sum_atr/M,0))) +I(nv))

/* Label rows & columns */
c =  (J(nv,1,""),vnames')
st_matrixrowstripe("rho1",c)
st_matrixcolstripe("rho1",c)

st_matrixrowstripe("rho2",c)
st_matrixcolstripe("rho2",c)
end

mat list rho1
mat list rho2
/*设置变量和重量*/
本地pcvars rep78国外mpg重量
局部pwtvar转弯
马塔:
stata(“qui-mi查询”)
M=st_numscalar(“r(M)”)
vnames=代币(st_local(“PCVAR”))
nv=cols(vnames)
/*初始化平均分子的和*/
总和=J(nv,nv,0)
总和atr=J(nv,nv,0)
/*在每个插补数据集上运行-polychoric*/

对于(j=1;jIt的一个很好的实践是,如果不是从Stata base安装中提到命令来自何处。
polychoric
是一个用户编写的命令,可以运行
findit polychoric
。感谢您提供这种语法!非常欢迎。如果您喜欢这个答案,请接受。我已经添加了另一个版本的Analysiss代码。您可以在顶部指定
polychoric
的变量和概率权重。此版本可能比原始版本快一点,因为它实际上都在Mata中,例外情况是
mi query
(替换
mi des
)的一行和
polychoric
的一行。