要点:

1)数据可视化:直方图hist()、QQ图qq.plot()、箱图boxplot()、二维箱图bwplot()

2)空值处理:查找complete.cases()、空值删除na.omit()、均值/中位值填充mean()/median()

3)多元回归:lm()

4)回归树:rpart()

5)模型选择/交叉验证:

6)模型预测:


1、问题描述

监测和早期预测有害海藻开花对提升河流水质有很大作用。我们希望通过监测多条河流的化学成分变化及有害海藻情况,来预测海藻开花。在本问题中,有两个主要数据集:第一个数据集包括200个水质样本。为了更加精确,每个观测值实际上是同一条河流在一年中同一个季节连续3个月的取样聚合。每个观测值包括11个变量,其中3个是枚举值,描述了数据收集的季节、河流大小以及水流速度。剩余8个变量则是水质的8个化学参数,分别如下:

+ 最大PH值

+ 最小含氧量

+ 平均氯含量

+ 平均硝酸盐含量

+ 平均铵基盐含量

+ 平均正磷酸盐含量

+ 平均磷酸盐含量

+ 平均叶绿素含量

随后的7个变量是在各个水质样本中发现的有害海藻数量。第二个数据集是测试数据集,包含140个水质样本,与第一个数据集字段结构类似,但是缺少后面7个有害海藻数量字段。

目标:预测140个水质样本中7类海藻数量。

类别:通过已有数据预测特定变量,分辨对结果影响大的因素。


2、数据预处理

导入数据:

1)通过指令

algae <-read.table('Analysis.txt',header=F,dec='.',col.names=c('season','size','speed','mxPH','mnO2','Cl','NO3','NH4','oPO4','PO4','Chla','a1','a2','a3','a4','a5','a6','a7'),na.strings=c('XXXXXXX'))

2)通过菜单操作,R Data Import/Export


3、数据可视化和汇总

对未知数据集合,可以先进行简单统计分析。

> summary(algae)
     season       size       speed         mxPH            mnO2              Cl               NO3        
  autumn:40   large :45   high  :84   Min.   :5.600   Min.   : 1.500   Min.   :  0.222   Min.   : 0.050  
  spring:53   medium:84   low   :33   1st Qu.:7.700   1st Qu.: 7.725   1st Qu.: 10.981   1st Qu.: 1.296  
  summer:45   small :71   medium:83   Median :8.060   Median : 9.800   Median : 32.730   Median : 2.675  
  winter:62                           Mean   :8.012   Mean   : 9.118   Mean   : 43.636   Mean   : 3.282  
                                      3rd Qu.:8.400   3rd Qu.:10.800   3rd Qu.: 57.824   3rd Qu.: 4.446  
                                      Max.   :9.700   Max.   :13.400   Max.   :391.500   Max.   :45.650  
                                      NA's   :1       NA's   :2        NA's   :10        NA's   :2       
       NH4                oPO4             PO4              Chla               a1              a2        
  Min.   :    5.00   Min.   :  1.00   Min.   :  1.00   Min.   :  0.200   Min.   : 0.00   Min.   : 0.000  
  1st Qu.:   38.33   1st Qu.: 15.70   1st Qu.: 41.38   1st Qu.:  2.000   1st Qu.: 1.50   1st Qu.: 0.000  
  Median :  103.17   Median : 40.15   Median :103.29   Median :  5.475   Median : 6.95   Median : 3.000  
  Mean   :  501.30   Mean   : 73.59   Mean   :137.88   Mean   : 13.971   Mean   :16.92   Mean   : 7.458  
  3rd Qu.:  226.95   3rd Qu.: 99.33   3rd Qu.:213.75   3rd Qu.: 18.308   3rd Qu.:24.80   3rd Qu.:11.375  
  Max.   :24064.00   Max.   :564.60   Max.   :771.60   Max.   :110.456   Max.   :89.80   Max.   :72.600  
  NA's   :2          NA's   :2        NA's   :2        NA's   :12                                        
        a3               a4               a5               a6               a7        
  Min.   : 0.000   Min.   : 0.000   Min.   : 0.000   Min.   : 0.000   Min.   : 0.000  
  1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.000  
  Median : 1.550   Median : 0.000   Median : 1.900   Median : 0.000   Median : 1.000  
  Mean   : 4.309   Mean   : 1.992   Mean   : 5.064   Mean   : 5.964   Mean   : 2.495  
  3rd Qu.: 4.925   3rd Qu.: 2.400   3rd Qu.: 7.500   3rd Qu.: 6.925   3rd Qu.: 2.400  
  Max.   :42.800   Max.   :44.600   Max.   :44.400   Max.   :77.600   Max.   :31.600

对于枚举类型变量,提供各类数据的频次统计。比如,我们发现在冬天进行提取的水质样本最多。

对于数值类型变量,R语言提供一些统计属性描述,如最小值、均值、中位值、最大值、四分位值等。通过观察中位值、均值差距,以及四分位值之间的范围(如第3四分位值减去第1四分位值),我们可以了解分布的偏度(skewness)和分布(spread)。同时,最好通过图形了解这些信息。例如,

> hist(algae$mxPH, prob = T)

通过直方图,我们可以看出,变量mxPH近似呈现正态分布。更进一步可以使用QQ图检验。

> library(car)
 > par(mfrow=c(1,2)) 
 > hist(algae$mxPH, prob=T, xlab='',main='Histogram of maximum pH value',ylim=0:1)
 > lines(density(algae$mxPH,na.rm=T))
 > rug(jitter(algae$mxPH))
 > qq.plot(algae$mxPH,main='Normal QQ plot of maximum pH')
 > par(mfrow=c(1,1))

QQ图中虚线表示95%置信水平下样本呈现正态分布的范围。另一种分析形式是箱图,例如对于oPO4变量,

> boxplot(algae$oPO4, ylab = "Orthophosphate (oPO4)")
 > rug(jitter(algae$oPO4), side = 2)
 > abline(h = mean(algae$oPO4, na.rm = T), lty = 2)

框图的上下沿分别表示第1、3四分位数。框外上横线为第3四分位数字加上1.5倍的四分位数值,下横线为第1四分位数字减去1.5倍的四分位数值。在这两条横线之外的圆圈,表示极大或极小样本,通常被认为是异常值。同时,通过中位值与均值对比,可以发现异常值拉高了均值。

有时,我们希望了解异常值的具体数值,可以通过如下指令,

> plot(algae$NH4, xlab = "")
 > abline(h = mean(algae$NH4, na.rm = T), lty = 1)
 > abline(h = mean(algae$NH4, na.rm = T) + sd(algae$NH4, na.rm = T),lty = 2)
 > abline(h = median(algae$NH4, na.rm = T), lty = 3)
 > clicked.lines<-identify(algae$NH4)
 > algae<-[clicked.lines,]

对于异常值,我们可以直接计算呈现,而不通过图形查看,

> algae[!is.na(algae$NH4) & algae$NH4 > 19000,]

为了更进一步考察两个变量关系,可以通过如下箱图进行呈现,

> library(lattice)
 > bwplot(size ~ a1, data=algae, ylab='River Size',xlab='Algal A1')

从上图我们可以看出,在小河流中有害海藻的a1值更高。

对于两个连续的变量,可以通过如下离散化方式观察箱图,

> minO2 <- equal.count(na.omit(algae$mnO2),number=4,overlap=1/5)
 > stripplot(season ~ a3|minO2,data=algae[!is.na(algae$mnO2),])