R语言:噪声数据处理
正文
噪声是一个测量变量中的随机错误或偏差,包括错误值或偏离期望的孤立点值。在R中可以通过调用outliers软件包中的outlier函数寻找噪声数据,该函数通过寻找数据集中与其他观测值及均值差距最大的点作为异常值,函数的主要形式为:
outlier(x, opposite = FALSE, logical = FALSE)
其中,x表示一个数据,通常是一个向量,如果x输入的是一个数据框或矩阵,则outlier函数将逐列计算;opposite可输入TRUE或者FALSE,如果值为TRUE,给出相反值(如果最大值与均值差异最大,则给出最小值);logical可输入TRUE或者FALSE,如果值为TRUE,给向量赋予逻辑值,可能出现噪声的位置用TRUE表示。
> library(outliers)
# 设置随机数种子,保证每次出现的随机数相同
> set.seed(1); s1=.Random.seed
# 生成100个标准正态随机数
> y=rnorm(100)
>
# 找出其中离群最远的值
> outlier(y)
[1] -2.2147
# 找出最远离群值相反的值
> outlier(y,opposite=TRUE)
[1] 2.401618
# 对y绘制点图,如图所示
> dotchart(y)
# 将y中的数据重新划分成20行5列的矩阵
> dim(y) <- c(20,5)
# 求矩阵中每列的离群最远值
> outlier(y)
[1] -2.214700 -1.989352 1.980400 2.401618 -1.523567
# 求矩阵中每列的离群最远值的相反值
> outlier(y,opposite=TRUE)
[1] 1.595281 1.358680 -1.129363 -1.804959 1.586833
# 设置随机数种子,保证每次出现的随机数相同
> set.seed(1); s1=.Random.seed
# 生成10个标准正态随机数
> y=rnorm(10)
# 返回相应逻辑值,离群最远值用TRUE标记
> outlier(y,logical=TRUE)
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[9] FALSE FALSE
# 绘制散点图,如图所示
> plot(y)
图例如下:
离群点检测还可以通过聚类方法进行检测,聚类将类似的取值组织成“群”或“簇”,落在“簇”集合之外的值被视为离群点。聚类方法将在第7章进行详细阐述。
在进行噪声检查后,操作实际中常用分箱、回归、计算机检查和人工检查结合等方法“光滑”数据,去掉数据中的噪声。
分箱方法是通过对数据进行排序,利用数据“近邻”来光滑有序数据值的一种局部光滑方法。在分箱方法中,可以使用箱均值、箱中位数或箱边界等进行光滑。箱均值光滑、箱中位数光滑分别为对于每个“箱”,使用其均值或中位数来代替箱中的值;而箱边界光滑则是指将给定箱中的最大值和最小值被视为箱边界,箱中每一个值都被替换为最近边界。一般而言,宽度越大,光滑效果越明显。箱可以是等宽的,即每个箱的区间范围是常量。
下面以等宽箱均值光滑方法为例来介绍。
> # 设置随机数种子,保证每次出现的随机数相同
> set.seed(1); s1=.Random.seed
> # 生成12个标准正态随机数
> x=rnorm(12)
> # 将数据从小到大排序
> x=sort(x)
> # 将数据形式转换成3行4列矩阵,每行代表一个箱
> dim(x)=c(3,4)
> # 用第一行的均值代替第一行中的数据
> x[1,]=apply(x,1,mean)[1]
> # 用第二行的均值代替第二行中的数据
> x[2,]=apply(x,1,mean)[2]
> # 用第三行的均值代替第三行中的数据
> x[3,]=apply(x,1,mean)[3]
> # 等宽分箱均值光滑结果
> x
[,1] [,2] [,3] [,4]
[1,] -0.003212265 -0.003212265 -0.003212265 -0.003212265
[2,] 0.340596290 0.340596290 0.340596290 0.340596290
[3,] 0.468529029 0.468529029 0.468529029 0.468529029
回归是指通过一个函数拟合来对数据进行光滑处理。线性回归涉及找出拟合两个变量的“最佳”直线,使得一个属性可以用来预测另一个;多元线性回归是线性回归的扩充,其中涉及的属性多于两个,并且数据拟合到一个多维曲面。
参考资料