首页 文章

使用Stata中的虚拟变量和foreach生成变量的方法

提问于
浏览
2

我的数据集包括两个主要变量 XY .

  • 变量 X 表示具有不同品牌的多个计算机项目的不同代码(例如001X01,001X02等) .

  • 变量 Y 表示商店的每个变量代码 X (例如,15 = 15%,001X01)的税费 .

我已经使用虚拟变量为这些计算机项目创建了类别(例如,对于硬盘驱动器, HD 虚拟变量,当变量 X 代表HD时,取值为1,等等) . 我有一个包含40多个变量的列表(其中两个代表 XY ,其余的是我为计算机项创建的不同类别的一组虚拟变量) .

我想在Stata中使用循环显示所有这些类别的平均值,但我不知道如何做到这一点 .

例如代码:

mean Y if HD == 1


Mean estimation                     Number of obs    =       5

--------------------------------------------------------------
             |       Mean   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
   Tax       |        7.1   2.537716      1.154172    15.24583

给出了代表硬盘的类别的平均税 . 如何在Stata中使用循环自动显示每个类别收取的所有平均税?我会手工完成没有问题,但我想重复这个过程多年,所以我想每年使用一个循环来提出这个输出 .

我的目标是创建一个单独的Excel文件,其中包含我创建的每个计算机类别(总共38个)以及每年按类别划分的平均税 .

2 回答

  • 1

    为什么要打扰循环并创建指标变量?如果我理解正确,您的初始数据集允许使用简单的 collapse

    clear all
    set more off
    
    input ///
    code tax str10 categ
    1 0.15 "hd"
    2 0.25 "pend"
    3 0.23 "mouse"
    4 0.29 "pend"
    5 0.16 "pend"
    6 0.50 "hd"
    7 0.54 "monitor"
    8 0.22 "monitor"
    9 0.21 "mouse"
    10 0.76 "mouse"
    end
    
    list
    
    collapse (mean) tax, by(categ)
    
    list
    

    要转到Excel,您可以尝试 export excelput excel .

    有关详细信息,请运行 help collapsehelp export .


    Edit

    因为你坚持,下面是一个使用循环给出相同结果的例子 . 我假设与以前相同的数据 input . 使用此示例数据库和 expand 1000000 进行的一些测试显示速度几乎相同 . 但几乎可以肯定的是,你(包括你未来的你)和你的读者会更喜欢 collapse . 它更清晰,更清晰,更简洁 . 它甚至更漂亮 .

    levelsof categ, local(parts)
    gen mtax = .
    
    quietly {
        foreach part of local parts {
            summarize tax if categ == "`part'", meanonly
            replace mtax = r(mean) if categ == "`part'"
        }
    }
    
    bysort categ: keep if _n == 1
    keep categ mtax
    

    Stata的功能使其与其他语言完全不同 . 一旦你开始掌握它,你会发现在其他地方完成循环的许多事情,可以在Stata中无循环 . 在许多情况下,后一种风格将是首选 .

    使用 help <command> 查看相应的帮助文件,如果您不熟悉保存的结果(例如 r(mean) ),请键入 help return .

  • 2

    Roberto的优秀答案的补充:在 collapse 之后,您将需要一个循环将结果导出为excel .

    levelsof categ, local(levels)
    foreach x of local levels {
    export  excel  `x', replace
    }
    

    我更喜欢将数字代码用于变量,例如类别变量 . 然后我为它们分配值标签 . 这是Roberto代码的一个版本,它执行此操作,为了更接近您的问题,添加“年”变量

    input code tax  categ year
    1 0.15  1 1999
    2 0.25  2 2000
    3 0.23  3 2013
    4 0.29  1 2010
    5 0.16  2 2000
    6 0.50  1 2011
    7 0.54  4 2000
    8 0.22  4 2003
    9 0.21  3 2004
    10 0.76 3 2005
    end
    
    #delim ;
    label define catl
    1 hd
    2 pend
    3 mouse
    4 monitor
    ;
    #delim cr
    label values categ catl
    collapse (mean) tax, by(categ year)
    
    levelsof categ, local(levels)
    foreach x of local levels {
    export  excel  `:label (categ) `x'', replace
    }
    

    #delim ; 命令可以在单独的行上轻松列出每个代码 . export 语句中的"label"函数是一个扩展宏函数,用于在文件名中插入值标签 .

相关问题