计算值以获得Stata中的矩阵

时间:2014-08-15 03:20:31

标签: stata

我有一个变量age,有13个变量x1x13,以及Stata数据集中的802个观察值。 age的值介于1到9之间。x1x13的值介于1到13之间。

我想知道如何根据x1的不同值计算x13age中的1 .. 13的数量。例如,对于age 1,在x1x13中,计算1,2,3,4,... 13的数量。

我首先使用

x1更改为x13作为矩阵
mkmat x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13, matrix (a)

然后,我想使用以下循环计算:

gen count = 0 
quietly forval i = 1/802 {
    quietly forval j = 1/13 { 
       replace count = count + inrange(a[r'i', x'j'], 0, 1), if age==1
    }
}

我失败了。

2 个答案:

答案 0 :(得分:1)

我仍然不确定你想要达到的目标。但如果我理解正确,这是一种方法。

首先,一个简单的数据age范围从1到3,以及4个变量x1-x4,每个变量的整数值介于5到7之间。

clear
input age x1 x2 x3 x4
1 5 6 6 6
1 7 5 6 5
2 5 7 6 6
3 5 6 7 7
3 7 6 6 6
end

然后我们创建三个计数变量(n5,n6和n7),计算x1-x4中每个主题的5s,6s和7s的数量。

forval i=5/7    {
    egen n`i'=anycount(x1 x2 x3 x4),v(`i')
}

以下是数据现在的样子。要解释一下,n5下的第一个“1”表示x1-x4内的主题只有一个“5”。

     +----------------------------------------+
     | age   x1   x2   x3   x4   n5   n6   n7 |
     |----------------------------------------|
  1. |   1    5    6    6    6    1    3    0 |
  2. |   1    7    5    6    5    2    1    1 |
  3. |   2    5    7    6    6    1    2    1 |
  4. |   3    5    6    7    7    1    1    2 |
  5. |   3    7    6    6    6    0    3    1 |
     +----------------------------------------+

听起来我的最终目标是为每个年龄值分别计算金额。假设这是真的,让我们创建一个3x3矩阵来存储这样的结果。

mat A=J(3,3,.) // age (1-3) and values (5-7)
mat rown A=age1 age2 age3
mat coln A=value5 value6 value7

forval i=5/7    {
    forval j=1/3    {
        qui su n`i' if age==`j'
        loca k=`i'-4 // the first column for value5
        mat A[`j',`k']=r(sum)
    }
}

矩阵看起来像这样。要解释一下,value5下的第一个“3”表示,对于所有1岁的孩子,值{5 x1-x4

总共出现三次
A[3,3]
      value5  value6  value7
age1       3       4       1
age2       1       2       1
age3       1       4       3

答案 1 :(得分:1)

以Aspen为例,你可以这样做:

gen id = _n 
reshape long x, i(id) 
tab age x

请注意,您的示例代码不会循环遍历不同年龄,并且count命令中的逗号不正确。我不会尝试修复代码,因为有更多的直接方法,其中一个是上面的。 tabulate可以选择将表格保存为矩阵。

这是另一种更接近原始想法的解决方案。警告:代码未经过测试。

matrix count = J(9, 13, 0) 

forval i = 1/9 { 
    forval j = 1/13 { 
        forval J = 1/13 { 
            qui count if age == `i' & x`J' == `j'   
            matrix count[`i', `j'] = count[`i', `j'] + r(N) 
        }
    }
}