如何在R中进行ma和loess标准化?

3

尝试在R中使用MA标准化(http://en.wikipedia.org/wiki/MA_plot)对两个变量xy进行loess拟合:

> x = rnorm(100) + 5
> y = x + 0.6 + rnorm(100)*0.8
> m = log2(x/y)
> a = 0.5*log(x*y)

我希望将x和y正规化,使平均值m为0,就像标准MA正规化一样,然后再计算出正确的x和y值。首先,在MA上运行loess:

> l = loess(m ~ a)

什么是获取更正的m值的方法?这正确吗?
> mc <- predict(l, a)
# original MA plot
> plot(a,m)
# corrected MA plot
> plot(a,m-mc)

我不清楚在loess对象中,predict实际上是做什么的,以及它与使用loess返回的l对象中的l$residuals有何不同 - 有人能解释一下吗? 最后,我如何根据这个校正来反推新的xy值?


谷歌搜索引擎会带你到 library(affy),它包含了 normalize.loessma.plot 函数。为什么不使用这个软件包来控制你的结果呢? - agstudy
@agstudy:没关系,但这个问题很简单,可以使用loess实现,无需额外的包。我想了解在R中如何使用loess拟合而不依赖于软件包。 - user248237
1个回答

0

首先,是的,您提出的方法可以得到更正后的m值。

关于预测函数:是的,l$residualsm - fitted(l)m-predict(l)都会给出相同的结果:更正后的m值。然而,predict函数更加通用:它将任何新值作为输入。如果您想仅使用数据子集来拟合loess,然后在整个数据上进行预测(例如,在使用spiked-in标准时),这将非常有用。

最后,如何基于此更正反向计算新的xy值?如果将数据转换为对数空间,通过创建两个新变量x1 <- log2(x)y1 <- log2(y),这将变得更容易。由于我们处于对数空间中,因此计算ma更简单:

  • m <- x1 - y1
  • a <- (x1 + y1)/2

现在,为了根据拟合的loess模型纠正您的数据,您可以更新x1y1,而不是通过mc修正来更新m变量。设置:

  • x1 <- x1 - mc / 2
  • y1 <- y1 + mc / 2

这个更新与更新m <- m - mc具有相同的效果(因为m将被重新计算为更新后的x1y1之间的差异),并且对a值没有影响。

要获取您的更正数据,请通过返回2^x12^y1进行转换。

这是 normalize.loess 函数的作者在 affy 包中使用的方法,最初在此处描述(并包括循环查看所有变量对的能力,而不是仅查看单个变量对):http://web.mit.edu/~r/current/arch/i386_linux26/lib/R/library/limma/html/normalizeCyclicLoess.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接