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

Stata 通过多个组比较总平均值,创建具有多个变量的平均值比较表,stata,Stata,我正在寻找一种从tabstat命令的输出创建均值比较(t-test)表的方法。基本上,我想知道各组的平均值是否在统计学上与总体变量的平均值存在显著差异 我在15个组中有75个变量,总共1125个t检验,所以一次只做一个是不可能的 我总是可以为测试编写一个循环,但我想知道是否有一个类似于tabstat的命令可以为我生成表。到目前为止,谷歌没有任何帮助,尽管它似乎是一个从tabstat输出中走出来的相当合乎逻辑的地方 谢谢 可能有更好的软件包为您服务,但这里有一个我刚刚整理的示例。假设您使用的是单样

我正在寻找一种从tabstat命令的输出创建均值比较(t-test)表的方法。基本上,我想知道各组的平均值是否在统计学上与总体变量的平均值存在显著差异

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

我总是可以为测试编写一个循环,但我想知道是否有一个类似于tabstat的命令可以为我生成表。到目前为止,谷歌没有任何帮助,尽管它似乎是一个从tabstat输出中走出来的相当合乎逻辑的地方


谢谢

可能有更好的软件包为您服务,但这里有一个我刚刚整理的示例。假设您使用的是单样本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
修复为更普遍适用的形式。还有其他的小编辑。

编辑了一点代码-不能在评论中发布降价,所以我做了一个新的答案。该版本进行两样本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)

也许你可以举一个例子,说明你计划如何结合
tabstat
和t-test。我不确定t检验是否能帮助你比较群体平均数和总体平均数。假设有足够的样本量,我宁愿用14个虚拟变量进行回归分析
estout
然后可以在一个表中拟合4或5个因变量。@Aspen,目标是分析k均值聚类的结果。我有75个变量,用于将数据分组到15个集群中。现在我想看看每一组中的驱动因素是什么(即,每一组中的哪些变量使该组从其他组中脱颖而出)。回归是无济于事的,因为我唯一的自变量是一个无序的分类变量,我想把它分成相似的组,而不是试图预测。我明白了。为了澄清一下:我觉得你在寻找一个样本t检验,例如,首先是su v1,然后是ttest v1=`r(mean)”,如果group==1。是吗?是的,就是这样。我需要一种方法来完成1125次(例如,一个foreach循环),并获取每个测试的t-stat和p-value,然后将它们全部放在一个表中。后一步是我不确定的部分。实际上,我可以在Excel中使用TDIST()公式来完成这项工作,就是这样。不过,如果能在斯塔塔完成这一切就太好了。那太棒了!非常感谢!我不得不进去,将
forval f=0/1
更改为
forval f=1/15
,以适应我的组变量,但除了删除第一行并插入变量名之外,效果非常好!伟大的谢谢你指出这个问题。我更新了这一行,使它更普遍适用。有用的代码。请注意,如果您只需要部分或全部平均值、最小值和最大值,则应指定
summary
meanonly
选项。见@NickCox谢谢你的提示!你知道哪一个更有效吗:
tab x
summary x,意思仅仅是
?这里的问题不是效率,因为它们做不同的事情。很好。只有一件事:我认为
quiet
对于
summary var来说是多余的,也就是说
。正如Nick的文章(以及帮助文件)所建议的那样,
meanonly
自动抑制终端输出。