美文网首页程序员
海藻!海藻!—R实战案例一(上)

海藻!海藻!—R实战案例一(上)

作者: 只是不在意 | 来源:发表于2017-07-06 15:51 被阅读0次

文中案例援引自:《数据挖掘与R语言》的第一个案例:海藻。加入自己的解读和部分代码修改。本文主要是可视化检查数据及处理缺失数据。下一篇是数据分析和预测。

数据描述:在一年的四季,收集了多条河流的不同水样。测定它们的化学性质和7种有害藻类(a1-a7)的存在频率
求:预测藻类模型,了解影响藻类的因素。

第一步:加载各种包和数据

library(DMwR)
library(car)
library(lattice)
library(Hmisc)
library(ggplot2)

head(algae)
summary(algae)

从数据中可见,数据包括取样季节,河流size,水质的化学参数,藻类(a1-a7)数目等。summary语句给出数据的统计特性概览。


第二步,图形可视化检查数据
这本书大概写的比较久,所以图形很朴素。用来解释数据是够了。

par(mfrow=c(1,2))
hist(algae$mxPH,prob=T,xlab='',main='Hist of max PH', ylim=0:1)
lines(density(algae$mxPH,na.rm=T))
rug(jitter(algae$mxPH))
qq.plot(algae$mxPH,main='Normal QQ plot of max PH')

左边是MxPH的直方图,同时显示变量分布的核密度。右边是QQ图,绘制正态分布的散点图,虚线显示置信区间。——可见MxPH服从正态分布。

2.png

用箱线图等检查各变量的离群点


par(mfrow=c(1,2))
boxplot(algae$oPO4,ylab="Orthophosphate(oP04)")
rug(jitter(algae$oPO4),side=2)
abline(h=mean(algae$oPO4,na.rm=T),lty=2)

plot(algae$NH4)
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)
#identify是手动点击辨认离群点
identify(algae$NH4)

下面是绘制lattice包的条件分位箱图,但不知道为什么不work。也没有报错。
equal.count是将变量离散化,转换为因子类型。number设置区间个数,overlap设置区间靠近边界的重合。

lattice::bwplot(size~a1,data=algae,xlab="Algal A1",ylab="River Size")
#min02<-equal.count(na.omit(algae$mn02),number=4,overlab=1/5)

第三步,处理数据缺失
方法1:将缺失部分剔除

#检查缺失行数
nrow(algae[!complete.cases(algae),])

#剔除缺失数据(过于简单粗暴,不采用)
#algae<-na.omit(algae)

apply(algae,1,function(x)sum(is.na(x)))

apply(..function(x)..)是对数据框调用该函数,1是计算每一行NA的数量,2是计算每列。可见第62行和199行数据缺失较多。


函数manyNAs的功能是找出缺失值大于列数20%的行,之后会用到。

#algae<-algae[-manyNAs(algae),0.2]

.
方法2 :用最高频率值来填补缺失值
除了单个用平均数、中位数等补缺以外,还可以使用centralImputation函数,它是用中心趋势值填补数据集所有缺失值。对数值型变量用中位数;对名义变量用众数。

#中数单个插补法,没有实际使用
#algae[is.na(algae$Chla),"Chla"]<-median(algae$Chla,na.rm=T)

#对数值用中位数,对名义变量用众数填补缺失数据集的centralImputation函数
algae<-centralImputation(algae)

这个方法速度较快,适用于大数据集,但可能导致数据偏差。

方法3:通过变量的相关关系填补缺失值
检查缺失值

symnum(cor(algae[,4:18],use="complete.obs"))

用符号表示相关值,可见NH4和NO3之间,PO4和oPO4之间的相关值很高。所以要找到这两个变量之间的线性相关关系。采用lm方法。
manyNAs是个满tricky的函数,虽然前面有讲过,但在这里才用,不然会影响cor相关关系。
另外一定要赋值给新数据框,不要覆盖。不然就要重新安装DMwR包才能upload海藻数据,好麻烦。

algae2<-algae[-manyNAs(algae)]
head(algae2)

lm(PO4~oPO4,data=algae2)

从lm结果可以得出:PO4=42.897+1.293 * oPO4
所以补充28行数据框如下,并删去缺失值较多的62和199行。

algae2[28,"PO4"]<-42.897+1.293*algae2[28,"oPO4"]
algae2<-algae2[-c(62,199),]

将季节因子化并排序,观测mxPH与季节,河流size的关系。(此步略,lattice包又不work了)

algae2$season<-factor(algae2$season,levels=c("spring","summer","autumn","winter"))
#histogram(~mxPH/season,data=algae2)
#histogram(~mxPH/size*speed,data=algae2)

#stripplot(size~mxPH/speed,data=algae,jitter=T)

.
方法4:探索案例直接相似性来填补缺失值。knnImputation函数用欧氏距离来寻找距离个案最近的k个邻居,用中位数填补缺失值。

clean.algae<-knnImputation(algae2,k=10,meth="median")

可以见到数据集完整了。


0.png

本文主要讲图形化检查数据及填补缺失数据。下文主要是讲获取预测模型,选取了多元线性回归和决策树模型。——估计也看晕了,休息休息: )

上半部完整代码如下:

library(DMwR)
library(car)
library(lattice)
library(Hmisc)
library(ggplot2)

head(algae)
summary(algae)

######
par(mfrow=c(1,2))
hist(algae$mxPH,prob=T,xlab='',main='Hist of max PH', ylim=0:1)
lines(density(algae$mxPH,na.rm=T))
rug(jitter(algae$mxPH))
qq.plot(algae$mxPH,main='Normal QQ plot of max PH')

par(mfrow=c(1,2))
boxplot(algae$oPO4,ylab="Orthophosphate(oP04)")
rug(jitter(algae$oPO4),side=2)
abline(h=mean(algae$oPO4,na.rm=T),lty=2)

plot(algae$NH4)
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)
identify(algae$NH4)

bwplot(size~a1,data=algae,xlab="Algal A1",ylab="River Size")
#min02<-equal.count(na.omit(algae$mn02),number=4,overlab=1/5)

#######

nrow(algae[!complete.cases(algae),])
#algae2<-na.omit(algae)

apply(algae,1,function(x)sum(is.na(x)))
apply(algae,2,function(x)sum(is.na(x)))

#algae[is.na(algae$Chla),"Chla"]<-median(algae$Chla,na.rm=T)

#对数值用中位数,对名义变量用众数填补缺失数据集的centralImputation函数
#algae<-centralImputation(algae)
symnum(cor(algae[,4:18],use="complete.obs"))

algae2<-algae[-manyNAs(algae)]
head(algae2)

lm(PO4~oPO4,data=algae2)
algae2[28,"PO4"]<-42.897+1.293*algae2[28,"oPO4"]
algae2<-algae2[-c(62,199),]

algae2$season<-factor(algae2$season,levels=c("spring","summer","autumn","winter"))

clean.algae<-knnImputation(algae2,k=10,meth="median")

相关文章

  • 海藻!海藻!—R实战案例一(上)

    文中案例援引自:《数据挖掘与R语言》的第一个案例:海藻。加入自己的解读和部分代码修改。本文主要是可视化检查数据及处...

  • 海藻!海藻!—R实战案例一(中)

    上半部分:海藻!海藻!—R实战案例一(上)本案例的目的是预测140个水样中7种海藻的出现频率,这部分是用多元线性回...

  • 海藻舞的炫

    跳了近两小时的海藻舞,感觉脑海里全是海藻的身影,深深影响着我的生活基调:海藻海藻海藻~浪花里舞蹈~ 走路时:踏步踏...

  • 天然酵种全麦海藻面包-减肥利器

    制作步骤 1.海藻丝的准备;我买的海藻丝是盐渍的,海藻丝上有很多的盐。首先要把海藻丝泡在水中泡去盐分,然后把海藻沥...

  • 海藻

    海藻 医院里,大哥将装菜的红色瓶子一下子扔到了垃圾桶里。“哎……”我伸出手,没来...

  • 海藻

    海藻昏黄,行人匆匆,未见君子,言何庸庸。

  • 海藻

    3/30 她又来到了Z市。她已经好久没来过了,也尽量能避开就避开。Z市属于内陆省份,是没有海的,不知为什么每次踏上...

  • 海藻

    海藻 文/九月 岩石侧面,没有琴,没有弦 有摇曳的舞姿,炫动 小小世界里,没有忧伤 有鱼虾嬉戏,文蛤谈情 草绿,独...

  • 海藻

    海藻 看我独舞的绚丽 一份逍遥自在 想我浪涛里的挣扎 一份生的挑战 看不见的伤痕 孤寂无所依托日子 经过岁月里反复...

  • 海藻

    璃龙学长原创 有的生于海底, 有的繁茂如林 有的高若泰坦, 有的渺小如尘埃, 有的任由日晒浪拨, 依然生机勃勃,不...

网友评论

    本文标题:海藻!海藻!—R实战案例一(上)

    本文链接:https://www.haomeiwen.com/subject/rfoncxtx.html