楼主: wyy19860530
7231 8

[其他] stata做循环计算,菜鸟急问, [推广有奖]

  • 0关注
  • 0粉丝

硕士生

7%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
892 点
帖子
59
精华
0
在线时间
164 小时
注册时间
2007-4-18
最后登录
2018-12-19

楼主
wyy19860530 在职认证  发表于 2009-7-11 10:52:20 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
本人用stata做SUR model,现在已经得到一个矩阵  i,j=k,l,e,m 分别是资本,劳动,能源和材料,delta(i, j)即是三个factor cost share的回归方程
delta(i, j)=
                 c1         c2                 c3             c4(常数项)
r1   .0002233   -.000292       -.0000451      0.0002883                             cost factor share for k
r2   -.000292   -.000587        -.0002467      0.001473                                cost factor share for l
r3  -.0000451  -.0002467      .0005686        0.0002246                              cost factor share for e
r4  0.0001138  0.0011257   -0.0002768     0.9980141                               cost factor share for m

其中1959年的数据如下
year       cost          k          l          e           m          pk         pl           pe        pm
1959  358.435 .06185 .27303 .04563 .61948 1.30758 1.7343 1.36756 1.30774

s(i)= i*p(i)/ cost   即factor cost share for each k,l,e,m

要求计算1959年的elasticities of substitution theta(i,j)计算公式如下
theta(m,n)=delta(i, j)+s(i)s(j)    (m不等于n)
theta(m.m)=delta(i, i)+s(i)*(s(i)-1)  (m等于n, 主对角线上的)

其实问题很直接,就是用stata做一个循环计算,得到一个4*4的矩阵,但是我是菜鸟,实在对于stata里面的looping束手无策啊,恳请版上大牛们帮帮忙,多谢多谢了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Stata tata elasticities substitution elastic factor share 能源

回帖推荐

voodoo 发表于6楼  查看完整内容

在我电脑上运行了你的程序,发现结果和你的不同,出错是标注成红字的程序段: ...... . // Calculating theta(i,j) . matrix theta = J(4, 4, .) . forv i = 1/4 { 2. forv j = 1/4 { 3. if `i' == `j' { 4. matrix theta[`i',`j'] = (delta[`i',`j']+s[`i',1]*(s[`j',1]-1))/(s[`i',1]*s[`i',1]) 5. } 6. else{ 7. ...

voodoo 发表于4楼  查看完整内容

由数据直接计算s(i)矩阵,省掉3楼程序中mkmat c1959和klem和pklem的步骤: // 输入1959年数据 clear input year cost k l e m pk pl pe pm 1959 358.435 .06185 .27303 .04563 .61948 1.30758 1.7343 1.36756 1.30774 end // 计算s(i) mat s = J(4,1,.) local i = 0 foreach v in k l e m { local i = `i' + 1 mat s[`i',1] =`v'[1]*p`v'[1]/cost[1] } mat list s // 输入回归 ...

voodoo 发表于3楼  查看完整内容

满足你的要求,但请自行检验程序过程和计算结果: // 输入1959年数据 clear input year cost k l e m pk pl pe pm 1959 358.435 .06185 .27303 .04563 .61948 1.30758 1.7343 1.36756 1.30774 end mkmat cost, matrix(c1959) // cost mat list c1959 mkmat k l e m, matrix(klem) // i mat list klem mkmat p*, matrix(pklem) // p ...

voodoo 发表于2楼  查看完整内容

才4*4矩阵,而且1959年数据比较不规则,将数据拷到excel,用excel做得了,应该也比较方便。:-)

本帖被以下文库推荐

沙发
voodoo 发表于 2009-7-11 16:35:37
才4*4矩阵,而且1959年数据比较不规则,将数据拷到excel,用excel做得了,应该也比较方便。:-)
巫毒上传,必属佳品!
坛友下载,三思后行!

藤椅
voodoo 发表于 2009-7-11 19:53:33
满足你的要求,但请自行检验程序过程和计算结果:
// 输入1959年数据
clear
input year       cost          k          l          e           m          pk         pl           pe        pm
        1959  358.435 .06185 .27303 .04563 .61948 1.30758 1.7343 1.36756 1.30774
end

mkmat cost, matrix(c1959)                // cost
mat list c1959
mkmat k l e m, matrix(klem)        // i
mat list klem
mkmat p*, matrix(pklem)                // pi
mat list pklem

// 输入回归系数矩阵delta
clear
input c1 c2 c3 c4
        .0002233   -.000292       -.0000451      0.0002883
        -.000292   -.000587        -.0002467      0.001473
        -.0000451  -.0002467      .0005686        0.0002246
        0.0001138  0.0011257   -0.0002768     0.9980141
end

mkmat c1-c4, matrix(delta)
mat list delta

// 计算s(i)
mat s = J(4,1,.)
forv i = 1/4 {
        mat s[`i',1] = klem[1,`i']*pklem[1,`i']/c1959[1,1]
}
mat list s

// 计算theta(i,j)
mat theta = J(4, 4, .)
forv i = 1/4 {
        forv j = 1/4 {
                if `i' == `j' {
                        mat theta[`i',`j'] = delta[`i',`j']+s[`i',1]*(s[`j',1]-1)
                }
                else{
                        mat theta[`i',`j'] = delta[`i',`j']+s[`i',1]*s[`j',1]
                }
        }
}
mat list theta
巫毒上传,必属佳品!
坛友下载,三思后行!

板凳
voodoo 发表于 2009-7-11 20:03:16
由数据直接计算s(i)矩阵,省掉3楼程序中mkmat c1959和klem和pklem的步骤:
// 输入1959年数据
clear
input year cost k l e m pk pl pe pm
        1959  358.435 .06185 .27303 .04563 .61948 1.30758 1.7343 1.36756 1.30774
end

// 计算s(i)
mat s = J(4,1,.)
local i = 0
foreach v in k l e m {
        local i = `i' + 1
        mat s[`i',1] =`v'[1]*p`v'[1]/cost[1]        
}
mat list s

// 输入回归系数矩阵delta
clear
input c1 c2 c3 c4
        .0002233   -.000292       -.0000451      0.0002883
        -.000292   -.000587        -.0002467      0.001473
        -.0000451  -.0002467      .0005686        0.0002246
        0.0001138  0.0011257   -0.0002768     0.9980141
end

mkmat c1-c4, matrix(delta)
mat list delta

// 计算theta(i,j)
mat theta = J(4, 4, .)
forv i = 1/4 {
        forv j = 1/4 {
                if `i' == `j' {
                        mat theta[`i',`j'] = delta[`i',`j']+s[`i',1]*(s[`j',1]-1)
                }
                else{
                        mat theta[`i',`j'] = delta[`i',`j']+s[`i',1]*s[`j',1]
                }
        }
}
mat list theta
巫毒上传,必属佳品!
坛友下载,三思后行!

报纸
wyy19860530 在职认证  发表于 2009-7-12 00:06:42
非常感谢您的回复
我现在程序时这样(修改了一些数据)
// input the data of 1959
clear
input year cost k l e m pk pl pe pm
        1959  358.435 .06185 .27303 .04563 .61948 1.30758 1.7343 1.36756 1.30774
end

// input s(i)
matrix s = J(4,1,.)
local i = 0
foreach v in k l e m {
        local i = `i' + 1
        mat s[`i',1] =`v'[1]        
}
matrix list s

// inputing the coefficient matrix delta
clear
input c1 c2 c3 c4
        0.0298704   0.0000221    -0.0082035    0.021689
        0.0000221   0.0748772    -0.0032119   -0.0716874
        -0.0082035  -0.0032119    0.029383      -0.0179676
         0.021689       -0.0716874   -0.0179676  0.111344
end

mkmat c1-c4, matrix(delta)
matrix list delta
// Calculating theta(i,j)
matrix theta = J(4, 4, .)
forv i = 1/4 {
        forv j = 1/4 {
                if `i' == `j' {
                        matrix theta[`i',`j'] = (delta[`i',`j']+s[`i',1]*(s[`j',1]-1))/(s[`i',1]*s[`i',1])
                }
                else{
                        matrix theta[`i',`j'] = (delta[`i',`j']+s[`i',1]*s[`j',1])/(s[`i',1]*s[`j',1])
                }
        }
}
matrix list theta

matrix stheta = J(1, 4, .)
forv j = 1/4 {
      matrix stheta[1, `j'] = s[`i',1]*theta[`i',`i']
}
matrix list stheta

但是运行的结果,总是说找不到s这个矩阵,我实在是觉得很奇怪啊,因为在运行结果中可以看到s这个矩阵已经出来了啊。。。您或者其他高人可以帮忙看一下这个运行结果么?非常感谢

do "C:\DOCUME~1\YINYAN~1\LOCALS~1\Temp\STD000000.tmp"

. // input the data of 1959
. clear

. input year cost k l e m pk pl pe pm

          year       cost          k          l          e          m         pk         p
> l         pe         pm
  1.         1959  358.435 .06185 .27303 .04563 .61948 1.30758 1.7343 1.36756 1.30774
  2. end

.
. // input s(i)
. matrix s = J(4,1,.)

. local i = 0

. foreach v in k l e m {
  2.         local i = `i' + 1
  3.         mat s[`i',1] =`v'[1]        
  4. }

. matrix list s

s[4,1]
           c1
r1     .06185
r2  .27303001
r3     .04563
r4  .61948001

.
. // inputing the coefficient matrix delta
. clear

. input c1 c2 c3 c4

            c1         c2         c3         c4
  1.         0.0298704   0.0000221    -0.0082035    0.021689
  2.         0.0000221   0.0748772    -0.0032119   -0.0716874
  3.         -0.0082035  -0.0032119    0.029383      -0.0179676
  4.          0.021689       -0.0716874   -0.0179676  0.111344
  5. end

.
. mkmat c1-c4, matrix(delta)

. matrix list delta

symmetric delta[4,4]
           c1         c2         c3         c4
r1   .0298704
r2   .0000221   .0748772
r3  -.0082035  -.0032119    .029383
r4    .021689  -.0716874  -.0179676    .111344

. // Calculating theta(i,j)
. matrix theta = J(4, 4, .)

. forv i = 1/4 {
  2.         forv j = 1/4 {
  3.                 if `i' == `j' {
  4.                         matrix theta[`i',`j'] = (delta[`i',`j']+s[`i',1]*(s[`j',1]-1)
> )/(s[`i',1]*s[`i',1])
  5.                 }
  6.                 else{
  7.                         matrix theta[`i',`j'] = (delta[`i',`j']+s[`i',1]*s[`j',1])/(s
> [`i',1]*s[`j',1])
  8.                 }
  9.         }
10. }
s not found
r(111);

end of do-file
r(111);

地板
voodoo 发表于 2009-7-12 01:14:53
在我电脑上运行了你的程序,发现结果和你的不同,出错是标注成红字的程序段:

......
. // Calculating theta(i,j)
. matrix theta = J(4, 4, .)
. forv i = 1/4 {
  2.         forv j = 1/4 {
  3.                 if `i' == `j' {
  4.                         matrix theta[`i',`j'] = (delta[`i',`j']+s[`i',1]*(s[`j',1]-1))/(s[`i',1]*s[`i',1])
  5.                 }
  6.                 else{
  7.                         matrix theta[`i',`j'] = (delta[`i',`j']+s[`i',1]*s[`j',1])/(s[`i',1]*s[`j',1])
  8.                 }
  9.         }
10. }
. matrix list theta
symmetric theta[4,4]
            c1          c2          c3          c4
r1  -7.3597563
r2   1.0013087  -1.6581498
r3  -1.9067588   .74218918  -6.8031912
r4   1.5660731   .57615688   .36435841  -.32411399
.
. matrix stheta = J(1, 4, .)

. forv j = 1/4 {
  2.       matrix stheta[1, `j'] = s[`i',1]*theta[`i',`i']
  3. }
s not found
r(111);
end of do-file
r(111);



更改为:
matrix stheta = J(1, 4, .)
forv j = 1/4 {
      matrix stheta[1, `j'] = s[`j',1]*theta[`j',`j']   // 非matrix stheta[1, `j'] = s[`i',1]*theta[`i',`i']
}
matrix list stheta
已有 1 人评分论坛币 学术水平 收起 理由
eblog + 100 + 1 好帖

总评分: 论坛币 + 100  学术水平 + 1   查看全部评分

巫毒上传,必属佳品!
坛友下载,三思后行!

7
voodoo 发表于 2009-7-12 01:28:49
wyy19860530 发表于 2009-7-12 00:06
非常感谢您的回复
我现在程序时这样(修改了一些数据)
// input the data of 1959
clear
input year cost k l e m pk pl pe pm
        1959  358.435 .06185 .27303 .04563 .61948 1.30758 1.7343 1.36756 1.30774
end
......

// inputing the coefficient matrix delta
clear
input c1 c2 c3 c4
        0.0298704   0.0000221    -0.0082035    0.021689
        0.0000221   0.0748772    -0.0032119   -0.0716874
        -0.0082035  -0.0032119    0.029383      -0.0179676
         0.021689       -0.0716874   -0.0179676  0.111344
end

mkmat c1-c4, matrix(delta)
matrix list delta
......
这两部分的数据你不是已经有了吗?应该无需手动input啊?!容易犯错。
// data of 1959
use ..., clear
keep if year == 1959
...

// input coefficient matrix delta
use ..., clear
// 模型估计
matrix delta = e(??)
...

...
巫毒上传,必属佳品!
坛友下载,三思后行!

8
wyy19860530 在职认证  发表于 2009-7-12 01:43:51
非常感谢您的解释,那在您的电脑上没有出现那个s not found  r(111); 报错么?可能是我stata本身的问题?我装的是stata8,具体版本是90-student Stata for Windows
Notes:
      1.  (/m# option or -set memory-) 10.00 MB allocated to data
      2.  (/v# option or -set maxvar-) 5000 maximum variables
请问您的是啥版本的STATA呢? 谢谢

9
wyy19860530 在职认证  发表于 2009-7-12 03:02:29
I have solved the problem, thank you very much for your help!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-31 15:46