计算得到Stata中矩阵的值
我在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
age
,13个变量x1
到x13
,以及802个观察值<代码>年龄的值范围为1到9x1
到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
查看矩阵的外观。谢谢你抓住了这个错误。我在最后一行混淆了行和列的顺序。现在已经修好了,代码很棒<代码>重塑比我的效率高很多。