【问题标题】:Generate table of means with variables in rows and quantiles of a given variable in columns in Stata在Stata中生成具有行中变量和列中给定变量的分位数的均值表
【发布时间】:2011-10-21 21:28:19
【问题描述】:

...并为差异和 t 统计量添加列。

我学会了如何通过分位数表制作分位数以及如何添加差异列/行here(感谢@lejohn)。

现在,我希望每一行都是一个不同的变量,而不是将每一行作为一个变量的一个分位数,每个单元格将是每个变量的平均值变量。

我可以使用tabstat 轻松计算单元格条目,但我想要行中的变量和列中的分位数(tabstat 产生转置)。我还希望能够区分列(如我的第一个问题)并计算单元格差异的 t 统计量。

我觉得中间步骤是将reshape 转换为具有三列的长数据:id(此处为 acc_d)、变量名和变量值。但我不知道如何做到这一点,我可能会陷入 R 范式。

这是我想要制作的类型表的示例

这是一些我一直在(未成功)修改的代码

* generate data
clear
set obs 2000
generate acc = rnormal()
generate r1 = rnormal()
generate sar1 = rnormal()
generate arbrisk = rnormal()

* generate quantiles for for a and b
xtile acc_d = acc, nquantiles(10)

* form table (at least my attempts)
* w/ tabstat (but transposed and can't manipulate columns)
tabstat acc r1 sar1 arbrisk, stat(mean) by(acc_d) nototal 

* my attempts to reshape fail, but I would want something like to following to use tabulate
* acc_d   variable    value
* 1       acc         0.01
* 1       r1          1.03
* 1       sar1        -0.03
* 1       arbrisk     0.05
* 2       acc         1.01
* 2       r1          2.03
* 2       sar1        0.03
* 2       arbrisk     1.05

谢谢!

【问题讨论】:

    标签: reshape stata


    【解决方案1】:

    在这里,我会有所不同。我首先会收集计算差异和 t 统计量所需的信息

    foreach v of varlist acc r1 sar1 arbrisk {
        summarize `v' if acc_d == 1
        local m_`v'_1 = r(mean)
        local var_`v'_1 = r(Var)
        local n_`v'_1 = r(N)
        summarize `v' if acc_d == 10
        local m_`v'_10 = r(mean)
        local var_`v'_10 = r(Var)
        local n_`v'_10 = r(N)
    }
    

    然后我将继续折叠和转置数据

    collapse (mean) acc r1 sar1 arbrisk, by(acc_d)
    xpose, clear varname 
    drop if _varname == "acc_d"
    order _varname
    forvalues n = 1 / 10 {
        rename v`n' acc_d`n'
    }
    

    在最后一步,我将添加差异和 t 统计量:

    generate diff_d10_d1 = . 
    generate tstat_d10_d1 = .
    foreach v in acc r1 sar1 arbrisk {
        replace diff = `m_`v'_10' - `m_`v'_1' if _varname == "`v'"
        replace tstat = (`m_`v'_10' - `m_`v'_1') / sqrt((`var_`v'_10'/`n_`v'_10') + (`var_`v'_1'/`n_`v'_1')) if _varname == "`v'"
    }
    

    最后打印结果:

    list, abb(12) noobs
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的教育!我来自 R,但仍然没有处理数据结构。昨晚深夜我想出了另一个解决方案,但它使用了两个表(虽然 LaTeX 可以将这些表相邻)。
    • 我明白了。我已经开始学习R了……根据我目前所见,这种问题在R中可以有一个相当简单优雅的解决方案。
    【解决方案2】:

    这是一个创建两个表的更笨重的解决方案。

    * generate data
    clear
    set obs 2000
    generate acc = rnormal()
    generate r1 = rnormal()
    generate sar1 = rnormal()
    generate arbrisk = rnormal()
    
    * generate quantiles
    xtile acc_d = acc, nquantiles(10)
    
    * aggregate
    collapse (mean) acc r1 sar1 arbrisk, by(date_y acc_d) cw
    
    * relabel variables after collapse
    label variable acc "Acc"
    label variable r1 "R1"
    label variable sar1 "SAR1"
    label variable arbrisk "ArbRisk"
    
    * main part of table
    eststo clear
    estpost tabstat acc r1 sar1 arbrisk if tin(1975, 2000) ///
        , stat(mean) by(acc_d) columns(statistics) listwise nototal 
    esttab using tab_1a.tex ///
        , booktabs replace main(mean) nonumbers noobs ///
        label unstack nogaps not nomtitles nostar ///
        eqlabels(, prefix("Acc ")) 
    
    * add difference t-test
    estpost ttest acc r1 sar1 if acc_d == 1 | acc_d == 10, by(acc_d)
    esttab using tab_1a_ttest.tex, booktabs replace nonumbers noobs ///
        label mtitles("Acc 1-Acc10") wide ///
        varlabels(acc Acc r1 R1 sar1 SAR1)  
    

    【讨论】:

    • 为什么不...条条大路通罗马,这是一条相当直的路。我唯一喜欢我的解决方案的是它不依赖于外部用户编写的命令(例如您的示例中的 eststo & co.)。这些命令本质上没有任何问题。当我开始为同事和客户编写程序时,我开始更加关注这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多