与总平均值相比,通过多个组创建具有多个变量的均值表

时间:2014-07-23 15:59:52

标签: stata

我正在寻找一种从tabstat命令的输出创建一个比较均值(t-test)表的方法。基本上,我想知道每组的平均值是否与整体变量的平均值在统计上显着不同。

我在15个组中有75个变量,总共进行了1125次t检验,所以一次做一个这是不可能的。

我总是可以为测试编写一个循环,但我想知道是否有一个类似于tabstat的命令可以为我创建表。到目前为止,Google一直没有帮助,尽管从tabstat输出看起来似乎是一个相当合理的地方。

谢谢!

2 个答案:

答案 0 :(得分:2)

可能有更好的服务包,但这是我刚刚放在一起的一个例子。假设您正在使用单样本t检验,因为我无法通过t检验看到另一种方法。这段代码返回一个包含三个内容的矩阵:与平均值,t值和p值的差异。

您可以根据需要随意调整代码。实际上,只需要几个步骤就可以将其变成一个ado文件。

sysuse auto,clear
loca varlist mpg weight length price                // put varlist here
loca grpvar foreign                                 // put grouping variable here
loca n_var=wordcount("`varlist'")
qui tab `grpvar'
loca n_grp=`r(r)'

mat T=J(`n_var'*3,`n_grp',.)                        // (# of vars*3, # of groups,.)

**colnames
    loca cnames=""
    su `grpvar', meanonly
    forval i=`r(min)'/`r(max)'  {                   // assuming consecutive sequence
        loca cnames="`cnames'"+" "+"`i'"
    }
    mat colnames T=`cnames'                         // values of grouping variable

**rownames
    loca rnames=""
    forval  i=1/`n_var' {
        loca var=word("`varlist'",`i')
        loca rnames="`rnames'"+" "+"`var':diff `var':t `var':p"
    }
    mat rownames T=`rnames'                         // difference, t value, p value

    loca i=1
    foreach var in `varlist'    {
        loca j=1
        su `grpvar', meanonly
        forval f=`r(min)'/`r(max)'  {
            su `var', meanonly
            loca ydbhat=`r(mean)'           // y double hat
            su `var' if `grpvar'==`f', meanonly
            loca diff=`ydbhat'-`r(mean)'    // difference

            qui ttest `var'=`ydbhat' if `grpvar'==`f'   // one-sample ttest
            mat T[`i',`j']=`diff'
            mat T[`i'+1,`j']=`r(t)'
            mat T[`i'+2,`j']=`r(p)'
            loca ++j
        }
        loca i=`i'+3
    }

mat list T, f(%8.3f)

现在我不确定15列是否太宽。如果是这样,请更改显示格式,甚至只需使用putexcel将矩阵导出到电子表格中。

已修改:将循环中的forval i=0/1修复为更常用的形式。还有其他小编辑。

答案 1 :(得分:0)

稍微编辑了代码 - 不能在评论中发布降价,所以我把它作为一个新的答案。该版本进行双样本t检验,并显示每个变量的聚类均值。

local varlist var1 var2 var3                   // put varlist here
local grpvar _clus_1                           // put grouping variable here
local n_var=wordcount("`varlist'")
qui summ `grpvar', meanonly
local n_grp=`r(max)'

mat T=J(`n_var'*4,`n_grp',.)                   // (# of vars*4,# of groups,.)

**colnames
    local cnames=""
    qui summ `grpvar', meanonly
    forval i=`r(min)'/`r(max)'  {              // assuming consecutive sequence
        local cnames="`cnames'"+" "+"`i'"
    }
    //di "`cnames'"
    mat colnames T=`cnames'                    // values of grouping variable

**rownames
    local rnames=""
    forval  i=1/`n_var' {
        local var=word("`varlist'",`i')
        local rnames="`rnames'"+" "+"`var':mean `var':diff `var':t-stat `var':p-value"
    }
    mat rownames T=`rnames'                    // mean, difference, t value, p value

    local i=1
    foreach var in `varlist'    {
        local j=1
        qui summ `grpvar'
        forval f=`r(min)'/`r(max)'   {
            qui summ `var'
            local varmean=`r(mean)'
            local varn = `r(N)'
            local varsd = `r(sd)'
            qui summ `var' if `grpvar'==`f'
            local clusmean = `r(mean)'
            local clusn = `r(N)'
            local clussd = `r(sd)'
            local diff=`clusmean'-`varmean'    // difference

    **two-sample t-test
            qui ttesti `varn' `varmean' `varsd' `clusn' `clusmean' `clussd' 

            mat T[`i',`j']=`clusmean'
            mat T[`i'+1,`j']=`diff'
            mat T[`i'+2,`j']=`r(t)'
            mat T[`i'+3,`j']=`r(p)'
            local ++j
        }
        local i=`i'+4
    }

mat list T, f(%8.3f)