【问题标题】:Stata: reshape wide data if data is mi setStata:如果数据是mi set,则重塑宽数据
【发布时间】:2015-10-19 15:58:20
【问题描述】:

我的数据是带有个人标识符和年份标识符的长格式。 它是来自不同数据集的合并和附加数据文件。

编辑: 我的目标是重塑它以对一年的所有观察结果进行回归,并使用前几年的变量。 我不打算使用任何mi 命令。

这是我的重塑代码:

use "${DATA_PATH}HViD_SOEP_rev_dum.dta"

* save all variable-names
quietly describe, varlist
local all_vars = r(varlist) 
display "`all_vars'"
 ** reshape **
foreach var in `all_vars'{
    display "`var'"
    * no reshape for pid, hid, syear and ypnat 
    if `var' == "pid" | `var' == "hid" | `var' == "syear" | `var' == "ypnat*" {
        * do nothing
    }
    else{
        * reshape 
        reshape wide `var', i(pid) j(syear)
    }
}

我得到回报

不;数据是 mi 集 使用 mi reshape 对这些数据执行 reshape。 mi reshape 与 reshape 具有相同的语法。 也许您没有键入 reshape。在这种情况下,您键入的命令调用 reshape,它不适合与 mi 数据一起使用。使用 mi extract 或 mi xeq 选择要运行命令的数据,可能是 m=0

在 stata 手册中写道:

mi unset 是一个很少使用的取消设置数据的命令。更好的替代品包括 mi extract 和 mi 导出(分别参见 [MI] mi extract 和 [MI] mi export)。

我尝试了mi extract = 0,这是推荐的here。 但回报是

语法错误 m=0 在 # 预期的位置找到

我也试过mi reshape widevar', i(pid) j(syear)`。在

中解决了

mi 重塑宽 pgtatzt, i(pid) j(syear) (推算变量 brutto1 brutto2 hinc imo geld betr netw erbey 未注册,因为不在 m=0 中) _mi_miss 未找到

所以,现在我别无选择。我不知道在哪里可以找到 mi_miss 变量,因为它不在原始数据中。

我不想将我的数据导出到 csv 文件,因为这会导致我的标签丢失。

非常感谢任何帮助。

【问题讨论】:

  • 您的数据已设置为进行多重插补,这意味着原始数据存在额外的副本,但已插补了缺失值。您打算对估算的数据进行分析吗?或者,您希望恢复原始数据集吗?
  • 我打算将回归中的插补数据用作右手变量。
  • 这应该交给Statalist。你确实犯了两个语法错误——使用reshape而不是mi reshape和使用mi extract = 0而不是正确的mi extract 0,这会让你没有任何推算数据,这是你链接到的帖子的目标。其余的取决于您的数据详细信息以及在mi reshape 之后查看Stata 日志的完整列表,如果没有进一步调查,则无法回答。
  • 在Statalist中发帖时,1)首先在几个变量上显示mi reshape的结果,而不是尝试批量转换;排除“未注册”名单中的人; 2) 使用mi describe 查看“未注册”消息中的变量是如何表征的。请务必阅读常见问题解答,尤其是常见问题解答 12。
  • 是的。在发现数据已设置好之前,我按原样发布了原始代码。正如我所说,mi extract 0mi reshape 这两个命令都会导致 > _mi_miss not found 。我还阅读了有关 mi-data 的常见问题解答。当我问我的问题时,我仍然认为有某种方法可以重新获得 _mi_miss 或者有一个我只是不明白的特定问题(我以前从未有过 mi 数据的核心)。

标签: stata reshape


【解决方案1】:

这是基于 Stata MI 手册第 18-20 页上的“简单示例”复制发布的解决方案的尝试。为此,我删除了变量 _mi_miss,这是您的 mi reshape 命令失败的原因。 可以看出,应用你的代码的结果不是一个合适大小的数据集,它可以接受mi 命令。请根据此示例发布您的解决方案的工作版本。 编辑 我添加了一个命令,它可能只恢复插补前的原始数据集。这假设变量_mi_m(即复制计数器)仍在数据集中。

use http://www.stata-press.com/data/r14/mheart5, clear
mi set mlong
mi register imputed age bmi
set seed 29390
mi impute mvn age bmi = attack smokes hsgrad female, add(10)

/* Replicate Post Problem */
drop _mi_miss
save  green_yellow, replace
sum attack smokes _mi*
export delimited unset.csv, nolabel quote replace
clear
import delimited unset.csv, clear
cf _all using green_yellow
keep if _mim_m==0   // ADDED
save unset, replace

【讨论】:

  • 你为什么append using unset?在导入 unset.csv 之后,您已经达到了我的目标:一个不再是 mi set 的数据集,但在任何其他方面都与旧数据集相同(当然标签除外)。
  • 我只是想复制您的解决方案,您在其中声明:“最后重要的是重新导入的数据不是活动数据集。然后您给出了声明:append using "${DATA_PATH}HViD_miunset.dta", gen(origin)跨度>
  • 啊。对不起。我将mi set 数据附加到一个完全不同的数据集。不是对自己。正如我的问题中所述>它是来自不同数据集的合并和附加数据文件。 (最初)mi set 数据只是众多数据集之一。它被附加为我最终数据集的最后一步。我会编辑这个。
  • 好的,我明白了。我将删除示例中的最后一个附加项,然后显示应该在没有估算值的情况下恢复原始数据集的命令。
  • 我现在明白了为什么您的解决方案似乎有效:附加的最后一个数据集将继承附加数据中变量的值标签。但是,正如我在另一条评论中所说。 “未设置”数据不纯。它将包括具有缺失值的原始数据 + 具有估算值的复制。假设原始数据是flong 形式,原始数据有 n 个观测值,其中 n_m 个有估算值,并且有 k 个重复。那么“未设置”数据集的大小将是 n + k n_m。
【解决方案2】:

感谢大家的时间,并认为您已经解决了这个问题。 我会回答我的问题,因为我至少找到了一种解决方法。我知道我的问题是一个非常具体的问题。无论如何,恕我直言,@ 987654321@。

最初的想法来自statalist

我将 mi 集数据导出到 .csv 并确保标记的变量不是作为整数而是作为值导出的。 然后我将数据重新导入stata。生成的文件不再是 mi 设置。 通过将此数据附加到我的其余数据中,我重新获得了目标文件,但这次不是我设置的。 在追加时,我确保重新导入的文件不是主文件,而是使用文件。 因此,主文件中的标签将扩展到最终文件。 这是我的导出和重新导入代码:

* load data *
use "${DATA_PATH}HViD_green_yellow.dta"

*** export data to .csv ***  
/* 
NOTE: instead of labels the numeric values are saved! This is important to 
ensure that the reimported dataset will be compatabile with SOEP-data.  
All strings are in double quotes: ""
*/
export delimited using "${DATA_PATH}HViD_miunset.csv", nolabel quote replace

clear  

*** import data ***
import delimited "${DATA_PATH}HViD_miunset.csv"

*** check data for integrity **
cf _all using "${DATA_PATH}HViD_green_yellow.dta"

*** save data ***
save "${DATA_PATH}HViD_miunset.dta"

【讨论】:

  • 这个解决方案是不完整的,因为它不会产生一个合适大小的数据集来接受mi 命令。我提供了一个示例来演示该问题。发布基于此示例的解决方案,其中包含您省略的步骤。
  • 我认为这里的正确解决方案不是接受任何mi 命令的数据集。目标是可以重塑的数据集,无论是mi reshape 还是reshape
  • 您在回复我对您原始帖子的评论时说,您的目标不是恢复原始数据,而是分析估算的数据。您面临的问题是数据集中不存在 _mi 变量之一,因此不可能进行适当的估算分析。当你说你找到了解决方案时,我假设你已经找到了这样做的方法,如果这是真的,那将非常有趣。
  • 如果这不是你的意图,那么我很抱歉。不幸的是,您将无法正确分析估算数据。多重插补的全部意义在于分析将包含由于复制引起的方差。如果您在没有 mi 的情况下分析组合数据(原始 + 复制),则样本量将为 (1 + # 复制) x 原始样本量,这将产生错误的标准误差。如果是我的数据,我会尝试获取正确的插补数据集或自己重做插补,最好是在获得作者插补模型的副本之后。
  • 实际上,假设您在数据集中有一些 mi 信息,最好的办法是检查数据并构造 mi import 语句(不需要存在 _mi_miss)。如果您想这样做,请开始讨论 Statalist。否则,要获得没有插补重复的原始数据,请查找变量 _mi_m 和 keep if _mi_m ==0。然后drop _mi*。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
相关资源
最近更新 更多