全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
4639 8
2013-11-18
两个相同行列数的矩阵 A, B其中对应的元素求(a-b)/(lna-lnb)

不知道在stata能够实现么,是不是需要自己编程,然后调用
多谢了
二维码

扫码加我 拉你入群

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

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

全部回复
2013-11-18 08:42:51
mata
     (a:-b):/(ln(a):-ln(b))
end
二维码

扫码加我 拉你入群

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

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

2013-11-18 09:18:24
bbs0805 发表于 2013-11-18 08:42
mata
     (a:-b):/(ln(a):-ln(b))
end
非常感谢啊

如果我想对A,B里面的元素进行判断呢
比如:

cap program drop LMDI

program define LMDI

version 12

syntax namelist

local i = 1

local j = 1

local r = rowsof()

local c = colsof()



while `i'<=r{

        while `j'<=c{

        `a0'= Mat1[i,j]

        `a1'= Mat2[i,j]

                if `a0'>0 & `a1'>0{

                `L'=(`a1'-`a0')/ln(`a1'/`a0')

                }

                else if `a0'>0 & `a1'=0{

                `L'=(`a1'-`a0')/ln(1E-200/`a0')

                }

                else if `a0'>0 & `a1'<0{

                `L'=(`a1'-`a0')/(ln(-`a1'/1E-200)+ln(1E-200/`a0'))

                }

               

                else if `a0'=0 & `a1'>0{

                `L'=(`a1'-`a0')/ln(`a1'/1E-200)

                }

                else if `a0'=0 & `a1'=0{

                `L'=0

                }

                else if `a0'=0 & `a1'<0{

                `L'=(`a1'-`a0')/(ln(-`a1'/1E-200))

                }


                else if `a0'<0 & `a1'>0{

                `L'=(`a1'-`a0')/(ln(`a1'/1E-200)+ln(-1E-200/`a0'))

                }

                else if `a0'<0 & `a1'=0{

                `L'=(`a1'-`a0')/ln(-1E-200/`a0')

                }

                else if `a0'<0 & `a1'<0{

                `L'=(`a1'-`a0')/ln(`a1'/`a0')

                }

        L[i,j]=`L'


        local j = `j'+1

        }

local i = `i'+1

}

end




这是我自己摸索编的程序,还不知道怎么同时输入两个矩阵,syntax可以么。。。
你的好简洁啊,如果能够再加上这几个条件语句就好了
二维码

扫码加我 拉你入群

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

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

2013-11-18 16:16:34
1、程序都编好了,就直接利用吧!不用再费事了。在你的程序中稍作修改即可:
cap program drop LMDI
program define LMDI
version 12
syntax namelist(min=2 max=2)      //修改
gettoken Mat0 Mat1:namelist         //添加.
.
.


end

2、输入矩阵的方法如下:
mat Mat0=(1,-2,3\2,0,-1\4,5,3)
mat Mat1=(2,0,-3\-2,6,1\0,1,3)
详见matrix的帮助
二维码

扫码加我 拉你入群

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

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

2013-11-18 16:35:10
bbs0805 发表于 2013-11-18 16:16
1、程序都编好了,就直接利用吧!不用再费事了。在你的程序中稍作修改即可:
cap program drop LMDI
prog ...
请问如何调用这个函数啊

我把这个函数存着personal/_Myado里面了
在profile里也引用了这个地址

输入LMDI Mat0 Mat1
显示unrecognized command:  = invalid command name
二维码

扫码加我 拉你入群

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

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

2013-11-18 18:31:07
我仔细看了你的程序,发现程序中错误太多,包括:宏的定义、宏的引用、关系表达式、矩阵运算、矩阵元素提取……
还是一个重要的是:计算式也有错误,计算结果会出现缺失值,例如,当a0=2,a1=-2时,(`a1'-`a0')/(ln(-`a1'/1E-200)+ln(1E-200/`a0'))的计算结果就是缺失值。
现对计算式你自己仔细修改,以你原来的计算式为例,程序语法修改后如下:
cap program drop LMDI
program define LMDI,rclass
version 12
syntax namelist(min=2 max=2)
gettoken Mat0 Mat1:namelist

local i = 1
local r = rowsof(`Mat0')
local c = colsof(`Mat0')
mat L=J(`r',`c',.)

while `i'<=`r' {
        local j = 1
  while `j'<=`c' {
        local a0= el(Mat0,`i',`j')
        local a1= el(Mat1,`i',`j')
                if `a0'>0 & `a1'>0{
     local L=(`a1'-`a0')/ln(`a1'/`a0')
                }
                else if `a0'>0 & `a1'==0{
     local L=(`a1'-`a0')/ln(1E-200/`a0')
                }
                else if `a0'>0 & `a1'<0{
     local L=(`a1'-`a0')/(ln(-`a1'/1E-200)+ln(1E-200/`a0'))
                }
                else if `a0'==0 & `a1'>0{
     local L=(`a1'-`a0')/ln(`a1'/1E-200)
                }
                else if `a0'==0 & `a1'==0{
     local L=0
                }
                else if `a0'==0 & `a1'<0{
     local L=(`a1'-`a0')/(ln(-`a1'/1E-200))
                }
                else if `a0'<0 & `a1'>0{
     local L=(`a1'-`a0')/(ln(`a1'/1E-200)+ln(-1E-200/`a0'))
                }
                else if `a0'<0 & `a1'==0{
     local L=(`a1'-`a0')/ln(-1E-200/`a0')
                }
                else if `a0'<0 & `a1'<0{
     local L=(`a1'-`a0')/ln(`a1'/`a0')
                }
                mat L[`i',`j']=`L'
                local j = `j'+1
        }
      local i = `i'+1
    }
    return matrix L=L
end

mat Mat0=(1,-2,3\4,0,-5\6,7,8)
mat Mat1=(9,10,-11\-12,13,14\15,16,17)
LMDI Mat0 Mat1
mat list r(L)

运行结果如下:

   
r(L)[3,3]
            c1          c2          c3
r1   3.6409569   7.4560192  -10.775174
r2  -14.563828   .02807278    18.45342
r3     9.82221    10.88694   11.939953
  

二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群