看了一天多的美赛C题,打算这两天从编程手的角度更新一些美赛的思路以及代码资料(R语言
)。
更新中… …
注意:本文的代码及思路仅供参考,切勿照抄,比赛期间勿私聊 … … 。
– 1、讨论这种害虫随着时间的推移而传播是否可以被预测,传播的特点是什么。
– 2、很多报道的目击事件都将其他黄蜂误认为是野黄蜂。使用提供的数据集文件和文件提供的图像视频文件来创建模型,并分析和预测错误分类的概率。
– 3、使用建立的模型讨论您的分类标准如何导致优先调查最有可能是阳性(野黄蜂)的目击报告。
– 4、随着时间的推移如何使用模型更新出新报告,预测发生的频率。
– 5、使用你的模型,什么时候可以说明华盛顿州已经消灭了这种害虫?
前两问是本次问题建模的核心。分别是:
1、根据时间和空间的经纬度关系分析出该黄蜂的传播特点以及生存特性
。
2、结合给出的每次目击报告的文件信息:图像数据、文本评论数据作为协变量数据、识别结果:阳性阴性作为相应遍量建立可预测的回归模型
。
后面三问都是对前两问中的一个模型应用
以及模型稳健分析
。
为了更好了构建模型,分析数据先读取数据进行预处理和可视化。
两个Excel数据可去链接免费下载:2021美赛excel数据
读入数据,分析字段
> str(GlobalID)
Classes ‘data.table’ and 'data.frame': 3305 obs. of 3 variables:
$ FileName: chr "ATT1_DSCN9647.jpg" "ATT10_67EAF187-B59C-4F5F-BAAC-9F76E06A96D6.jpg" "ATT100_inbound241937372812029587.jpg" "ATT1000_A5A50BAB-A6EF-4576-A1F8-A07862AADE3A.jpg" ...
$ GlobalID: chr "{5AC8034E-5B46-4294-85F0-5B13117EBEFE}" "{C4F44511-EA53-4FCF-9422-E1C57703720D}" "{43506835-18B8-46B2-A2CB-586AF9C8ECE6}" "{E0AE2F2A-38A5-463C-97B5-9F84A477F9AE}" ...
$ FileType: chr "image/jpg" "image/jpg" "image/jpg" "image/jpg" ...
- attr(*, ".internal.selfref")=<externalptr>
> str(DataSet)
Classes ‘data.table’ and 'data.frame': 4440 obs. of 8 variables:
$ GlobalID : chr "{7D0E73B4-EB54-4CA5-B6B0-F36CC41EBFBC}" "{55C3DF05-0FC3-4737-98CE-2AECFA6C21DB}" "{29CAD9B0-977C-4947-BD62-5CA381CEEA33}" "{DFA7F66D-8DCB-43D7-93EC-3F2E42602600}" ...
$ Detection Date : POSIXct, format: "2020-01-21" "2020-01-22" ...
$ Notes : chr "Definitive orange color....1.5-1.75\" long...very large body....this is the same report I turned in last night,"| __truncated__ "Looked like a yellow jacket on steroids was over an inch long I stepped on it to kill my wife scooped up with s"| __truncated__ "Big and nasty" "I killed this hornet with a bug zapper it took about 30 to 40 mins to kill every time I hit it it came back wit"| __truncated__ ...
$ Lab Status : chr "Unverified" "Unverified" "Unverified" "Unverified" ...
$ Lab Comments : chr "If you see it again, please submit a picture with your next reported sighting." NA NA NA ...
$ Submission Date: POSIXct, format: "2020-07-07" "2020-05-05" ...
$ Latitude : num 47.4 47.4 47.5 48.1 45.6 ...
$ Longitude : num -119 -122 -122 -122 -123 ...
- attr(*, ".internal.selfref")=<externalptr>
为了后面的容易处理,用DataSet
做主表,对GlobalID
做左连接合成一个表。
并提取年份和月份。记为变量y和m
维度:5618行13列
> str(r)
Classes ‘data.table’ and 'data.frame': 5618 obs. of 13 variables:
$ FileName : chr NA NA NA NA ...
$ GlobalID : chr "{7D0E73B4-EB54-4CA5-B6B0-F36CC41EBFBC}" "{55C3DF05-0FC3-4737-98CE-2AECFA6C21DB}" "{29CAD9B0-977C-4947-BD62-5CA381CEEA33}" "{DFA7F66D-8DCB-43D7-93EC-3F2E42602600}" ...
$ FileType : chr NA NA NA NA ...
$ DetectionDate : POSIXct, format: "2020-01-21" "2020-01-22" ...
$ Notes : chr "Definitive orange color....1.5-1.75\" long...very large body....this is the same report I turned in last night,"| __truncated__ "Looked like a yellow jacket on steroids was over an inch long I stepped on it to kill my wife scooped up with s"| __truncated__ "Big and nasty" "I killed this hornet with a bug zapper it took about 30 to 40 mins to kill every time I hit it it came back wit"| __truncated__ ...
$ LabStatus : chr "Unverified" "Unverified" "Unverified" "Unverified" ...
$ LabComments : chr "If you see it again, please submit a picture with your next reported sighting." NA NA NA ...
$ SubmissionDate: POSIXct, format: "2020-07-07" "2020-05-05" ...
$ Latitude : num 47.4 47.4 47.5 48.1 45.6 ...
$ Longitude : num -119 -122 -122 -122 -123 ...
$ y : num 2020 2020 2020 2020 2020 2020 2020 2020 2020 2020 ...
$ m : num 1 1 1 1 1 1 1 1 1 1 ...
$ m : num 1 1 1 1 1 1 1 1 1 1 ...
- attr(*, ".internal.selfref")=<externalptr>
赛题给了我们经纬度,先看一下具体的位置在哪里:
我找到了地图当底盘,画了散点图。左边是美国所有州的地图,我们看到只有左上角的华盛顿州有记录。所以我们调整图片的范围得到右图。但是这样画到一起看不出任何的信息,通过R语言glpot2分面
的技术得到下面的图。
假设点不重叠,从点的数目上可以看出黄蜂从2017年开始有苗头2018-2019增长期,2020年份数目骤增。接下来我们还想知道该物种是否具有季性。故加下来以2020年为例分月份我们画出了下面两幅图形。
上面那一幅图的是2020年不同月份发现的黄蜂报告数目,可以看出报告多集中在夏季前后。下面的幅图是每个月份做出的具体统计与可视化。有了这些关于黄蜂的数据特点我们下面选回归模型
、时间序列的分解模型
和生长季模型
来量化黄蜂生长的时间特点。
统计每年的报告数据做回归模型:
我们看到这个模型的效果不是很好无论是R2还是拟合曲线,还是曲线的方差,原因就在于这个数据在2020年有一个突增。
在时间序列模型中我们选择从2010年到2020年11年的时间,并细化到月份。
> Ts
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2010 0 1 0 1 0 0 0 0 1 0 0 0
2011 1 0 0 1 1 0 1 2 1 0 0 0
2012 0 0 0 0 0 2 2 1 0 0 0 0
2013 0 0 0 0 0 0 2 2 0 0 0 0
2014 0 0 0 1 0 0 0 0 0 0 0 0
2015 0 0 0 2 1 1 1 2 0 0 0 0
2016 0 0 0 0 0 1 3 2 0 0 0 0
2017 3 0 0 0 0 2 0 0 1 0 0 0
2018 0 1 0 1 5 7 9 3 1 0 0 0
2019 2 0 1 1 11 18 39 50 26 7 3 2
2020 12 7 25 205 649 435 1296 1719 811 227 3 1
从统计数据中我们可以看到一定的季节性,和周期性。下面我们通过建模进行提取关键信息。
qq图
告诉我们这幅图不是纯随机的图也不是正态图。从时序图
中我们看到该序列具有明显趋势,故不平稳。从acf、pacf
中可以看出,虽然有截尾特征,但是他的不满足平稳时间序列的前提,所以不能够建立ARMA
模型。可以考虑ARIMA以及SARIMA
,就这个题目而言SARIMA
比较贴切。
这里我们用加法模型
来拟合数据,因为乘法模型对数据突变的数据处理总是不好。
季节指数图:
上图是1-12月份的季节指数,可以看出5月份季节指数最高。3月份达到低谷。
最后我们给出分解模型的三个组成部分:
第一行是原始的时间序列图,第二行是长期的趋势,第三行是模型的周期性,第四行是模型的随机因素。如果想具体到几月份达到峰值,周期长度是多少,骤变结点是哪一个,可以直接处理数据的数据,篇幅原因就不把每个模型的数据输出了。
当然我个人不是和喜欢这个图的风格,想改的下面的代码可以实现。
function (x, ...)
{
xx <- x$x
if (is.null(xx))
xx <- with(x, if (type == "additive")
random + trend + seasonal
else random * trend * seasonal)
plot(cbind(observed = xx, trend = x$trend, seasonal = x$seasonal,
random = x$random), main = paste("Decomposition of",
x$type, "time series"), ...)
}
生长季模型是一类模型常用来处理植被的时空变化的NDVI(生长指数)值。这节通过不同时间节点的报告数,并计算黄蜂的频率指数。建立生长季模型,最终计算出不同年份中黄蜂的快速增长点,快速下降点,以及出现的时间长度。
本文建模的代码方法参考的包phenofit
,给出他的代码示例网站链接。
左图是20210-2020的昆虫的报告情况。右图是2020年的的一个情况。(AG方法的例子)
> myfit(df[241:264,]) # 2020
flag origin TRS2.sos TRS2.eos TRS5.sos TRS5.eos TRS6.sos TRS6.eos DER.sos DER.pop
1: 2020_1 2020-01-01 124 276 160 260 170 256 171 229
DER.eos UD SD DD RD Greenup Maturity Senescence Dormancy
1: 255 113 209 238 282 94 214 290 NA
可以看到TRS2
方法的生长季(sos: start of season)
节的开始是这年的第124天,结束(eos)
是这年的276天,持续存在了153天。
模型的参数和形式,这是对称的模型曲线。
$fFIT
$fFIT$AG
formula: mn + (mx - mn) * exp(-((t0 - t) * rsp)^a3)
formula: mn + (mx - mn) * exp(-((t - t0) * rau)^a5)
pars:
t0 mn mx rsp a3 rau a5
nlminb 7533.309 0.03075173 5.477063 0.01217213 2 0.02732946 2
每一题目(只更新前两问)在发布完思路后,统一发布合集链接,更新中 … …
会陆续发布思路代码,感兴趣的下面链接自取。
注意:代码在安装包之后可正常运行,不需要改动参数,但是这是R语言的代码,没有R语言基础的同学不推荐购买下载。
第一问代码链接。
比赛期间合理安排作息,注意休息。O奖冲呀!!!