【问题标题】:Summarizing a variable in Stata and extracting standard deviation在Stata中汇总变量并提取标准差
【发布时间】:2014-03-03 21:15:00
【问题描述】:

我正在尝试根据其他变量的数学表达式在我的数据中为每一年创建一个变量(我有年度数据并使用“...”来避免每年编写)。我在 Stata 中使用 summarise 命令提取标准差,但 Stata 无法识别 frac 变量。我曾尝试使用egen,但这会导致未知函数错误。使用gen 会产生一个已经定义的变量。我将感谢任何人帮助使用以下代码或将我指向已讨论此问题的链接。

    foreach yr of numlist 1995...2012 {
            local row = `yr' - 1994
            local numerator = 100*(income - L1.income)
            local denominator = ((abs(income) + abs(L1.income)) / 2)
            local frac = (`numerator' / `denominator') 
            summarize frac
            local sdfrac = r(sd)
            matrix C[`row', 1] = `numerator'
            matrix C[`row', 2] = `denominator'
            matrix C[`row', 3] = `sdfrac'
        }

【问题讨论】:

  • summarize 将应用于某个变量(或根本没有)。您将其应用于具有数值的局部变量。

标签: stata


【解决方案1】:

如果我对你的问题的理解是正确的,也许你直到最后都不需要使用循环,然后你可以将结果发布到 postfile:

这只是一个想法:

tempname memhold
tempfile filename

postfile `memhold' year sdfrac using `filename'

gen row=year-1994
gen numerator=100*(income-L1.income)
gen denominator=((abs(income)+abs(L1.income))/2)
gen frac=numerator/denominator

foreach yr of numlist 1995...2012 {

summarize frac if year=`yr'
local sdfrac=r(sd)
post `memhold' (year) (`sdfrac')

}

postclose `memhold'
clear all 
use `filename'

*View Results
list

此代码应该为您提供一个数据集,其中包含年份名称和 frac 变量的标准差作为变量。

【讨论】:

  • 感谢您的建议。这对我来说看起来很直观,但是当程序进入循环时,它导致了无效的语法错误。我不清楚问题是什么。您是正确的,因为我试图生成一个显示年份(或每年计算的某些行值)和 frac 变量的标准偏差的结果。在我的原始代码中,我还想查看组件(分子和分母),以确保代码生成了我的手写结果。
  • summary 语句中需要 == 而不是 =。
  • @Nick Cox 感谢您指出这一点。它解决了问题并生成了结果:)
  • 很抱歉。如果我有数据,我可以修复错误。是的,应该是 year==`yr'。
  • @Nick Cox @Pcarlitz 对于如何按子组生成结果,特别是每年的种族和性别,您有什么建议吗?我修改了您推荐的代码(如下),但我收到语法错误,但不知道错误出现的位置/原因。 postfile memhold' year sdfrac sex race using myresults levels of sex, local (s) levelsof race, local (r) foreach a of local s { foreach b of local r { forval yr = 1995/2012 { summarize frac if year==yr'& sex ==a' & race==b' post memhold' (yr') (r(sd)') (sex') (`race') } } }
【解决方案2】:

在评论中,OP 添加了一个关于与此类似的代码的问题(但忽略了以更文明的形式发布它的请求)。请注意,Stata 中的反引号或左引号与 cmets 中的 SO 标记代码冲突。大概是一些

tempname memhold 

定义在此之前。

postfile `memhold' year sdfrac sex race using myresults     
levels of sex, local (s)     
levelsof race, local (r)     
foreach a of local s {     
    foreach b of local r {     
        forval yr = 1995/2012 {     
           summarize frac if year == `yr' & sex == `a' & race == `b' 
           post `memhold' (`yr') (`r(sd)') (`sex') (`race') 
        } 
    } 
}

让我们关注问题所在。对于sexraceyear 的所有组合,您希望在单独的文件中获得frac 的标准差。就这么一行

collapse (sd) frac, by(year sex race) 

如果您想在数据旁边查看表格,请考虑

egen group = group(sex race year), label 

然后

tab group, su(frac) 

tabstat frac, by(group) stat(sd)

【讨论】:

    【解决方案3】:

    这段代码由@Pcarlitz 修改,主要是通过简化它。我无法检查你的数据,我没有。

    太长了,无法放入评论。

    我不会使用临时文件,因为您想保存这些结果,看来。

    tempname memhold
    postfile `memhold' year sdfrac using myresults
    
    gen frac = (100*(income - L1.income))/((abs(income) + abs(L1.income))/2)
    
    forval yr = 1995/2012 {
        summarize frac if year==`yr'
        post `memhold' (`yr') (`r(sd)')
    }
    
    postclose `memhold'
    
    use myresults 
    list
    

    更新 与稍后的答案一样,将collapse 视为此处更简单的直接替代方案。

    【讨论】:

    • 再次感谢您的帮助和耐心等待。是的,我确实想保存这些结果,您的代码会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多