forv i = 1/10 {
set obs 10
gen x`i' = (_n-1)*10+`i'
}
这是我目前的代码。我怎样才能将它变成对角矩阵,以便每当行广告列索引不相等时条目为0?
这是我尝试的但它不起作用。
forv i=1/10 {
set obs 10
gen x`i' = (_n-1)*10+`i'
foreach j of varlist x1-x10 {
if _n ~= "`i'"
replace `j' = 0
}
}
答案 0 :(得分:1)
@NickCox的解决方案也适用于mata
-Stata的矩阵编程语言:
. mata: A = 7 * I(5)
. mata: A
[symmetric]
1 2 3 4 5
+---------------------+
1 | 7 |
2 | 0 7 |
3 | 0 0 7 |
4 | 0 0 0 7 |
5 | 0 0 0 0 7 |
+---------------------+
然后可以使用getmata
命令将矩阵作为变量获取:
. getmata (A*) = A
. list A*
+------------------------+
| A1 A2 A3 A4 A5 |
|------------------------|
1. | 7 0 0 0 0 |
2. | 0 7 0 0 0 |
3. | 0 0 7 0 0 |
4. | 0 0 0 7 0 |
5. | 0 0 0 0 7 |
+------------------------+
答案 1 :(得分:0)
你的第一个代码块是合法的(假设内存中的观察结果不超过10个),但不会产生任何接近对角矩阵的东西。 set obs 10
应该在循环之前执行一次,而不是每次循环执行。
你的第二个代码块中的内循环有几个错误,但我不会拼出它们。你疯狂地猜测,而不是编写代码的方式!
您可以直接在Stata中获得对角矩阵,如下所示:
. mat whatever = 7 * I(5)
. mat li whatever
symmetric whatever[5,5]
c1 c2 c3 c4 c5
r1 7
r2 0 7
r3 0 0 7
r4 0 0 0 7
r5 0 0 0 0 7
如果您有理由将其作为变量,请使用svmat
。您可以在循环中创建这样的矩阵作为多个变量的值,但这有点不正常:
clear
set obs 5
forval j = 1/5 {
gen x`j' = 7 * (_n == `j')
}
list
+------------------------+
| x1 x2 x3 x4 x5 |
|------------------------|
1. | 7 0 0 0 0 |
2. | 0 7 0 0 0 |
3. | 0 0 7 0 0 |
4. | 0 0 0 7 0 |
5. | 0 0 0 0 7 |
+------------------------+