我有一个变量age
,有13个变量x1
到x13
,以及Stata数据集中的802个观察值。 age
的值介于1到9之间。x1
到x13
的值介于1到13之间。
我想知道如何根据x1
的不同值计算x13
到age
中的1 .. 13的数量。例如,对于age
1,在x1
到x13
中,计算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
}
}
我失败了。
答案 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)
}
}
}