在想调查不同的sample的某个变量a之间的差异时,其他几个变量b对该变量的固有影响往往会影响不同的sample变量a的比较,此时需要将sample变量a标准化后进行比较。 标准化方法是对sample的a变量和b变量进行loess回归,拟合与变量a的变量b相关的函数f(b ),f ) b )表示a的理论在b的影响下取值,a-f ) b ) ) a相对于f ) b的残差
Loess局部加权多项式回归
LOWESS最初由Cleveland提出,后来由ClevelandDevlin和其他许多人发展。 在r中,loess函数是基于lowess函数的更复杂、更强大的函数。 主要思想是:在数据集合的每个点用低维多项式拟合数据点的子集,并估计对应于该点附近的自变量数据点的因子值。 该多项式用权重最高的jxdyd乘法进行拟合; 距离该点越远,权重越小,该点的回归函数值通过该局部多项式得到,用于加权最大jxdyd次幂回归的数据子集由最近邻法决定。
最大的优点:是,为了使一个模型适合所有数据,不需要事先设定函数。 然后,可以对同一数据进行多次不同的拟合。 先拟合一个变量,再拟合另一个变量,探索数据中可能存在的关系。 这是普通的回归拟合做不到的。
LOESS平滑方法
1 .以x0为中心确定区间,可以灵活掌握区间的宽度。 具体而言,区间的宽度取决于q=fn。 这里,q为与局部回归相关的观察值的个数,f为与参加局部回归的观察值的个数的比例,n为观察值的个数。 在实际应用中,经常选定f -数,然后根据f和n确定q的取值,一般f的取值在1/3和2/3之间。 q和f的取法一般没有固定的标准。 增大q值或f值时,平滑值的平滑度增加,对于数据中前面的细微变化模式,分辨率较低,但噪声较小,对于数据中较大的变化模式,表现良好; 的q值和f值小,曲线粗糙,分辨率高,但噪声大。 没有标准的f值。 总是调试和比较是明智的。
2 .定义区间内所有点的权重。 权重由权重函数决定。 例如,三次加权函数weight=(1-((dist/maxdist) ),dist是距离x的距离并且maxdist是区间中的距离x的最大距离。 任意点(x0,y0 )的权重是权重函数曲线的高度。 权重函数应包括三个特性: (1)权重函数上的点(x0,y0 )具有最大权重。 )2)当x远离x0 )时,权重逐渐减少。 (3)权函数以x0为中心对称。
3 .对区间内的散布点拟合曲线y=f(x )。 被拟合的直线反映直线关系,接近x0的点在直线的拟合中起主要作用,区间外的点它们的权重为零。
4. x0的平滑点是拟合直线上x0的拟合点(y0,f(x0 ) )。
5 .求所有点的光滑点,连接光滑点即可得到Loess回归曲线。
r语言代码
loess (公式,数据,weights,subset,na.action,model=FALSE,
span=0.75,enp.target,degree=2,
parametric=FALSE,drop.square=FALSE,normalize=TRUE,
family=c(Gaussian,) symmetric )、
method=c('loess ',' model.frame ',
control=loess.control (
公式是公式,例如y~x,可以输入1到4个变量;
data是变量所在的数据框,如果data为空,则在环境中查找;
NA.action指定na数据的处理,默认为getoption('na.action );
模型是否返回模型框;
跨度是一个alpha参数,可以控制平滑度。 相当于上述的f。 如果alpha小于1,则权重函数是立方权重,而如果alpha小于1,则使用所有点。 最大距离为alpha ^ (1/p ),p为解释变量。
anp.target,定义span的替代方法;
normalize,对多变量normalize转到同一个scale;
family如果是gaussian则使用最大jxdyd乘法,如果是symmetric则使用双重权重函数进行再次下降的m估计;
method是适应模型,或者只提取模型框架;
control进行更高级的控制,使用loess.control的参数
其他参数请自己参照手册,寻找资料
loess.control(surface=c ) interpolate,) direct )、
状态=c (approximate,) exact )、
trace.hat=c(exact,) approximate )、
cell=0.2,iterations=4,)
surface,拟合表面是从kd数进行插值还是进行精确计算;statistics,统计数据是精确计算还是近似,精确计算很慢
trace.hat,要跟踪的平滑的矩阵精确计算或近似?建议使用超过1000个数据点逼近,
cell,如果通过kd树最大的点进行插值的近似。大于cell floor(nspancell)的点被细分。
robust fitting使用的迭代次数。
predict(object, newdata = NULL, se = FALSE,
na.action = na.pass, ...)
object,使用loess拟合出来的对象;
newdata,可选数据框,cmdxs寻找变量并进行预测;
se,是否计算标准误差;
对NA值的处理
实例
生物数据分析中,我们想查看PCR扩增出来的扩增子的测序深度之间的差异,但不同的扩增子的扩增效率受到GC含量的影响,因此我们首先应该排除掉GC含量对扩增子深度的影响。
数据
amplicon 测序数据,处理后得到的每个amplicon的深度,每个amplicon的GC含量,每个amplicon的长度
先用loess进行曲线的拟合
gcCount.loess
画出拟合出来的曲线
predictions1
#plot scatter and line
plot(RC_DT$GC,log(RC_DT$RC+0.01),cex=0.1,xlab="GC Content",ylab=expression(paste("log(NRC"["lib"],"+0.01)",sep="")))
lines(RC_DT$GC,predictions1,col = "red")
取残差,去除GC含量对深度的影响
#sustract the influence of GC
resi
RC_DT$RC
setkey(RC_DT,GC)
此时RC_DT$RC就是normalize之后的RC
画图显示nomalize之后的RC,并将拟合的loess曲线和normalize之后的数据保存
#plot scatter and line using Norm GC data
plot(RC_DT$GC,RC_DT$RC,cex=0.1,xlab="GC Content",ylab=expression("NRC"["GC"]))
gcCount.loess
save(gcCount.loess,file="/home/ywliao/project/Gengyan/gcCount.loess.Robject")
predictions2
lines(RC_DT$GC,predictions2,col="red")
save(RC_DT,file="/home/ywliao/project/Gengyan/RC_DT.Rdata")
当然,也想看一下amplicon 长度len 对RC的影响,不过影响不大
全部代码如下:
library(data.table)
load("/home/ywliao/project/Gengyan/RC_DT.Rdata")
####loess GC vs RC####
gcCount.loess
predictions1
#plot scatter and line
plot(RC_DT$GC,log(RC_DT$RC+0.01),cex=0.1,xlab="GC Content",ylab=expression(paste("log(NRC"["lib"],"+0.01)",sep="")))
lines(RC_DT$GC,predictions1,col = "red")
#sustract the influence of GC
resi
RC_DT$RC
setkey(RC_DT,GC)
#plot scatter and line using Norm GC data
plot(RC_DT$GC,RC_DT$RC,cex=0.1,xlab="GC Content",ylab=expression("NRC"["GC"]))
gcCount.loess
save(gcCount.loess,file="/home/ywliao/project/Gengyan/gcCount.loess.Robject")
predictions2
lines(RC_DT$GC,predictions2,col="red")
save(RC_DT,file="/home/ywliao/project/Gengyan/RC_DT.Rdata")
####loess len vs RC###
setkey(RC_DT,Len)
len.loess
predictions2
#plot scatter and line
plot(RC_DT$Len,RC_DT$RC,cex=0.1,xlab="Length",ylab=expression(paste("log(RC"["GC"],"+0.01)",sep="")))
lines(RC_DT$Len,predictions2,col = "red")