罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已退役,不会更新。

美国的超额死亡率分析

今天的特邀博主是乔斯马丁他来自MathWorks的并行计算团队。虽然通常专注于在MATLAB中使并行计算既简单又快速,但偶尔他喜欢使用MATLAB来探索其他问题空间。在这里,他写了关于使用一些CDC提供的MATLAB数据集来分析和可视化美国各地的超额死亡统计数据。

内容

简介

我很好奇美国各州如何应对大流行的数据,以及病毒在整个大陆上的演变情况。我找不到任何能告诉我我想知道的东西的可视化数据,所以我开始尝试亲自检查数据。我是一个数学工作者,所以显然我转向了我最喜欢的分析工具,MATLAB!

在研究SARS-COV-2 (COVID-19)对人群的影响时,我们面临的问题之一是,检测病毒并将其归咎于病毒充满了问题。不同的测试有不同的特异性,假阳性和假阴性;并非所有人都接受了检测,即使那些接受了检测并呈阳性的人也可能有或没有症状,最终可能会或不会死于这种病毒。因此,弄清楚到底发生了什么是很困难的。这是2020年8月12日英格兰公共卫生部的一个例子下调了COVID-19的数量由于死亡可能或不可能受到COVID-19影响的变化,英格兰的死亡人数减少了约12%。

如果采用自底向上的方法将每个事件(住院、死亡等)分类为由于COVID-19或不这将是困难的,我们能做的是查看一个群体的总体统计数据,并询问它们与正常数据(或没有当前观察到的影响的以前的数据)有什么不同。我们知道,今年的数据与往年不同,这可能是由于这些影响造成的。超额死亡率分析就是这种类型。它只是简单地查看某一特定地区报告的死亡总数,并随着时间的推移进行跟踪,以建立一个合理的预期死亡人数模型(通常是在一年中的某一周内)。这种分析的一个例子是EUROMOMO项目(欧洲)收集欧洲一些国家的数据,并提供不同的数据观点,以帮助显示当前事件如何影响不同地方的死亡。

美国的等效数据可以从疾控中心获得,但观看选项要有限得多,我特别想看看不同的州是如何应对大流行的,并比较整个大陆上病毒的演变情况。

获取数据

下面对数据来自疾控中心其中记录了死亡总人数,并可将其与前几年数据中该周的预期死亡人数进行比较。我们可以用MATLABwebread功能,可直接从疾控中心网站(国家和州超额死亡估计),然后开始处理数据。由于底层数据是CSV文件中的表格,所以MATLAB中的结果将是表格

T = webread(“https://data.cdc.gov/api/views/xkkf-xrst/rows.csv”);

以帮助绘制a上的数据geobubble如果有另一个表,其中包含州的名称(以及在上述数据中发现的“纽约市”等其他位置)以及该位置的经纬度,则非常有用

地点= webread(“https://blogs.mathworks.com/images/loren/2020/stateLocation.csv”);

初始数据擦洗

我们只想看“原因”数据(因为在这个CSV文件中有数据的其他分区),我们希望所有的数据都加权为预测值(因为最近的数据通常缺乏报告的死亡人数,因为它需要时间来获得数据到CDC -见技术报告在CDC网站上)。

转换类型状态而且结果分类,因为这简化了下面的代码,其中子选择和连接这些变量。转换ExceedsThreshold以一个逻辑为例,这比较容易处理一组不同的字符串。

t.Type = category (t.Type);t.Outcome = category (t.Outcome);t.State = categorical(t.State);t.超过阈值= strcmp(t。ExceedsThreshold,“真正的”);

也将状态位置变量的一个范畴,因为我们将使用它与状态稍后在主表中。

的位置。状态= categorical(locations.State);

选择我们需要的数据(各种原因而且预测(加权))并除掉将军国家== "美国"哪个是所有州的合并数据

T = T (T。类型= =“预测(加权)”& t.Outcome ==“原因”& t.状态~=“美国”:);

获得一个涵盖所有数据的时间范围,以供以后使用

timeRange = unique(t.WeekEndingDate);

马萨诸塞州发生了什么?

属性子选择数据状态变量(您可以将其更改为您喜欢的任何状态,以查看在该状态下发生了什么)

M = t(t。状态= =“麻省”:);

将在这段时间内观察到的死亡人数,以及表示预期死亡人数的上限阈值加上分布的几个标准差绘制成图。如果死亡人数显著高于上限,则超额死亡率明显高于预期。

情节(timeRange m.ObservedNumber,“b”);持有情节(timeRange m.UpperBoundThreshold,“r”网格)标题“每周记录的死亡人数”ylabel“每周有记录的死亡总数”持有

2020年9月中旬评论很高兴看到,在过去几周内,超额死亡率似乎恢复到上限以下,这表明MA的死亡率已经恢复到接近正常水平,尽管美国和世界各地仍有大流行。

那整个美国呢?

同样的数据如果分布在整个美国会是什么样子?虽然我们之前从表中删除了总数,但我们可以通过按日期分组数据并对所有州进行求和来轻松地再现它们。使用findgroups基于WeekEndingDate定义具有相同结束日期的数据组,以便splitapply在这些组上,可以将每个组中所有状态的所有数字相加,以得到正确的总数。

G = findgroups(t.WeekEndingDate);splitapply(@sum, t.v obvednumber, G),“b”)举行splitapply(@sum, t.UpperBoundThreshold, G),“r”网格)标题“每周记录的死亡人数”ylabel“每周有记录的死亡总数”持有

2020年9月中旬评论注意期间的显著峰值2017年冬季- 2018年流感季节.此外,在整个美国,似乎超额死亡率似乎没有回到上限之下,比每年这个时候的预期每周高出约8000人,并且似乎呈上升趋势。

有多少州超过了他们的上限?

如果我们知道在任何给定的时间,一个状态是否超过了它的阈值,我们可以很容易地绘制出在该时间范围内超过其上限的状态的数量。

plot(timeRange, splitapply(@sum, t. exceeded sthreshold, G));网格

再次注意到2017-2018年流感季节的显著跃升,目前约有30个州仍高于上限。但这只是一个总数,看看哪些州目前超过了他们的界限,并通过跟踪哪些州在给定的时间点超过了界限,来了解美国大陆大流行的演变,这可能很有趣。

哪些州超过了他们的上限?

要查看哪些状态超出了它们的上限(以及超出了多少),我们需要查看一个时间点。我们将以最新数据记录以来的周数来衡量。然后我们可以选择所有的数据,这样我们就只有一个特定的星期来分析。更改下面的值,查看美国各地每周发生的情况

weeksAgo = 1;X = t(t。WeekEndingDate == timeRange(end-weeksAgo),:);

使用位置表与上的数据连接状态这样我们就在地理气泡图上有了这些州的经纬度

%连接表X = outerjoin(X, locations,“类型”“左”“钥匙”, {“状态”});

气泡的大小应由给定状态下的预期死亡人数标准化。因此,计算超额死亡率(观察到的-上限),并除以类似标准偏差(上限减去期望)的东西。这个数字本质上是该状态与预期的标准差数。

X. bubblesize = max((X。obvednumber - X.UpperBoundThreshold)./(X.UpperBoundThreshold- x . averageexpectedcount), 0);

转换ExceedsThreshold到一个类别,这样它就可以标记地球气泡图,并将地块限制大致设置为美国大陆的边缘。

X.ExceedsThreshold = category (X.ExceedsThreshold);X = X(X。ExceedsThreshold = =“真正的”:);geobubble (X,“人肉搜索”“Longtitude”...“技术”“darkwater”...“SizeVariable”“BubbleSize”...“ColorVariable”“ExceedsThreshold”...“MapLayout”“正常”...“SizeLimits”, [0 10]);地质界限([20 51],[-126 -65])

这张图显示了哪些州超过了预期的阈值,气泡的大小(以人口标准化的方式)表明了它们超过了多少。通过更改上面的滑块(即更改您正在查看的周),您可以调查大流行在各州的演变,主要从大流行开始时的东海岸到最近的南部各州的演变。

请下载MLX文件,并自行研究数据及其意义。让我们知道你的发现在这里




发布与MATLAB®R2020b

|