Matrix Stata中整体矩阵的蒙特卡罗模拟
我想用置信区间计算我的数据中一组群体(如年龄、性别)的汇总统计数据。为此,我使用蒙特卡罗模拟从泊松分布中为数据中的每一行绘制值,然后折叠行以获得摘要。如果模拟的结果只是一个值(在rclass中使用返回标量),那么整个过程都可以正常工作,但只要我尝试模拟多个结果(在eclass中使用ereturn矩阵),它就无法工作(请参见下面的Stata代码)。我得到错误消息:“表达式:e(A)中的类型不匹配错误”。如果没有更复杂的循环等,我如何模拟整个向量甚至结果矩阵 非常感谢! 弗雷德Matrix Stata中整体矩阵的蒙特卡罗模拟,matrix,stata,montecarlo,simulate,Matrix,Stata,Montecarlo,Simulate,我想用置信区间计算我的数据中一组群体(如年龄、性别)的汇总统计数据。为此,我使用蒙特卡罗模拟从泊松分布中为数据中的每一行绘制值,然后折叠行以获得摘要。如果模拟的结果只是一个值(在rclass中使用返回标量),那么整个过程都可以正常工作,但只要我尝试模拟多个结果(在eclass中使用ereturn矩阵),它就无法工作(请参见下面的Stata代码)。我得到错误消息:“表达式:e(A)中的类型不匹配错误”。如果没有更复杂的循环等,我如何模拟整个向量甚至结果矩阵 非常感谢! 弗雷德 程序启动PGW,电子
程序启动PGW,电子课堂
使用“C:\Users\649007\Desktop\Demetriq_PWG_edu.dta”,替换
发电机id=\u n
排序id
第N代=\u N
按id:gen DL2=楼层(rpoisson(calung))
按id:gen D02=楼层(rpoisson(D0))
按id:gen Dsmoking=楼层(rpoisson(吸烟))
按id:gen ML2=(DL2/numpyr)*1000
按id:gen AL2=(ML2 CPSIIrate)/ML2
按id:如果AL2则替换AL2=0关键部分是您可以使用ereturn post
在e(b)
中返回矩阵,在这种情况下,您可以使用simulate
中的捷径\u b
除此之外,我对代码进行了一些清理:您不需要使用,因为这与常规的generate
相同。在rpoisson()
周围也不需要floor()
函数,因为它已经返回整数了。您没有使用N,因此不需要它,但即使使用N,您也可以将其存储为本地宏(或者如果您更喜欢标量),而不是变量(数据集中的列),因为它是一个数字,因此将其存储在变量中只会浪费内存
program bootPGW, eclass
use "C:\Users\649007\Desktop\Demetriq_PWG_edu.dta", replace
gen DL2=rpoisson(calung)
gen D02=rpoisson(D0)
gen Dsmoking=rpoisson(smoking)
gen ML2=(DL2/numpyr)*1000
gen AL2=(ML2-CPSIIrate)/ML2
replace AL2=0 if AL2<0
gen A02=1-exp(-PWGcoef*(ML2-CPSIIrate))
gen A2=(AL2*DL2+A02*D02)/(DL2+D02)
gen Adeaths=totdeath*A2
collapse (sum) Adeaths=Adeaths totdeath=totdeath Dsmoking=Dsmoking, ///
by(edu_3cat sex country year)
gen AF_PWG=Adeaths/totdeath
gen AF_simple=Dsmoking/totdeath
mkmat AF_PWG, matrix(A)
ereturn post A
end
simulate _b, reps(1000) nodots seed(123): bootPGW
程序启动PGW,电子课堂
使用“C:\Users\649007\Desktop\Demetriq_PWG_edu.dta”,替换
发电机DL2=rpoisson(calung)
发电机组D02=rpoisson(D0)
gen Dsmoking=rpoisson(吸烟)
发电商ML2=(DL2/numpyr)*1000
发电机AL2=(ML2 CPSIIrate)/ML2
如果AL2关键部分是您可以使用ereturn post
在e(b)
中返回矩阵,则替换AL2=0,在这种情况下,您可以使用模拟中的捷径\u b
除此之外,我对代码进行了一些清理:您不需要使用,因为这与常规的generate
相同。在rpoisson()
周围也不需要floor()
函数,因为它已经返回整数了。您没有使用N,因此不需要它,但即使使用N,您也可以将其存储为本地宏(或者如果您更喜欢标量),而不是变量(数据集中的列),因为它是一个数字,因此将其存储在变量中只会浪费内存
program bootPGW, eclass
use "C:\Users\649007\Desktop\Demetriq_PWG_edu.dta", replace
gen DL2=rpoisson(calung)
gen D02=rpoisson(D0)
gen Dsmoking=rpoisson(smoking)
gen ML2=(DL2/numpyr)*1000
gen AL2=(ML2-CPSIIrate)/ML2
replace AL2=0 if AL2<0
gen A02=1-exp(-PWGcoef*(ML2-CPSIIrate))
gen A2=(AL2*DL2+A02*D02)/(DL2+D02)
gen Adeaths=totdeath*A2
collapse (sum) Adeaths=Adeaths totdeath=totdeath Dsmoking=Dsmoking, ///
by(edu_3cat sex country year)
gen AF_PWG=Adeaths/totdeath
gen AF_simple=Dsmoking/totdeath
mkmat AF_PWG, matrix(A)
ereturn post A
end
simulate _b, reps(1000) nodots seed(123): bootPGW
程序启动PGW,电子课堂
使用“C:\Users\649007\Desktop\Demetriq_PWG_edu.dta”,替换
发电机DL2=rpoisson(calung)
发电机组D02=rpoisson(D0)
gen Dsmoking=rpoisson(吸烟)
发电商ML2=(DL2/numpyr)*1000
发电机AL2=(ML2 CPSIIrate)/ML2
如果AL2TANKS Maarten!更换AL2=0!这确实是非常优雅的。但是我得到了以下错误:一致性错误模拟执行bootPGW r(503)时发生的错误代码>我猜mkmat中的矩阵有问题吗?A需要是行向量,所以你可能需要重新构造矩阵A。好吧,它可以工作。我使用matrix B=A'
对矩阵进行了转置,然后使用ereturn post B
返回行向量B。虽然我仍然无法模拟整个矩阵,但模拟向量已经让生活变得容易多了。谢谢!顺便说一句,genaf_simple=Dsmoking/totdeath
也没有必要,因为它似乎没有任何作用。谢谢Maarten!这确实是非常优雅的。但是我得到了以下错误:一致性错误模拟执行bootPGW r(503)时发生的错误代码>我猜mkmat中的矩阵有问题吗?A需要是行向量,所以你可能需要重新构造矩阵A。好吧,它可以工作。我使用matrix B=A'
对矩阵进行了转置,然后使用ereturn post B
返回行向量B。虽然我仍然无法模拟整个矩阵,但模拟向量已经让生活变得容易多了。谢谢!顺便说一句,gen AF_simple=Dsmoking/totdeath
也没有必要,因为它似乎什么都没有做。交叉张贴在:如果我们在Stata论坛解决问题,我会在这里发布答案。交叉张贴在:如果我们在Stata论坛解决问题,我会在这里发布答案。