计算得到Stata中矩阵的值

计算得到Stata中矩阵的值,stata,Stata,我在Stata数据集中有一个变量age,13个变量x1到x13,以及802个观察值年龄的值范围为1到9x1到x13的值范围为1到13 我想知道怎样数一的数字。。根据年龄的不同值,从x1到x13中的13个。例如,对于age1,在x1到x13中,计算1,2,3,4 我首先通过使用将x1更改为x13作为矩阵 mkmat x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13, matrix (a) 然后,我想使用以下循环进行计数: gen count = 0 quie

我在Stata数据集中有一个变量
age
,13个变量
x1
x13
,以及802个观察值<代码>年龄的值范围为1到9
x1
x13
的值范围为1到13

我想知道怎样数一的数字。。根据年龄的不同值,从
x1
x13
中的13个。例如,对于
age
1,在
x1
x13
中,计算1,2,3,4

我首先通过使用将
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
    }
}

我失败了。

我还是有点不确定你想要实现什么。但如果我理解正确的话,这里有一个方法

首先,一个简单的数据,其
age
范围为1到3,四个变量
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')
}
     +----------------------------------------+
     | 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 |
     +----------------------------------------+
下面是数据现在的样子。要解释的是,
n5
下的第一个“1”表示整个
x1-x4
中的主题只有一个“5”

forval i=5/7    {
    egen n`i'=anycount(x1 x2 x3 x4),v(`i')
}
     +----------------------------------------+
     | 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

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

gen id = _n 
reshape long x, i(id) 
tab age x
请注意,示例代码不会在不同的时间循环,并且
count
命令中有一个不正确的逗号。我不会尝试修复代码,因为还有很多更直接的方法,其中一个就是上面提到的<代码>制表有一个将表格另存为矩阵的选项

这里有另一个更接近原始想法的解决方案。警告:代码未测试

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) 
        }
    }
}

我不太确定你努力取得什么结果。看起来您需要不止一个新的“count”变量。你能举一个简单数据的例子吗?对于当前值,删除“r”和“x”以引用矩阵中的元素。也可以检查
egen
命令。它有几个可用的计数功能。例如,对于年龄组1,矩阵a中共有16个1,矩阵a中共有15个2…矩阵a中共有10个13。非常感谢。我得到的值从1到13,年龄从1到11。我希望生成矩阵,就像您在最后一步中提供的一样-A[11,13]。我注意到在你的例子中,1岁有4个6,但结果只显示了1个6。你的编程有错误吗。。我是stata的初学者。。再次感谢您的帮助。当然需要做一些更改,但我认为本例中的原则应该足够了。要创建更大的矩阵,请更改
mat a=J(3,3,)
行中的值。您始终可以使用
mat list A
查看矩阵的外观。谢谢你抓住了这个错误。我在最后一行混淆了行和列的顺序。现在已经修好了,代码很棒<代码>重塑比我的效率高很多。