普林斯顿Stata教程之数据管理


作者:谢作翰 | 连玉君 | (知乎 | 简书 | 码云)


1.1 数据读取
1.1.1 自由格式数据
1.1.2 固定格式数据
1.2 数据文档
1.2.1 数据标签与注释
1.2.2 变量标签和注释
1.2.3 值标签
1.2.4 多语言标签
1.3 创建新变量
1.3.1 生成和替换
1.3.2 运算符,表达式及函数
1.4 变量重编码


1.1 数据读取

在本节中,我们将讨论如何读取原始数据文件。如果您的数据来自其他统计软件包(如SAS或SPSS),请考虑使用诸如Stat/Transfer
www.stattransfer.com)或DBMSCopy(www.dataflux.com)之类的工具。Stata可以使用fdause命令来读取SAS文件help fdause。Stata还可以导入和导出Excel电子表格,输入help import excel以了解更多信息,并且可以从关系数据库读取数据,输入help odbc简介。

1.1.1 自由格式数据

如果数据是自由格式——变量由空格,逗号或制表符分隔,则可以使用infile命令。有关自由格式文件的示例,请参阅http://data.princeton.edu/wws509/datasets上提供的计划生育工作数据(请阅读说明并单击effort.raw)。这实质上是一个包含四列的文本文件,其中一列带有国家名称,另一列带有数字变量,由空格分隔。我们可以使用该命令将数据读入Stata

infile str14 country setting effort change using http://data.princeton.edu/wws509/datasets/effort.raw

infile命令后面跟着变量的名称。由于国家名称是一个字符串而不是数字变量,因此我们在名称前加上str14,它将变量的类型设置为最多14个字符的字符串。所有其他变量都是数字。

using后面跟着文件的名称,该文件可以是计算机,本地网络或互联网上的文件。在这个例子中,我们直接从互联网上读取文件。更多信息help infile1
还可以选择webuse命令读取该数据库:

webuse set http://data.princeton.edu/wws509/datasets
webuse effort

首先将默认网址设置为普林斯顿数据库,然后直接用webuse命令读取相关文件。webuse 在stata小白系列中有更多介绍。
可用list查看所读入数据:

 list in 1/3

     ┌─────────────────────────────────────┐
     │ country   setting   effort   change │
     ├─────────────────────────────────────┤
  1. │ Bolivia        46        0        1 │
  2. │  Brazil        74        0       10 │
  3. │   Chile        89       16       29 │
     └─────────────────────────────────────┘

1.1.2 固定格式数据

调查数据通常采用固定格式,每个案例有一个或多个记录,每个记录中的每个变量都处于固定位置。

读取固定格式数据的最简单方法是使用该infix命令指定每个变量所在的列。正如它发生的那样,努力数据整齐排列在列中,所以我们可以阅读它们如下:

infix str country 4-17 setting 23-24 effort 31-32 change 40-41 using 
     http://data.princeton.edu/wws509/datasets/effort.raw, clear

这表示country要从第4-17列读取名称, setting从第23-24 列读取名称。str指定该country是一个字符串变量,但不必指定宽度,因为宽度从列数限定中可以看出。

如果有大量的变量,应该考虑在一个单独的文件上输入名字和位置,这个文件又被称为字典,然后可以用infix命令中调用字典。下面尝试将以下字典内容输入到名为effort.dct的文件中:

infix dictionary using http://data.princeton.edu/wws509/datasets/effort.raw {
  str country  4-17
      setting 23-24
      effort  31-32
      change  40-41
}

字典只接受*注释,但必须出现在第一行之后。保存此文件后,可以使用以下命令读取数据:

infix using effort.dct, clear

请注意,您现在“使用”字典,它反过来“使用”数据文件。您可以使用表单指定它作为infix命令的选项,而不是在字典中指定数据文件的名称。infix using dictionaryfile, using(datafile).第一个'using'指定字典,第二个'using'是指定数据文件的选项。如果要使用一个字典来读取以相同格式存储的多个数据文件,这一点尤其有用。更多信息,请参阅help infix。如果您的观测值跨越多个记录或线条,infix只要所有观测记录的记录数量相同(不一定全部相同),仍然可以使用它们来读取它们。欲了解更多信息,请参阅help infix。

infile命令也可以用于固定格式的数据和字典。这是一个非常强大的命令,它提供了许多不适用的选项infix; 例如它可以让你在字典中定义变量标签,但是语法有点复杂。看help infile2

1.2 数据文档

在将数据读入Stata之后,准备一些文档很重要。在本节中,我们将看到如何创建数据集,变量和值标签,以及如何为数据或变量创建注释。

1.2.1 数据标签与注释

Stata允许您使用label data命令标记您的数据集,然后标记最多80个字符(Stata SE中为244)。您还可以使用notes命令,然后使用冒号和文本添加最多约64K字符的注释:

label data "Family Planning Effort Data"
. notes:  Source P.W. Mauldin and B. Berelson (1978). 
   Conditions of fertility decline in developing countries, 1965-75. 
   Studies in Family Planning, 9:89-147

数据用户可以键入notes以查看您的注释。仔细记录您的数据总是会带来回报。

1.2.2 变量标签和注释

您可以(也应该)使用label variable 命令来标记变量。命令后跟变量名称和标签(引号包围,最多80k字符)。使用infile命令,您可以将这些标签添加到字典中。否则,你应该准备一个带有所有标签的do文件。以下是如何为我们的数据集中的三个变量定义标签:

label variable setting "Social Setting"
label variable effort  "Family Planning Effort"
label variable change  "Fertility Change"

Stata还允许您使用该命令将注释添加到特定变量notes varname: text。请注意,该命令后面跟着一个变量名,然后是一个冒号:

. notes change: Percent decline in the crude birth rate (CBR) 
  the number of births per thousand population between 1965 and 1975.

键入describe,然后notes检查我们到目前为止的工作。

1.2.3 值标签

您还可以标记分类变量的值。我们的数据集没有任何分类变量,但我们创建一个。我们将复制effort变量,然后将其分为三类,0-4,5-14和15+,它们分别代表弱,中等和强壮三个程度(前两行中使用的generaterecode在下一节介绍,我们还展示了如何用一个命令完成所有这些步骤):

 generate effortg = effort 
 recode effortg 0/4=1 5/14=2 15/max=3
 (effortg: 20 changes made)
 label define effortg 1 "Weak" 2 "Moderate" 3 "Strong", replace
 label values effortg effortg
 label variable effortg "Family Planning Effort (Grouped)"

Stata采用两步法来定义标签。首先定义一个标签集,使用label define命令将整数代码与标签(最多80k)相关联。然后,使用label values命令将该组标签与变量相关联。通常,标签集和变量使用相同的名称,就像我们在示例中所做的那样。

这种方法的一个优点是可以为多个变量使用同一组标签。规范的例子是label define yesno 1 "yes" 0 "no",它可以与数据集中的所有0-1变量相关联,使用每个变量的形式命令label values variablename yesno。定义标签时,如果标签是单个单词,则可以省略引号,但为了清晰起见,我更愿意使用它们。

可以使用add或者modify选项修改标签集,使用label dir(仅列出名称)或label list(列出名称和标签)列出标签集,并使用label save将它们保存到一个do文件。输入help label以了解更多信息。您也可以使用不同语言的标签,如下所述。

1.2.4 多语言标签

一个Stata文件可以用多种语言存储标签,并且您可以从一组到另一组自由移动。我将通过为我们的数据集创建西班牙语标签来说明。遵循Stata建议,我们将使用ISO标准的双字母语言代码,en代表英文,es代表西班牙语。

首先我们使用label language用来重命名当前语言为en,并创建一个新的语言集es

 label language en, rename
(language default renamed en)
 label language es, new
(language es now current language)

西班牙语标签定义不会覆盖相应的英文标签,而是并行存在。值标签命名时需小心些,不能直接将标签集取名effortg.因为effortg仅表示变量和标签之间的关联。你需要定义一个新的标签集; 我们在此取名ffortg_es,结合旧名称和新语言代码,然后将其与变量effortg相关联:

label define effortg_es 1 "Débil" 2 "Moderado" 3 "Fuerte"
label values effortg effortg_es

您可能想要尝试命令describe现在。可以尝试用表格输出:

table effortg

接下来,我们将语言改回英文并再次运行表格:

label language en
table effortg

更多信息,请键入 help label_language.

1.3 创建新变量

Stata创建新变量最重要的命令是generate/replacerecode,他们经常一起使用。

1.3.1 生成和替换

generate命令使用可以结合常量,变量,函数,算术和逻辑运算符的表达式创建新变量.

gen settingsq = setting^2.

如果你打算在回归中使用这个项,而且知道线性和二次项是高度相关的。那么在平方之前将变量中心化可能是个好主意。这里我们运行summarize,并使用quietly来抑制输出,从存储结果中检索均值r(mean):

quietly summarize setting
gen settingcsq = (setting - r(mean))^2

请注意,我为此变量使用了不同的名称。Stata不会让你用generate来覆盖现有的变量。如果你真的想替换旧变量的值使用replace。您也可以使用drop var_names从数据集中删除一个或多个变量。

1.3.2 运算符,表达式及函数

下表显示了您可以在表达式中使用的标准算术,逻辑和关系运算符:

运算符及表达式

Stata有大量的函数,这里有一些常用的数学函数,输入help mathfun可以查看完整列表:

函数

当参数是数据集中的变量时,这些函数会自动应用于所有观察值。

Stata还具有生成随机数的功能(在模拟中很有用),即uniform()。它还有一套广泛的函数来计算概率分布(p值所需的)和它们的反函数(临界值所需的),请参阅help density functions以获取更多信息。
还有一些专门的函数用于处理字符串,请参阅help string functions,处理日期函数,请参阅help date functions

1.4 变量重编码

recode命令作用是将数字变量转化为类别变量。例如,假设一项生育率调查中对年龄在15岁至49岁的女性进行单身年龄分析.您想以5年为一个区间对样本分组。可以使用命令:

gen age5 = int((age-15)/5)+1 if !missing(age)

但这只适用于间隔规则的情况。也可以其实用如下方法:

recode age (15/19=1) (20/24=2) (25/29=3) (30/34=4)
           (35/39=5) (40/44=6) (45/49=7), gen(age5)

括号中的每个表达式都是一个重新编码规则,由值的列表或范围组成,后跟等号和新值。使用斜线指定的范围包括两个边界,因此15/19是15到19,其也可以被指定为15 16 17 18 19或甚至15 16 17/19。您可以使用min参考最小值并max参考最大值,如在min/19和中44/max。当规则的形式为range = value时,括号可以省略,但它们通常有助于使命令更具可读性。

值被分配到它们落在的第一个类别。从未分配给某个类别的值将保持原样。您可以使用else(或*)作为最后一个子句来引用尚未分配的任何值。或者,您可以使用missingnonmissing引用未分配的缺失值和非缺失值; 这些必须是最后两个语句,不能与其他语句相结合。

在我们的例子中,我们还使用了gen()选项生成一个新的变量age5,在这种情况下,新变量默认替换现有变量的值。我强烈建议您在重新编码之前制作原始变量副本。
您也可以在重编码时指定值标签。选项label(label_name)允许您为创建的标签分配一个名称(默认与变量名称相同)。下面是一个示例,显示如何在一步进行重编码和做值标签。(上文中需使用四个命令)。

recode effort (0/4=1 Weak) (5/14=2 Moderate) (15/max=3 Strong)
     , generate(efffortg) label(effortg)

对原始和重新编码的变量进行交叉制表以检查转换是否按预期工作通常是一个好主意。

原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容

  • 作者:谢作翰 | 连玉君 | (知乎 | 简书 | 码云) 2.1 散点图 2.1.1简单的散点图 2.1.2 拟...
    谢作翰阅读 32,719评论 0 12
  • 这部分是对Stata编程的简单介绍。主要讨论宏和循环,并展示如何编写简单程序。编程是一个很大的主题,我在这里仅进行...
    谢作翰阅读 13,922评论 0 13
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,522评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,562评论 0 11
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,726评论 1 1