同步操作将从 Stata007/StataSX2018 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
StataBlogs---美国新冠病毒数据
作者:刘亮(三峡大学)
Source:
原文:原文作者Chuck Huber,Associate Director of Statistical Outreach
原文标题:Import COVID-19 data from Johns Hopkins University
[toc]
本文介绍Chuck Huber博士编写的Covid19 Stata命令,并将约翰霍普金斯大学公布的全球新型冠状病毒数据为例,依次介绍如何使用Stata命令进行数据获取、清洗、保存以及数据可视化。
该命令能生成一个包含日期、确诊病例、新增病例、死亡人数,以及康复人数的表格。为了能够查看具体国家病毒感染人数,作者添加country(),增加graph选项画出确诊人数图,添加保存选项saving,将数据保存为(covid19_usa)。
其基本命令为:covid19, country(“US”) graph saving(covid19_usa)
输出结果为:
** Confirmed cases of COVID-19 in the United States**
GitHub是一个流行的软件开发和发布平台。约翰霍普金斯大学系统科学与工程中心(School of Engineering Center for Systems Science and Engineering)建立一个包含来自世界各地的定期更新的COVID-19GitHub数据存储库。其原始数据网址为:https://github.com/CSSEGISandData/COVID19/tree/master/csse_covid_19_data/csse_covid_19_daily_reports打开网站后得到如下界面,可以看到部分数据如下图所示:
每天的相关数据存储在独立的.csv文件中。以2020年1月29日的数据为例,查看相关内容。
点击“Raw”按键可以看到原始的数据,原始数据如下所示:
我们能够将这些原始数据(Raw data)使用import delimited命令将其导入到Stata中,首先以2020年1月29日为例。Stata的基本命令为:import delimited https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/01-29-2020.csv
导入数据后先输入describe
命令,结果显示如下:
输入list in 1/5
查看前5个观测值。
我们看到变量provincestate在一些文件中被当成变量ïprovincestate。由于导入的文件很多,我们避免手动逐个查看。我们使用confirm命令去逐个查看每个文件中的ïprovincestate。其相关命令如下:
confirm variable ïprovincestate
display_rc
输出结果为:0
如果变量ïprovincestate存在,command命令会为_rc存一个“0”值,从而我们可以使用rename 和label命令修改变量名和变量标签。相关命令如下:
if _rc == 0{
rename ïprovincestate provincestate
label variable provincestate "Province/State"
}
执行完了if命令块后,使用describe provincestate
命令,可以看到现在的数据中包含的变量为provincestate的相关信息。
为了检查数据是否还存在ïprovincestate变量,再使用comfirm variable ïprovincestate
其结果如下:
可以发现原始数据中的变量已经被我们清理完成了。
宏可以分为局部宏和全局宏。全局宏(global macro)一旦定义将贯穿整个Stata程序,局部宏(local macro)仅存在被定义的程序或do文件中。我们做一个示例定义并引用一个局部宏today,如下所示:
local today = "3-19-2020"
我们可以通过在宏名称使用左右引号进行引用。左引号(在“esc”键下方)和右引号(在“回车”键的左侧)来引用宏。命令如下:
local today = "3-19-2020"
display "`today'"
3-19-2020
我们可以通过整合其他宏来创建宏,例如:
local month = "3"
local day = "19"
local year = "2020"
local today = "`month'-`day'-`year'"
display "`today'"
3-19-2020
我们想导入名为03-19-2020.csv的文件。注意月份包含一个“前置0”。1至9月被指定为:“01”,“02”往后依次类推。10至12月指定为“10”,“11",”12”。我们需要一种方法值赋时给月份添加适的包含前导0的局部宏。String()函数能够满足这一要求。相关代码如下所示:
local month = string(3, "%02.0f")
local day = string(19, "%02.0f")
local year = "2020"
local today = "`month'-`day'-`year'"
display "`today'"
03-19-2020
接下来将前面的内容进行整合,使用宏来导入文件。命令为:
local URL = "https://raw.githubusercontent.com/CSSEGISandData/ > COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/"
local FileName = "`URL'`today'.csv"
import delimited "`FileName'"
(8 vars,284 obs)
作者思路非常清晰,首先介绍简单的月循环,将每个月展示出来,然后介绍嵌套循环,将年和月共同展示。作者调用宏将月进行循环,代码如下:
forvalues month = 1/12{
display "month = `month'"
}
结果如下:
继续将月和日共同循环,相关代码如下:
forvalues month = 1/12{
forvalues day = 1/31{
display "month = `month', day = `day'"
}
}
结果展示如下:
有了前文的介绍,继续运用暂元和循环的相关知识,展现2020年所有的日期。相关代码如下:
forvalues month = 1/12{
forvalues day = 1/31{
local month = string(`month', "%02.0f")
local day = string(`day', "%02.0f")
local year = "2020"
local today = "`month'-`day'-`year'"
display "`today'"
}
}
结果展示:
接下来作者使用关于循环和宏的命令将网站的所有数据均导入到Stata中,但在执行命令的过程中需要注意2点:1疫情的数据从1月23号开始公布,在此之前并没有数据,如果不加以提示,会出现报错,程序停止运行。2原始数据中有的文件的变量名ïprovincestate,有的是provincestate,全部统一修改为provincestate。为了避免程序出现错误,使用capture命令,即使程序出现错误也可以继续执行。
本部分命令如下:
local URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/"
forvalues month = 1/12 {
forvalues day = 1/31 {
local month = string(`month', "%02.0f")
local day = string(`day', "%02.0f")
local year = "2020"
local today = "`month'-`day'-`year'"
local FileName = "`URL'`today'.csv"
clear
capture import delimited "`FileName'"
capture save "`today'"
}
}
输入ls
命令 可以查看Stata中下载到的数据。
打开01-22-2020.dta文件,并且输入describe
查看数据。相关结果如下:
我们看到其中的文件包括 ïprovincestate变量名,需要将其全部统一为provincestate
代码如下:
local URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/"
forvalues month = 1/12 {
forvalues day = 1/31 {
local month = string(`month', "%02.0f")
local day = string(`day', "%02.0f")
local year = "2020"
local today = "`month'-`day'-`year'"
local FileName = "`URL'`today'.csv"
clear
capture import delimited "`FileName'"
capture confirm variable ïprovincestate
if _rc == 0 {
rename ïprovincestate provincestate
label variable provincestate "Province/State"
}
capture save "`today'", replace //需要添加replace,替换掉之间存在内存中的数据
}
}
现在打开01-22-2020.dta数据,并且describe
结果如下:
继续使用循环命令将所有的数据依次添加并保存,代码如下:
clear
forvalues month = 1/12 {
forvalues day = 1/31 {
local month = string(`month', "%02.0f")
local day = string(`day', "%02.0f")
local year = "2020"
local today = "`month'-`day'-`year'"
capture append using "`today'"
}
}
最后使用describe
描述最后生成的数据。
随着疫情的不断发展,相关的数据不断更新,因此本文的相关数据和变量会产生不一致。例如provoncestate,province_state,countryregion,country_region等。当我们追加数据时必须要保证变量名称一致,接下来继续使用capture。其完整代码如下:
local URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/"
forvalues month = 1/12 {
forvalues day = 1/31 {
local month = string(`month', "%02.0f")
local day = string(`day', "%02.0f")
local year = "2020"
local today = "`month'-`day'-`year'"
local FileName = "`URL'`today'.csv"
clear
capture import delimited "`FileName'"
capture confirm variable ïprovincestate
if _rc == 0 {
rename ïprovincestate provincestate
label variable provincestate "Province/State"
}
capture rename province_state provincestate
capture rename country_region countryregion
capture rename last_update lastupdate
capture rename lat latitude
capture rename long longitude
capture save "`today'", replace
}
}
clear
forvalues month = 1/12 {
forvalues day = 1/31 {
local month = string(`month', "%02.0f")
local day = string(`day', "%02.0f")
local year = "2020"
local today = "`month'-`day'-`year'"
capture append using "`today'"
}
}
describe
数据可以看到数据结果为:
更新数据已经处理完毕,所有变量均统一,最后保存,为以后所用。
save covid19_raw
我国著名数学家华罗庚老先生曾说<数缺形时少直观,形少数时难入微。本部分将前文所收集到的数据进行可视化,让疫情发展态势更加直观地呈现在我们面前。该疫情首先集中爆发于湖北,首先画一下疫情发生以来湖北省的确诊人数变化趋势图。相关代码如下:
line confirmed update if provincestate == "Hubei",title("湖北省疫情确诊人数") ///
xtitle("数据公布时间") ytitle("确诊人数") xlabel(10(10)70) ylabel()
(这个时间不知道怎么显示不出来,网上查需要转成%td,这个暂时做不出来)
接下来分析一下全国的疫情情况,相关的代码如下:
graph bar confirmed
ylabel(2000(500)90000,tposition(inside) labsize(*0.8) angle(0))
ytitle("%",tstyle(smbody)) //y轴标题为小号字体
blabel(bar,size(vsmall) format(%3.1f)) //产生数字标签,字体小号,固定格式保留一位
(这个数据结构太复杂了,不知道怎么显示全国所有地区每天的图)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。