2019-04-21

# 验前和验后数据的横向合并/纵向追加

[**Source:** Pre and Post Test Data Merge/Append (By Francis at 11/29/2012)](http://www.econometricsbysimulation.com/2012/11/pre-and-post-test-data-mergeappend.html)

假设现在有以下2组数据

- 预测试数据(**Pre-test**)

- 当前数据(**Current Data**)[^1]

[^1]: 是指当前在 Stata 界面的数据,又称主要数据( Master Data )窗口数据或记忆空间数据。

若想要将这两种数据合并在一起,可以有以下两种选择

**(1)创建纵向数据集(使用 `append` 命令)**

**(2)创建横向数据集(使用 `merge` 命令)**

这两种数据合并方法都是很常见的,具体实现步骤如下:

  ## 1. 数据的生成 

  ### 1.1 预测试数据的生成(Pre-test Data)

```stata

clear

set obs 1000 

gen ID = _n                // unique identifier on each person/student

gen score = rnormal()

forv i=11/99 {            // generate say 88 variables (v11 through v99)

gen v`i' = runiform()

label var v`i' "Random uniform variable `i' - pretest"

}

save pretest, replace

```

- 通过 `rnormal`  以及 `runiform` 命令生成包含 **ID** **score** **v11** 等 91 个变量在内的1000个观测值,并保存为预测试数据。

### 1.2 当前数据的生成(Current Data)

```stata

gen treatment = rbinomial(1,.3)      //imagine there is some kind of treatmens

replace score = score+.4*treatment

forv i=11/99 {

local change = rbinomial(1,.1)      //There is a 10% chance that one of your other variables will be changed

if `change'==1 replace v`i' = v`i'+runiform()

label var v`i' "Random uniform variable `i' - current"

}

save current, replace

clear

```

- 通过 `rbinomial` `runiform` 命令在预测试数据基础上对变量进行一定改变,新增 **treatment** 变量后保存为当前数据。现在我们得到拥有不同变量的两个数据集。

******************************************************************

  ## 2. 数据文件的合并 

  ### 2.1 数据的纵向合并 -- `append` 命令

``` stata

use pretest, clear 

gen phase = "Pretest"                      // Generating a variable to indicate pretest

append using current                        // append: Appending the data

sum

bysort ID: egen treat = mean(treatment)    //Make sure the "treatment" variable is duplicated for every observation.

drop treatment                            // Drop the old treatment variable

rename treat treatment

clear

```

部分结果如下:

```                 

-------------+---------------------------------------------------------

        v94 |      2,000    .5158958    .2936431  .0002596  .9973774

        v95 |      2,000    .4983512    .2921214  .0008446  .9998845

        v96 |      2,000    .5235505    .2834689  .0023575  .9992944

        v97 |      2,000    .503752    .2869586  .0008776  .9996563

        v98 |      2,000    .4861402    .2938694  .0000774  .9997599

-------------+---------------------------------------------------------

        v99 |      2,000    .5110351    .2851361  .0003785    .999744

      phase |          0

  treatment |      1,000        .299    .4580489          0          1

```

  **注意事项:**

1. 在绝大部分的纵向合并中,观察值可以是独立的来自于同一调查的不同样本,也可能不是完全独立的来自于不同调查时间的相同样本

2. 合并后,数据的变量基本不变,但观测个案增加了 (例如这里的观测值由原来的 1000 变为 2000 )。

3. 该方法可以将两个或多个数据文件进行上下对接,简单明了不易出错.

  ### 2.2 数据的横向合并 -- `merge` 命令

  代码实现如下:

```stata

use pretest, clear

foreach v of varlist * {

rename `v' `v'_0                          // Rename variables so that they will not be overwritten

}

rename ID_0 ID                            // Make sure only the merging variable keeps the same name.

save pretest_rename, replace

use current, clear                        // Loading the current test data.

foreach v of varlist * {

rename `v' `v'_1                          // Rename the variables in the current as well 

}

rename ID_1 ID                            // Making sure to change ID_1 back to ID

merge 1:1 ID using pretest_rename          //Merge the data together

order *, alphabetic

```

  结果如下:

```

. merge 1:1 ID using pretest_rename         

    Result                          # of obs.

    -----------------------------------------

    not matched                            0

    matched                            1,000  (_merge==3)

    -----------------------------------------

```

**注意事项:**

1. 故横向合并也是变量的合并,新数据的变量增加但观察个案可以不变(例如,这里合并之后观测值依然为 1000 个)。

2. 实现数据文件的横向合并的前提是,主要数据和使用数据必须有一个(或多个)相同的关键变量

3. 横向合并中,除关键变量外,其它变量的名称都不能相同。若两个数据包含其它的同名变量,则使用数据中的变量数值将被主要数据的同名变量数值取代。

你可能感兴趣的:(2019-04-21)