我有400行40列的矩阵。
我想从这个数据创建一个新矩阵,我计算2个变量之间的一致性,即concord [A1,B1] = number1; concord [A1,B2] = number2; [A1,B39] = number39。所以,number1现在应该是新矩阵第一行的第一个数字;数字2是第一行中的第二个数字....
最终结果是一个新矩阵,显示原始数据矩阵中每对数字的rho_c。
原始矩阵有很多空单元格。我还可以创建多个一致性计算子矩阵,这没关系。但是,我不太明白如何在mata中编写这个命令。
我在这里搜索过:http://jasoneichorst.com/wp-content/uploads/2012/01/BeginMatrix.pdf
编辑:数据看起来像这样(变量“Score1”是评价者)。并非所有评估者对同一项目评分。 enter image description here
答案 0 :(得分:1)
假设我完全理解这个问题,有一些方法可以做到这一点。想到的一个问题涉及使用SSC(concord
)提供的ssc install concord
以及一些本地宏和循环。
/* Clear and set up sample data */
clear *
set obs 60
forvalues i = 1/6 {
gen A`i' = runiform()
}
replace A2 = . in 10/L
replace A3 = . in 1/5
replace A3 = . in 20/L
replace A4 = . in 1/20
replace A4 = . in 30/L
replace A5 = . in 1/15
replace A5 = . in 40/L
replace A6 = . in 1/40
/* End data set-up */
* describe, varlist will allow you to store your variables in a local macro
qui describe, varlist
local vars `r(varlist)'
* get number of variables in local macro vars
local varcount : word count `vars'
* Create a matrix to hold rho_c
mat rho = J(6,6,.)
mat rownames rho = `vars'
mat colnames rho = `vars'
* Loop through vars to run concord on all unique combinations of A1-A6
* using the position of each variable in local vars to assign the var name
* to local x and local y
* concord is executed only for j >= i so that you don't end up with two sets
* of the same variables being ran (eg., A1,A2 and A2,A1)
forvalues i = 1/`varcount' {
local y `: word `i' of `vars''
forvalues j = 1/`varcount' {
local x `: word `j' of `vars''
if `j' >= `i' {
capture noisily concord `y' `x'
mat rho[`i',`j'] = r(rho_c)
}
}
}
* Display the results stored in the matrix, rho.
mat list rho
上面的代码可以帮助您入门,但可能需要根据您的具体操作进行更改。
您会注意到,在循环内部,我在capture noisily
之前添加了concord
。这样做的原因是因为在您链接的图像中,您的变量在整个观察部分中都缺少值。这可能会导致抛出错误消息(具体来说,r(2000):没有观察)。如果在那里发生错误,capture
块会强制Stata继续执行循环。 noisily
部分告诉Stata显示concord
的输出,即使指定了capture
。
此外,如果您在Stata中搜索help concord
,您将被引导至帮助页面,该页面指示一致性相关系数存储在r(rho_c)
中。您可以将它们作为单个标量存储在循环中,或者像在示例中那样存储,并创建一个kxk值矩阵。