温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者:连玉君 (中山大学)
E-Mail: arlionn@163.com
问题背景:
您好!我是一名 stata 的初学者,刚学习就感觉到 stata 强大无比。目前,我遇到了一个数值型变量的问题,特向您请教,非常感谢!
通过 insheet
导入 csv格式
的数据,对于不同的变量,csv 文件中保留有效位数并不完全一致。比如其中一个变量 x,保留了小数点后 3 位,但导入后就默认为浮点型了,进行数次条件删除后,筛选形成新的数据,但新数据与原数据在小数点位数不一致了。
我可以通过 format
或者 recast
将数据的显示格式修改为3 位,但其实际并不是 3 位。这导致我的条件判断语句无法正常执行。比如:我需要判断以上这个 x
变量大于 0.002 的个数,由于导入数据过程中,把 0.002
的值自动变成了0.0020000000949949
(大于 0.002)。我的分类条件语句(x <= 0.002
为一类,而 x > 0.002
为另一类)就会产生错误判断。
想请教老师,怎么才能让这个变量在导入 stata 后与原数据保持一致呢?或者说怎么操作才能将结果正确地分类呢?
回答:
csv
文件或 Excel
文件中看到的数据格式,比如 0.002
并不是这个观察值的真实面目,你看到的可能只是其化妆后的摸样
—— 显示格式。大家在 Excel 中,经常选中一列数据,然后 「右击 → 设定单元格格式」,这其实都是在设定变量的显示格式。其真实数值可能是 0.0020000000949949
!insheet
或 import excel
等命令把 Excel 数据文档导入 Stata 时,导入的是其真实数值(0.0020000000949949
),而不是 0.002。round()
函数进行四舍五入。
Stata 实例:
录入数据
clear
input x1
0.0020000000949949
0.0019000000949949
0.0031000000949949
end
产生一个新变量,取值为 x1 的四舍五入,小数点后取 3 位有效数字
gen x2 = round(x1,0.001) //四舍五入
3 位有效数字
format x1 x2 %4.3f
list x1 x2 //显示效果相同!它们真的一样吗?
16 位有效数字
format x1 x2 %18.16f
list x1 x2 //此时可以看出二者的差别了
启示: 在使用 条件判断语句 时要非常小心!
. gen str12 Yes1 = "==0.002" if x1==0.002
. replace Yes1 = "!=0.002" if x1!=0.002
. gen str12 Yes2 = "==0.002" if x2==0.002
. replace Yes2 = "!=0.002" if x2!=0.002
. order x1 Yes1 x2 Yes2
. list, noobs clean
+-------------------------------------------------------------+
| x1 Yes1 x2 Yes2 |
|-------------------------------------------------------------|
| 0.0020000000949949 !=0.002 0.0020000000000000 ==0.002 |
| 0.0019000000949949 !=0.002 0.0020000000000000 ==0.002 |
| 0.0031000000949949 !=0.002 0.0030000000000000 !=0.002 |
+-------------------------------------------------------------+
附:完整 Do-file
* 录入数据
clear
input x1
0.0020000000949949
0.0019000000949949
0.0031000000949949
end
* 产生一个新变量,取值为 x1 的四舍五入,`小数点后取 3 位有效数字`
gen x2 = round(x1,0.001) //四舍五入
* 测试1:将二者的显示格式设定为小数点后 `3 位有效数字`
format x1 x2 %4.3f
list x1 x2 //显示效果相同!它们真的一样吗?
* 测试2:将二者的显示格式设定为小数点后 `16 位有效数字`
format x1 x2 %18.16f
list x1 x2 //此时可以看出二者的差别了
* 启示: 在使用`条件判断语句`时要非常小心!
gen str12 Yes1 = "==0.002" if x1==0.002
replace Yes1 = "!=0.002" if x1!=0.002
gen str12 Yes2 = "==0.002" if x2==0.002
replace Yes2 = "!=0.002" if x2!=0.002
order x1 Yes1 x2 Yes2
list, noobs clean
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD