洛伦谈MATLAB的艺术

将想法转化为MATLAB

接触追踪有助于结束新冠病毒-19的锁定吗?

自该流行病于3月成为一个全球性问题以来,我们感到满意MATLAB用户如何积极参与与新冠病毒-19相关的研究和开发.今天的嘉宾博客竹内俊二我愿就全球抗击新冠肺炎疫情的一个值得关注的领域发表看法。

内容

接触者追踪

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

约翰·斯诺

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

这是斯诺博士用纸和笔收集的数据(来源:罗宾的博客),用geoscatter

泵= choleraKML2Tbl (“泵.kml”);霍乱= choleraKML2Tbl (“cholera_deaths.kml”);图geoscatter (cholera.Lat、cholera.Lon cholera.Deaths * 10,“填充”)举行geoscatter (pumps.Lat pumps.Lon,“填充”) geoscatter(意味着(cholera.Lat),意味着(cholera.Lon),“红色”,“填充”) geoscatter(意味着(cholera.Lat),意味着(cholera.Lon), 40000年,“红色”)文本(pumps.Lat (1), pumps.Lon (1),“宽街泵”)标题(约翰·斯诺的霍乱地图,1854年伦敦)传说(“死亡”,“泵”,“重心的死亡”,“地点”,“东南”)

霍乱死亡人数被计算出来,并映射到它们的位置。蓝点的大小表示该位置的死亡人数。死亡发生在某些路线上,而不是像你所期望的那样覆盖整个区域。斯诺博士在地图的中心找到了宽阔的街道水泵,这使他找到了sus将供水视为疾病的可能来源。最终,他说服了当地卫生委员会拆除水泵的把手,这样人们就不能从水泵里喝水了,这就是他帮助结束疫情爆发的原因。观看这段有趣的YouTube视频宽街泵为更多的细节。

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

COVID-19和接触者追踪

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

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

Gowalla数据集

出于隐私考虑,移动数据集还不是很普及,但我发现Gowalla签到数据集它包含了一个现已失效的移动应用程序服务的匿名用户活动。该服务允许用户检查到一个位置。这在本质上更接近于得克萨斯大学奥斯汀分校研究人员使用的零售数据集,而不是Apple或谷歌的方法,但我们仍然可以从中学习到一些东西。

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

纽约= loadNYCgowallaData (“Gowalla_totalCheckins.txt”);联系人= 578;%指数情况diagnosisDate = datetime (“2010-09-24”,“时区”,“美国/ New_York”)孵化期=天(14);接触持续时间=分钟(15);%基于登记时间maxDegreesOfSeparation = 2;%包括次级接触

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

移动=单元格(maxDegreesOfSeparation+1,1);对于ii = 1:maxDegreesOfSeparation + 1 moves{ii} = getmoves (nyc,contacts,diagnosisDate,incubationPeriod,ii-1);联系人= findContacts(纽约,{2},contactDuration);终止移动= vertcat({}):移动;移动= sortrows(移动时,“类型”,“下”);动作。类型= renamecats(动作。类型,“Degree0”,“指数”);

现在我们用a来表示数据地球密度图,突出人们需要避免的领域。

图colormap热的geodensityplot (moves.Lat moves.Lon,“脸色”,“插值函数”,“半径”等一下alphamap(正常化((1:64)。^ 0.2,“范围”标题))((“纽约市Gowalla签到数据集”“用户578 +直接联系人+二次联系人”])

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

  • 考虑到曼哈顿的人口密度,联系人的数量不是很大,因为Gowalla并没有被广泛使用。为了使其有效地追踪接触者,这款应用程序必须被广泛采用。要确保它提供足够的保护,最低采用率需要多少?
  • 追踪接触者需要多少天?我用了14天因为这是潜伏期的标准这也是苹果和谷歌计划使用的。
  • 通常,只跟踪与索引案例(第一级分离)直接接触的人,但我们也可以找到他们的联系人。当警报发出时,应该包括谁?
  • 人们在14天内移动和参观了许多地方(这张地图只显示他们登记入住的地方)。是因为他们是Gowalla的用户吗?当我们放松限制时,我们应该限制多少人可以移动吗?
  • 我们如何定义“接触”?为了简单起见,我利用了登记时间的临近。蓝牙LE通常在10米范围内工作。疾控中心的指导方针是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.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 (“流”);2 nexttile ([1]) geoplot (synched.latitude_1 synched.longitude_1,“。”)举行geoplot (synched.latitude_2 synched.longitude_2,“。”) geoplot (synched.latitude_1 (minIdx) synched.longitude_1 (minIdx),“唵”)文本(synched.latitude_1 (minIdx) synched.longitude_1 (minIdx),“最低”,...“HorizontalAlignment”,“正确”)标题(“路线”)传说(“一个”,“B”,“地点”,“最好的”)下一个点图(同步。时间戳,同步。纬度1)保持情节(synched.Timestamp synched.latitude_2)情节(synched.Timestamp (minIdx) synched.latitude_2 (minIdx),“莫”)文本(synched.Timestamp (minIdx) synched.latitude_2 (minIdx),“最低”,...“HorizontalAlignment”,“正确”)标题(“x纬度时间”)nexttile绘图(同步时间戳,gpsDist)保持情节(synched.Timestamp (minIdx) gpsDist (minIdx),“莫”)文本(同步时间戳(minIdx),gpsDist(minIdx)+80,“最低”,...“HorizontalAlignment”,“正确”)标题(A和B之间的距离) ylabel (“米”)标题(t)[撰写](“基于gps的距离跟踪,最小距离%。2 f米”,...minDist);组成(“最小距离%s处的时间”datestr (synched.Timestamp (minIdx)))))

行动呼吁

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

局部函数

函数tbl = choleraKML2Tbl(filename) fileID = fopen(filename);C = textscan(文件标识,“% s”);文件关闭(文件标识);str =加入(string (C {1} '));坐标= extractBetween (str,“< >坐标”," < / >坐标”);坐标=分裂(坐标,",");坐标= str2double(坐标);台=表;如果匹配(文件名,“泵.kml”)类型=“泵”elseif匹配(文件名,“cholera_deaths.kml”)类型=“死亡”终止资源描述。类型= repmat(字符串(类型)、大小(坐标,1),1);资源描述。Lat =坐标(:,2);资源描述。朗=坐标(:1);值= extractBetween (str,," < /值> ");如果~isempty(values) values = str2double(values);资源描述。死亡=值;其他的资源描述。死亡= 0(高度(台),1);终止终止
函数data = loadNYCgowallaData (gowallaDataFile)如果存在(“nyc.mat”,“文件”)加载纽约地毯纽约数据=纽约;其他的opts=detectImportOptions(gowallaDataFile,...“文件类型”,“delimitedtext”,“TextType”,“字符串”);选择。VariableNames = {“用户”,“CheckinTime”,“纬度”,“朗”,“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,...“输入格式”,“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) movesUser == users(ii) &...tbl.CheckinTime>=开始日期&...资源描述。CheckinTime < = endDate:);终止moves=vertcat(moves{:});moves.Type=repmat(“度”+学历、身高(移动),1);动作。类型=分类(moves.Type);终止
函数contacts = findContacts(tbl, moves,duration)“LocationId”,“CheckinTime”});位置= sortrows(位置,“CheckinTime”);用户=独特(movements.User);联系人=细胞(高度(点),1);对于ii = 1:height(spots) startTime = spots. checkintime (ii) - duration;endTime = spot . checkintime (ii) + duration;联系人{2}=(资源(资源描述。LocationId == spot .LocationId(ii) &...资源描述。CheckinTime > startTime &...资源描述。CheckinTime < endTime:);终止联系人= vertcat(联系人:{});联系人=独特(contacts.User);联系人(ismember(联系人、用户))= [];终止
函数plotExpoData(x,y)s=加载(“世博垫”);世博会= s.expo;图绘制(expo.Demos.Distance expo.Demos.RSSI,“。”)举行地块(世博餐饮距离、世博餐饮RSSI、,“。”)情节(x, y,“莫”)举行包含(“距离”) ylabel (“RSSI”)标题(“基站与固定标签(演示+餐饮)”)传说(“演示站”,“餐饮站”,“我们想看到的”)文本(5,10,“RSSI vs. 8个基地x 25个锚点的距离”)终止




发布与MATLAB®R2020a

|

评论

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