在MATLAB的艺术洛伦

将想法转化为MATLAB

可以联系跟踪帮助最终COVID-19锁定?

由于大流行于三月成为全球问题,我们得到了令人满意的如何MATLAB用户已积极协助相关COVID-19的研发.今天的客人博主,竹内敏我愿就全球抗击新冠肺炎疫情的一个值得关注的领域发表看法。

内容

接触者追踪

当局正在探索逐步解除封锁的策略,接触者追踪是作为一个可能的全面解决方案的可能。联系跟踪有超过150年的历史,但它随着时间的推移而作出了发展,以应对不同类型的爆发和技术可用性。我们还能够在此处进行基于技术的贡献吗?让我们来看看。

约翰·斯诺

John Snow博士也许是第一个制定联系跟踪形式的人。在此期间1854年伦敦霍乱疫情,他使用数据来对抗主流“Miasma”(或“糟糕的空气”)理论的疾病,识别真正的原因并帮助结束了爆发。我们可以考虑他提前的数据科学和流行病学的先驱。

这里是雪博士收集了所有由他本人用钢笔和纸(源中的数据:罗宾的博客),用可视化Geoscatter

泵= cholerakml2tbl(“pumps.kml”);Cholera = Cholerakml2TBL(“cholera_deaths.kml”);图geoscatter(cholera.lat,cholera.lon,cholera.deaths * 10,“填充”) 抓住geoscatter(泵。泵,泵.Lon,“填充”) geoscatter(意味着(cholera.Lat),意味着(cholera.Lon),“红色”“填充”)Geoscatter(平均值(Cholera.lat),平均(Cholera.lon),40000,“红色”)文本(pumps.lat(1),pumps.lon(1),“宽街泵”) 标题(“约翰斯诺的霍乱地图,伦敦1854”)传说(“死亡人数”“泵”“重心的死亡”“地点”“东南”

霍乱死亡人数进行计数,并映射到它们的位置。一个蓝色圆点的大小表示死亡人数在该位置的数量。死亡沿着某条线路发生,而不是包裹,你会希望看到,如果他们被瘴气造成了整个区域。斯诺博士发现在他的地图的中心宽街泵,并且使他怀疑供水随着病情的可能来源。最终,他能够说服当地的健康板拆下泵手柄,使人们无法从泵喝酒,这就是如何帮助他最终爆发。关注这个有趣的YouTube视频广阔的街头泵更多细节。

注意:使用圆圈来模拟疾病的蔓延更适合Miasma理论。也许这应该是一个网络问题的建模,但我保持简单。

COVID-19和接触者追踪

由于位置数据是接触者追踪的关键组成部分,一些国家,特别是在东亚,使用移动应用程序打COVID-19.这个YouTube视频谈论了韩国,由于MERS爆发的教训,能够缓解具有激进的测试和联系跟踪的限制.虽然没有朝接触,由于隐私问题或限制过早放松追踪技术的运用批评,我们最终将不得不寻找出路,我们应该探讨所有的选项。

在美国,奥斯汀德克萨斯大学的研究人员使用移动数据来了解社会偏差如何工作,通过跟踪访问零售店等零售店和药房,并将这些与死亡率联系起来。Apple和Google还在努力采用更好的基于蓝牙的技术,更好的隐私保护.他们使用通常在10米范围内工作的蓝牙LE,在相互接触的设备之间交换加密的标识符。那些钥匙可以保存14天。如果此类设备的所有者受到感染,则会通知其他设备的所有者。这很有趣,但有没有一种方法让我们更好地了解它是如何使用某些数据的呢?

Gowalla数据集

由于隐私问题,移动数据集不会广泛使用,但我发现了Gowalla签到数据集包含现已解散的移动应用服务的匿名用户活动。该服务让用户检查到的位置。这在本质上更接近于由研究人员在德克萨斯大学奥斯汀分校,而不是苹果/谷歌的做法大学所使用的数据集零售,但我们仍然可以从中学到一些东西。

由于这只是一个例子,我们将只使用2010年9月纽约市的数据子集。为了这个例子,让我们假设数据代表了封锁放松后人们做了什么我们选择了一个用户,578,作为2010年9月24日诊断日期的索引案例。

nyc = loadnycgowalladata(“gowalla_totalcheckins.txt”);联系人= 578;%指数情况diagnosisDate = datetime (“2010-09-24”“时区”“America / new_york”);incubationPeriod =天(14);contactDuration =分钟(15);%基于入住时间maxdegreesofseparation = 2;%包括二次触点

我拿起其他参数随意,但他们应该基于医疗机构设置一些行之有效的方案来确定。

移动=细胞(maxDegreesOfSeparation + 1,1);为了II = 1:maxdegreesofseparation + 1移动{ii} = getMovements(NYC,触点,诊断,孵化Period,II-1);联系人= FindContacts(NYC,MOVE {II},CONTACTIDUNTY);结尾移动= vertcat(移动{:});moves = sortrows(移动,“类型”“descend”);动作。类型= renamecats(动作。类型,“Degree0”“索引案例”);

现在我们用a来表示数据geodensityplot,突出人们需要避免的地区。

图colormap热的Geodentyplot(moves.lat,moves.lon,“FaceColor”“interp”“半径”,500)保持alphamap(正常化((1:64)。^ 0.2,“范围”标题))((“纽约的Gowalla办理登机手续数据集”;“用户578 +直接+二次联系人”])

这个数据集相当有限,但它仍然可以让我们足以欣赏一些实用的技术挑战。

  • 考虑到曼哈顿的人口密度,联系人的数量不是很大,因为Gowalla并没有被广泛使用。为了使其有效地追踪接触者,这款应用程序必须被广泛采用。要确保它提供足够的保护,最低采用率需要多少?
  • 我们应该恢复多少天接触跟踪?我使用14天,因为这是用于潜伏期的标准。这也是苹果和谷歌计划的使用。
  • 通常情况下,只有谁直接与索引的情况(第一分离度)接触的人士被追踪,但我们可以找到他们的接触为好。当警报出去,谁应该被列入?
  • 人们在14天内移动和参观了许多地方(这张地图只显示他们登记入住的地方)。是因为他们是Gowalla的用户吗?当我们放松限制时,我们应该限制多少人可以移动吗?
  • 我们如何定义“联系”?我使用了邻近的入住时间来保持简单。Bluetooth Le通常在10米的范围内工作。CDC指南为6英尺或2米。10米太多了吗?苹果似乎还计划使用RSSI级别来估计距离。

测量距离很困难

当谈到使用RSSI测量距离时,MathWorks英国团队成功了建成并演示了基于RFID的人员跟踪系统几年前的Matlab Expo。以下是显示基站(蓝色点)的地面规划,其将附近RFID标签检测到的基站(蓝点)和传输数据到中央服务器,静止RFID标签(绿色点)和各个演示区域的静止RFID标签(橙色点)。与会者还与移动RFID标签走来走去。

当时间来分析从事件中收集的数据时,我们遇到了一个问题 - “我们最初假设我们可以使用信号力量来估计距离。但是,实际上,您无法制造的信号力量非常波动这种方式自信地估计“。如链接帖子中所述,我们最终找到了解决这个问题的方法,但它很难。

我们有距离测量为8个基站×25个静止的RFID标签和从所述事件期间的那些组合收集的RSSI数据。这里是RSSI的对距离的情节。红线代表一个假想的下斜行,我们希望看到的。正如你所看到的,在任何给定距离的RSSI波动太大,以致没有办法得到的RSSI和距离之间有明显的相关。我不能共享数据,但你可以看到它是如何在使用这个帖子

%距离范围0-35米disox = 0:35;为简单起见,噪声的百分比线性模型RSSI = -1.6 * DISC + 90 + RANDN(1,长度(DISC));%暗算实际数据的线性模型Plotexpodata(Disc,RSSI);

全球定位系统(GPS)怎么样?

也许用GPS更容易确定距离?我用MATLAB移动在我的邻居公园里。而不是分享我的数据,我想鼓励你使用来自Matlab Mobile的自己的GPS数据,因为它非常容易

为了得到距离,我们需要知道我们测量的是哪个点——没有一个点可以测量那些从未真正接触过的人之间的距离,因为他们在不同的时间处于同一点。这很简单时间表数组和使用该功能同步

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

然后,你可以使用距离deg2km.来自映射工具箱.得到的距离。

度=距离(synched.latitude_1 synched.longitude_1,...synched.latitude_2 synched.longitude_2);gpsDist = deg2km(度)* 1000;从公里转换为米的百分比[Mindist,Minidx] = Min(GPSDist);

在以下情节中,当他们接触时,你可以看到两个用户在相反的方向上走在池塘周围,以及它们的距离。他们接近两点,但后者是最接近的。比RSSI更容易,但这正是为什么我们有利用GPS数据的隐私问题。

t = tiledlayout(“流”);nextdtile([2 1])geoplot(同步。ratitude_1,synched.longitude_1,“。”) 抓住geoplot(同步。ratitude_2,synched.longitude_2,“。”) geoplot (synched.latitude_1 (minIdx) synched.longitude_1 (minIdx),“唵”)文本(同步。(minidx),同步.Longitude_1(minidx),“最低限度”...“水平对齐”“对”) 标题(“路线”)传说(“一种”“b”“地点”“最好的事物”)nexttile图(synched.Timestamp,synched.latitude_1)保持绘图(同步.Timestamp,Synched.Lattitude_2)绘图(同步.Timestamp(MiniDX),同步.Lattitude_2(MiniDX),“莫”)文本(Synched.Timestamp(MiniDX),同步.Latitude_2(MiniDX),“最低限度”...“水平对齐”“对”)标题(“纬度X时间”)nexttile图(synched.Timestamp,gpsDist)保持绘图(同步.Timestamp(Minidx),GPSDist(Minidx),“莫”)文本(synched.Timestamp(minIdx),gpsDist(minIdx)+ 80,“最低限度”...“水平对齐”“对”) 标题(“A&B之间的距离”) ylabel (“米”)标题(T,[撰写(“基于gps的距离跟踪,最小距离%。2 f米”...心灵);撰写(“在时间min距离%S”datestr (synched.Timestamp (minIdx)))))

呼吁采取行动

通过这项简要调查,我希望我突出了联系跟踪是如何与数据科学相关的,并且Matlab用户可能能够做出贡献。你看到我没有提到的其他机会吗?也许你已经在努力了一些问题?分享你的想法这里!!

本地函数

功能tbl = cholerakml2tbl(filename)fileid = fopen(文件名);c = textscan(fileID,“%s”);fclose(fileid);str =加入(字符串(c {1}'));Coords = Questbetween(str,“< >坐标”" < / >坐标”);Coords = Split(Coords,“,”);coords = str2double(coords);TBL =表;如果匹配(文件名,“pumps.kml”)类型=“泵”;elseif匹配(文件名,“cholera_deaths.kml”)类型=“死亡人数”;结尾资源描述。类型= repmat(字符串(类型)、大小(坐标,1),1);资源描述。Lat =坐标(:,2);资源描述。朗=坐标(:1);值= extractBetween (str,“<值>”" < /值> ");如果〜isempty(值)值= str2double(值);tbl.deaths =值;别的tbl.deaths = zeros(高度(tbl),1);结尾结尾
功能data = loadnycgowalladata(gowalladatafile)如果存在(“nyc.mat”“文件”) 加载nyc.mat纽约数据= NYC;别的OPTS = detectImportOptions(gowallaDataFile,...“文件类型”“delimitedtext”“TextType”“细绳”);opts.variablenames = {“用户”'登记时间'“拉特”'lon''localid'};Gowalla = Readtable(Gowalladatafile,Opts);nyclim = [40.697,-74.079; 40.819,-73.880];nyc = gowalla(gowalla.lat> = nyclim(1,1)&...gowalla.lat <= nyclim(2,1)&gowalla.lon> = nyclim(1,2)&...gowalla.lon <= nyclim(2,2),:);nyc.checkintime = datetime(nyc.checkintime,...“InputFormat”“UUUU-MM-dd'T'HH:MM:SSZ”“时区”“世界标准时间”);nyc.CheckinTime.TimeZone =“America / new_york”;数据= NYC;结尾结尾
功能moveS = getMovements(tbl,用户,enddate,lookbackperiod,degress)moves = cell(长度(用户),1);startdate = Enddate  -  LeepbackPeriod;为了II = 1:长度(用户)移动{ii} = tbl(tbl.user ==用户(ii)&...tbl.CheckinTime> =&的startDate...tbl.CheckIntime <= Enddate,:);结尾移动= vertcat(移动{:});moves.Type = repmat(“程度”+度,高度(移动),1);moves.type =分类(moves.type);结尾
功能contacts = findContacts(tbl, moves,duration)'localid''登记时间'});斑点= sortrows(斑点,“登记时间”);用户=独特(movements.User);联系人=细胞(高度(点),1);为了ii = 1:height(spots) startTime = spots. checkintime (ii) - duration;endTime = spot . checkintime (ii) + duration;联系人{2}=(资源(资源描述。LocationId == spot .LocationId(ii) &...资源描述。CheckinTime > startTime &...tbl.checkintime 结尾联系人= VertCAT(联系人{:});联系人=唯一(Contacts.User);联系人(ISMember(联系人,用户))= [];结尾
功能plotExpoData(X,Y)S =负载(“expo.mat”);expo = s.expo;图绘图(expo.demos.distance,expo.demos.rssi,“。”) 抓住图(expo.Catering.Distance,expo.Catering.RSSI,“。”)绘图(x,y,“莫”) 抓住离开Xlabel(“距离”) ylabel (“rssi”) 标题(“基站与固定标签(演示+餐饮)”)传说(“演示站”“餐饮站”“我们想看到什么”)文本(5,10,“rssi与距离横跨8个基地x 25锚”结尾




发布与MATLAB®R2020A

|

评论

要留下评论,请点击这里登录到您的MathWorks帐户或创建一个新帐户。