气象数据通常是有规律的时间序列,分析气象数据时需要对空气质量测量、气象数据和扩散模型输出进行分析。openair 是用于分析空气质量数据或更广泛的大气成分数据的R软件包。该软件包广泛应用于学术界、公共和私营部门。
该项目最初由英国自然环境研究委员会(NERC)资助,并由英国环境部(Defra)提供额外资金。有关 openair 的最新信息可在软件包本身和本书网站 (The openair book) 上找到。
安装
#install.packages("openair") #未安装的需要安装软件,这里不重复安装
详情
该软件包的部分功能概述如下:
通过importAURN 和 family 函数访问英国数百个空气污染监测点的数据;
通过timeAverage 和 selectByDate 等实用功能更轻松地处理大气成分数据;
通过windRose 和 pollutionRose 灵活地绘制风玫瑰图和污染玫瑰图;
通过大多数函数中的 openair 类型选项灵活地绘制按小时或天、星期、季节等划分的数据;
通过更复杂的双变量极坐标图和条件概率函数帮助描述不同污染源的特征。
可访问 NOAA Hysplit 预先计算的年度96小时回溯轨迹以及许多绘图和分析功能,如轨迹频率、潜在污染源贡献函数和轨迹聚类。
使用上述灵活方法对空气质量模型进行评估的许多功能,如可按季节、时间等轻松评估模型的类型选项。 这些功能包括关键模型统计、泰勒图、条件量值图。
实操
从英国城乡自动网络导入数据
可以轻松地从 100 多个站点导入每小时的数据,也可以一次导入多个站点和数年的数据。
library(openair)
## Warning: package 'openair' was built under R version 4.2.3
kc1 <- importAURN(site = "kc1", year = 2020)
kc1
## # A tibble: 8,784 × 15
## source site code date co nox no2 no o3 so2
## <chr> <chr> <chr> <dttm> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 aurn London … KC1 2020-01-01 00:00:00 0.214 64.8 46.2 12.1 1.13 NA
## 2 aurn London … KC1 2020-01-01 01:00:00 0.237 74.1 45.0 19.0 1.20 NA
## 3 aurn London … KC1 2020-01-01 02:00:00 0.204 60.5 41.4 12.4 1.50 NA
## 4 aurn London … KC1 2020-01-01 03:00:00 0.204 53.5 39.8 8.93 1.60 NA
## 5 aurn London … KC1 2020-01-01 04:00:00 0.169 37.7 33.6 2.63 5.79 NA
## 6 aurn London … KC1 2020-01-01 05:00:00 0.160 43.3 36.8 4.25 6.09 NA
## 7 aurn London … KC1 2020-01-01 06:00:00 0.157 48.2 39.4 5.76 2.74 NA
## 8 aurn London … KC1 2020-01-01 07:00:00 0.178 60.5 44.7 10.3 1.20 NA
## 9 aurn London … KC1 2020-01-01 08:00:00 0.233 71.8 47.9 15.6 2.25 NA
## 10 aurn London … KC1 2020-01-01 09:00:00 0.329 128. 46.9 53.2 2.25 NA
## # ℹ 8,774 more rows
## # ℹ 5 more variables: pm10 <dbl>, pm2.5 <dbl>, ws <dbl>, wd <dbl>,
## # air_temp <dbl>
使用 selectByDate 函数可以轻松选择相当复杂的时间段。 例如,选择 2012 年 6 月至 9月工作日(周一至周五)上午 7 点至下午 7 点(含)的数据:
sub <- selectByDate(kc1,
day = "weekday",
year = 2020,
month = 6:9,
hour = 7:19
)
sub
## # A tibble: 1,144 × 15
## date source site code co nox no2 no o3 so2
## <dttm> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2020-06-01 07:00:00 aurn London… KC1 0.125 23.1 16.8 4.14 56.5 2.29
## 2 2020-06-01 08:00:00 aurn London… KC1 0.133 25.2 17.8 4.79 61.7 2.68
## 3 2020-06-01 09:00:00 aurn London… KC1 0.119 15.6 12.2 2.22 75.8 2.35
## 4 2020-06-01 10:00:00 aurn London… KC1 0.104 13.8 11.1 1.79 87.1 1.57
## 5 2020-06-01 11:00:00 aurn London… KC1 0.0956 14.0 11.8 1.46 96.7 1.44
## 6 2020-06-01 12:00:00 aurn London… KC1 0.0985 11.3 9.97 0.893 106. 1.44
## 7 2020-06-01 13:00:00 aurn London… KC1 0.0927 11.0 9.64 0.893 112. 2.03
## 8 2020-06-01 14:00:00 aurn London… KC1 0.0927 12.5 10.8 1.14 114. 2.81
## 9 2020-06-01 15:00:00 aurn London… KC1 0.0811 10.7 9.48 0.822 115. 2.88
## 10 2020-06-01 16:00:00 aurn London… KC1 0.0898 13.9 11.9 1.29 104. 2.22
## # ℹ 1,134 more rows
## # ℹ 5 more variables: pm10 <dbl>, pm2.5 <dbl>, ws <dbl>, wd <dbl>,
## # air_temp <dbl>
同样,用多种灵活的方法计算时间平均数据也很容易。 例如,两周平均值的计算公式为
sub2 <- timeAverage(kc1, avg.time = "2 week")
type选项
openair 的一个重要方面是type选项的使用,几乎所有的 openair 函数都可以使用type选项。 type选项按变量的不同类别分割数据。 在按不同日期值分割数据的基础上,type 有许多内置选项。 以下是 type 的内置值摘要:
“year”按年份分割数据
“month”按年份中的月份分割变量
“monthyear”按年份和月份分割数据
“season”按季节分割变量。 注意,在这种情况下,用户还可以提供一个半球选项,可以是 “北半球”(默认)或 “南半球”。
“weekday”按星期拆分变量。
“weekend”按周六、周日和工作日拆分变量。
“daylight”按夜间/白天拆分变量。 需要注意的是,必须提供经度和纬度。
“dst”按夏令时和非夏令时分割变量。
“wd”如果有风向(wd),type = “wd”将把数据分割成 8 个扇区: N、NE、E、SE、S、SW、W、NW。
“seasonyear (或”yearseason”)“将把数据分成年-季区间,将一个季节的月份保持在一起。 例如,2010 年 12 月被视为 2011 年冬季的一部分(与 2011 年 1 月和 2 月一起)。 这样就更容易考虑连续的季节。 相比之下,type =”季节 “只会将数据分成四季,而不考虑年份。
如果数据框架中存在分类变量,如站点,则可直接使用该变量,如 type = “站点”。
type也可以是数值变量。在这种情况下,数值变量会被分成4分位数变量,即包含相同数量点的 4 个分区。可以提供 n.levels 选项来指示使用多少个分位数水平。
示例
导入自带数据集mydata
data(mydata)
head(mydata)
## # A tibble: 6 × 10
## date ws wd nox no2 o3 pm10 so2 co pm25
## <dttm> <dbl> <int> <int> <int> <int> <int> <dbl> <dbl> <int>
## 1 1998-01-01 00:00:00 0.6 280 285 39 1 29 4.72 3.37 NA
## 2 1998-01-01 01:00:00 2.16 230 NA NA NA 37 NA NA NA
## 3 1998-01-01 02:00:00 2.76 190 NA NA 3 34 6.83 9.60 NA
## 4 1998-01-01 03:00:00 2.16 170 493 52 3 35 7.66 10.2 NA
## 5 1998-01-01 04:00:00 2.4 180 468 78 2 34 8.07 8.91 NA
## 6 1998-01-01 05:00:00 3 190 264 42 0 16 5.50 3.05 NA
数据集中包含日期、风向、风速及多个气态污染物的浓度数据。我们先来看一下总体风向的分布。
#绘制玫瑰图
windRose(mydata)
设置type选项为按年划分。
windRose(mydata,
type = "year",
layout = c(4, 2)
)
风向玫瑰图总结了监测站每年的风况。接下来我们使用双变量极坐标图查看空气污染的来源。
polarPlot(mydata,
pollutant = "so2",
statistic = "cpf",
percentile = 90,
cols = "YlGnBu"
)
二维极坐标图显示了导致污染物浓度升高的风力条件。
进一步地,可使用日历的方式呈现污染物水平的分布,如:
calendarPlot(mydata, pollutant = "o3", year = 2003)
可详细看到2003年度每一天的臭氧浓度水平的分布和变化。关于这个包还有非常多用途,详见https://davidcarslaw.com/files/openairmanual.pdf。感兴趣的大家可进一步探索,可使用自己的数据集利用该包中的函数进行分析和可视化。
References: Carslaw, D.C. and K. Ropkins, (2012). openair — an R package for air qualitydata analysis. EnvironmentalModelling&Software. Volume27-28,pp. 52–61.
欲探索更多R包使用方法,请关注微信公众号《单细胞学会》。