罗兰关于MATLAB的艺术

将想法转化为MATLAB

追踪接触者是否有助于结束COVID-19封锁?

自从该流行病在3月份成为一个全球性问题以来,我们感到欣慰MATLAB用户如何积极为新冠肺炎相关的研发做出贡献.今天的客座博主,古原竹内,希望关注全球抗击新冠病毒-19的一个有趣领域。

内容

接触追踪

当局正在探索逐步解除封锁的策略,接触追踪正在成为一个可能的全面解决方案的一部分。接触者追踪已有150多年的历史,但随着时间的推移,随着对不同类型疫情的反应和技术的可用性,它也在不断发展。我们是否也能做出基于技术的贡献?让我们来看看。

约翰斯诺

约翰·斯诺博士他可能是第一个开发出一种追踪接触者方式的人。在1854年,伦敦爆发霍乱他利用数据与主流的“瘴气”(或“坏空气”)理论作斗争,以确定疾病的真正原因,并帮助结束疫情。我们可以把他看作是数据科学和流行病学的早期先驱。

以下是斯诺博士亲自用笔和纸收集的数据(来源:罗宾的博客),可视化地球散射

泵=霍乱毒素ML2TBL(“pumps.kml”);霍乱= choleraKML2Tbl (“霍乱死亡人数,kml”); 图:地球散射(霍乱、Lat、霍乱、Lon、霍乱、死亡人数*10,“填充”)举行地向散射(泵、横向、纵向、,“填充”) geoscatter(意味着(cholera.Lat),意味着(cholera.Lon),“洋红”“填充”)地球散射(平均值(霍乱Lat),平均值(霍乱Lon),40000,“洋红”)文本(泵。Lat(1),泵。Lon(1),《宽街水泵》)头衔(约翰·斯诺的霍乱地图,1854年伦敦)传奇(“死亡”“泵”“死亡中心”“位置”“东南”

统计霍乱死亡人数并将其绘制到地图上。蓝点的大小表示该地点的死亡人数。死亡发生在某些路线上,而不是像你预计的那样,如果是瘴气造成的,就会覆盖整个地区。斯诺博士在地图中央发现了布罗德街的水泵,这让他怀疑水源可能是疾病的源头。最终,他说服了当地的健康委员会把水泵的把手取下来,这样人们就不能从水泵里喝水了,这就是他帮助结束疫情的原因。观看这个有趣的YouTube视频宽街水泵为更多的细节。

注意:用圆圈来模拟疾病的传播更适合瘴气理论。也许这应该被建模为一个网络问题,但我保持了简单。

新冠病毒-19与接触追踪

由于位置数据是联系人追踪的关键组成部分,一些国家,特别是在东亚使用移动应用程序抗击COVID-19.这段YouTube视频讲述了如何做到这一点得益于MERS疫情的教训,韩国通过积极的检测和接触者追踪缓解了限制.虽然由于对隐私的担忧或过早放宽限制,对使用技术进行接触追踪有一些批评,但我们最终必须找到出路,我们应该探索所有的选择。

在美国,德克萨斯大学奥斯汀分校的研究人员利用移动数据来了解社交距离的效果如何通过跟踪人们对杂货店和药店等零售场所的访问情况,并将其与死亡率联系起来。苹果公司和谷歌公司也在开发具有更好隐私保护的蓝牙技术。他们使用蓝牙LE(通常在10米范围内工作)在相互接触的设备之间交换加密的标识符。这些密钥保留14天。如果此类设备的所有者受到感染,则会通知其他设备的所有者。这很有趣,但我们有办法下注吗你觉得这是如何处理一些数据的?

戈瓦拉数据集

由于隐私问题,移动数据集并没有被广泛使用,但我发现Gowalla签入数据集它包含一个现已停用的移动应用程序服务的匿名用户活动。该服务允许用户登记到某个位置。这在本质上更接近于德克萨斯大学奥斯汀分校(University of Texas at Austin)研究人员使用的零售数据集,而不是Apple/谷歌方法,但我们仍可能从中学到一些东西。

由于这只是一个示例,我们将仅使用2010年9月纽约市的数据子集。为了这个例子,让我们假设数据代表人们在解除锁定后所做的事情,选取用户578作为指标病例,诊断日期为2010年9月24日。

nyc=加载NYCGOWALLADATA(“Gowalla_totalCheckins.txt”); 联系人=578;%索引盒诊断日期=日期时间(“2010-09-24”“时区”“美国/ New_York”);incubationPeriod =天(14);contactDuration =分钟(15);%根据登记时间maxDegreesOfSeparation=2;%包括次级接触

我只是随意选择了其他参数,但它们应该根据医疗当局制定的一些完善的协议来确定。

移动= cell(maxDegreesOfSeparation + 1,1);ii=1:maxDegreesOfSeparation+1移动{ii}=getMovements(纽约市,联系人,诊断,孵化期,ii-1);联系人=findContacts(纽约市,移动{ii},联系人持续时间);结束moves=vertcat(moves{:});moves=sortrows(moves,“类型”“下降”); moves.Type=renamecats(moves.Type,“0度”“索引案例”);

现在,让我们使用geodensityplot,突出人们需要避免的领域。

数字彩色地图geodensityplot(moves.Lat、moves.Lon、,“FaceColor”“插值函数”“半径”, 500)alphamap(正常化((1:64)。^ 0.2,“范围”))头衔([“纽约市Gowalla签到数据集”“用户578+直接+辅助联系人”])

这个数据集是相当有限的,但它仍然给了我们足够的认识一些实际的技术挑战。

  • 考虑到曼哈顿的人口密度,联系人的数量不是很大,因为Gowalla没有被广泛使用。为了有效地追踪联系人,该应用程序必须被广泛采用。为了确保它提供足够的保护,最低采用率是多少?
  • 我们应该用多少天来追踪联系人?我用了14天,因为这是潜伏期的标准。这也是苹果和谷歌计划使用的。
  • 通常,只有直接接触首例(一级隔离)的人会被追踪,但我们也可以定位他们的接触者。当警报发出时,应该包括谁?
  • 人们在14天内四处走动并访问许多地方(这张地图只显示了他们登记的地方)。这是因为他们是Gowalla用户吗?我们是否应该在放宽限制的同时限制人们走动的次数?
  • 我们如何定义“联系”?我使用了近距离值机时间来保持简单。蓝牙LE通常在10米范围内工作。CDC的指导方针是6英尺或2米。10米是否太多?苹果似乎也计划使用RSSI水平来估计距离。

测量距离很难

谈到使用RSSI测量距离,MathWorks英国团队取得了成功建立并演示了基于rfid的人员跟踪系统在几年前的一次MATLAB博览会上,这里的平面图显示了检测附近RFID标签并将数据传输到中央服务器的基站(蓝点)、餐饮区周围的固定RFID标签(绿点)和各个演示区的固定RFID标签(橙点)的位置。与会者还带着移动RFID标签四处走动。

当分析从事件中收集到的数据时,我们遇到了一个问题——“我们原本以为我们可以使用信号强度来估计距离。但是,实际上,信号强度的波动太大了,你无法以这种方式做出自信的估计”。我们最终找到了一个解决这个问题的方法,正如链接文章中所描述的,但这非常困难。

我们测量了8个基站x 25个固定RFID标签的距离,以及在活动期间从这些组合中收集的RSSI数据。这是RSSI与距离的关系。红线代表我们希望看到的一条假想的向下倾斜的线。如你所见,在任何给定的距离上,RSSI波动如此之大,以至于没有办法得出RSSI和距离之间的明确相关性。我不能分享数据,但你可以读到它是如何被使用的本帖

%距离范围为0-35米disX = 0:35;%线性模型与噪声只是为了简单RSSI = -1.6 * disX + 90 + randn(1,长度(disX));根据实际数据绘制线性模型plotExpoData(disX、RSSI);

GPS呢?

也许用GPS来确定距离更容易些?我用MATLAB手机在我家附近的公园里。我不想分享我的数据,而是鼓励你使用您自己的GPS数据从MATLAB移动,因为它是非常容易的

为了获得距离,我们需要知道我们正在测量哪些点——没有必要获得从未真正接触过的人之间的距离,因为他们在不同的时间处于同一点。这对我们来说相当容易时间表数组并使用函数同步

负载jpond.matsynched=同步(jpond.A(:,1:2),jpond.B(:,1:2),“联盟”“线性”);

然后你可以用距离2公里函数从映射的工具箱.获得距离。

度=距离(同步的纬度1,同步的经度1,...同步。纬度2,同步。经度2);gpsDist=deg2km(度)*1000;%将公里转换为米[minDist, minIdx] = min (gpsDist);

在下面的图中,你可以看到两个用户以相反的方向绕着池塘走,当他们接触时,以及他们之间的距离。他们有两点很接近,但后者是最接近的。这比RSSI简单多了,但这正是我们对使用GPS数据有隐私顾虑的原因。

t=平铺布局(“流动”); nexttile([2 1])地理地块(同步。纬度1,同步。经度1,".-")举行geoplot (synched.latitude_2 synched.longitude_2,".-")地理地块(同步纬度1(minIdx),同步经度1(minIdx),“嗯”)文本(同步.纬度1(minIdx),同步.经度1(minIdx),“最低限度”...“水平对齐”“对”)头衔(“路线”)传奇(“A”“B”“位置”“最佳”) nexttile plot(synchronized . timestamp, synchronized .latitude_1)保持情节(synched.Timestamp synched.latitude_2)情节(synched.Timestamp (minIdx) synched.latitude_2 (minIdx),“莫”)文本(同步的时间戳(minIdx),同步的纬度2(minIdx),“最低限度”...“水平对齐”“对”)头衔(“纬度x时间”) nexttile plot(synchronized . timestamp,gpsDist)保持情节(synched.Timestamp (minIdx) gpsDist (minIdx),“莫”)文本(synched.Timestamp (minIdx) gpsDist (minIdx) + 80,“最低限度”...“水平对齐”“对”)头衔(A和B之间的距离) ylabel (“米”)标题(t[组成(基于GPS的距离跟踪,最小距离%.2f米...minDist);组成(“最小距离%s的时间”,datestr(synched.Timestamp(minIdx)))]

行动呼吁

通过这个简短的调查,我希望我强调了接触者追踪与数据科学的关系,以及MATLAB用户可以在哪些方面做出贡献。你有没有看到其他我没有提到的机会?也许你已经在解决其中的一些问题了?分享你的想法在这里

本地函数

函数tbl = choleraKML2Tbl(filename) fileID = fopen(filename);C = textscan(文件标识,“% s”);fclose(fileID);str=join(string(C{1}'));coords=extractBetween(str," < / >坐标”);坐标=拆分(坐标,","); coords=str2double(coords);tbl=表格;如果匹配(文件名,“pumps.kml”)类型=“泵”埃尔塞夫匹配(文件名,“霍乱死亡人数,kml”)类型=“死亡”结束tbl.Type=repmat(string(Type),size(coords,1),1);tbl.Lat=coords(:,2);tbl.Lon=coords(:,1);value=extractBetween(str,“< >价值”" < /值> ");如果~isempty(values) values = str2double(values);资源描述。死亡=值;其他的资源描述。死亡= 0(高度(台),1);结束结束
函数data=loadNYCgowallaData(gowallaDataFile)如果存在(“nyc.mat”“文件”)加载nyc.mat纽约市数据=纽约;其他的选择= detectImportOptions (gowallaDataFile,...“文件类型”“delimitedtext”“文本类型”“字符串”);opts.VariableNames={“用户”“检查时间”“纬度”“朗”“LocationId”};gowalla = readtable (gowallaDataFile、选择);nycLim = (40.697, -74.079, 40.819, -73.880);纽约= gowalla (gowalla。Lat >= nycLim(1,1) &...gowalla。Lat <= nycLim(2,1) & gowalla。Lon >= nycLim(1,2) &...gowalla。朗< = nycLim (2,2):);纽约。CheckinTime = datetime(纽约。CheckinTime,...“InputFormat”“uuuu-MM-dd 'HH: mm: ssZ”“时区”“UTC”);nyc.CheckinTime.TimeZone =“美国/ New_York”;数据=纽约市;结束结束
函数getmoves (tbl,users,endDate,lookBackPeriod,degree) moves = cell(length(users),1); / /用户startDate = endDate - lookBackPeriod;ii=1:length(users)moves{ii}=tbl(tbl.User==users(ii)&...资源描述。CheckinTime >= startDate &...资源描述。CheckinTime < = endDate:);结束移动= vertcat({}):移动;动作。类型= repmat (“学位”+度,高度(移动),1);moves.Type=分类(moves.Type);结束
函数触点=查找触点(tbl、移动、持续时间)点=移动(:{“LocationId”“检查时间”});位置= sortrows(位置,“检查时间”);用户=唯一(movements.User);联系人=单元格(高度(斑点),1);ii=1:height(spots)startTime=spots.CheckinTime(ii)-持续时间;endTime=spots.CheckinTime(ii)+持续时间;contacts{ii}=tbl(tbl.LocationId==spots.LocationId(ii)&...tbl.CheckinTime>startTime&...资源描述。CheckinTime < endTime:);结束contacts=vertcat(contacts{:});contacts=unique(contacts.User);contacts(ismember(contacts,users))=[];结束
函数plotExpoData(x,y) s = load(“expo.mat”);expo=s.expo;图形绘图(expo.Demos.Distance,expo.Demos.RSSI,“。”)举行情节(expo.Catering.Distance expo.Catering.RSSI,“。”)图(x,y,“莫”)举行xlabel(“距离”) ylabel (“RSSI”)头衔(“基站vs.固定标签(演示+餐饮)”)传奇(“演示站”“餐饮站”“我们想看的东西”)文本(5,10,“RSSI vs. 8个基地x 25个锚点的距离”结束




与MATLAB®R2020a一起发布

|

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。