Matrix Stata中整体矩阵的蒙特卡罗模拟

Matrix Stata中整体矩阵的蒙特卡罗模拟,matrix,stata,montecarlo,simulate,Matrix,Stata,Montecarlo,Simulate,我想用置信区间计算我的数据中一组群体(如年龄、性别)的汇总统计数据。为此,我使用蒙特卡罗模拟从泊松分布中为数据中的每一行绘制值,然后折叠行以获得摘要。如果模拟的结果只是一个值(在rclass中使用返回标量),那么整个过程都可以正常工作,但只要我尝试模拟多个结果(在eclass中使用ereturn矩阵),它就无法工作(请参见下面的Stata代码)。我得到错误消息:“表达式:e(A)中的类型不匹配错误”。如果没有更复杂的循环等,我如何模拟整个向量甚至结果矩阵 非常感谢! 弗雷德 程序启动PGW,电子

我想用置信区间计算我的数据中一组群体(如年龄、性别)的汇总统计数据。为此,我使用蒙特卡罗模拟从泊松分布中为数据中的每一行绘制值,然后折叠行以获得摘要。如果模拟的结果只是一个值(在rclass中使用返回标量),那么整个过程都可以正常工作,但只要我尝试模拟多个结果(在eclass中使用ereturn矩阵),它就无法工作(请参见下面的Stata代码)。我得到错误消息:“表达式:e(A)中的类型不匹配错误”。如果没有更复杂的循环等,我如何模拟整个向量甚至结果矩阵

非常感谢! 弗雷德

程序启动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论坛解决问题,我会在这里发布答案。