maSigpro建模代码分析之p.vector

前言

上一次我们说到了make.design.matrix,maSigpro建模代码分析之make.design.matrix
是如何构建建模所用的设计矩阵,那么这次我们将讨论下如何计算模型的p值,首先是计算模型回归系数总体显著性的函数p.vector()

基于上一个函数make.design.matrix我们得到了设计矩阵:

design <- make.design.matrix(edesign, degree = 3)

其中:


我们的对象design里面包含dis矩阵

并且我们的基因表达矩阵data为:


data

p.vector

首先,p.vector函数包括如下几个参数

p.vector <- function (data, design = NULL, Q = 0.05, MT.adjust = "BH", min.obs = 3, counts=FALSE, family=NULL, theta=10, epsilon=0.00001) 

显然我们的对象design是一个list:


design

在接下来的例子中,我们以”高斯分布“举例:

if (is.list(design)) {
  dis <- as.data.frame(design$dis)
  groups.vector <- design$groups.vector
  edesign <- design$edesign
}

#判断是否为高斯分布
if (is.null(family)) {
  if(!counts) { family=gaussian() }
  if(counts)  { family=negative.binomial(theta) }
}

#获得基因表达矩阵数据
min.obs = 3
dat <- as.matrix(data)
#去除NA值
dat <- na.omit(dat)
dat <- dat[, as.character(rownames(dis))]
G <- nrow(dat)
#这一步感觉像过滤表达量低的基因
count.na <- function(x) (length(x) - length(x[is.na(x)]))
dat <- dat[apply(dat, 1, count.na) >= min.obs, ]
#一共有1000个基因,g = 1000
g <- dim(dat)[1]
n <- dim(dat)[2]
p <- dim(dis)[2]
p.vector <- vector(mode = "numeric", length = g)

获得必要的基本信息以后就可以开始计算p值了,那么我们以高斯分布为例:

##对每一个基因进行多项式回归建模
for (i in 1:g) {
  # y为各个基因表达量
  y <- as.numeric(dat[i, ])
  div <- c(1:round(g/100)) * 100
  #由设计矩阵参数所得的多项式回归模型
  model.glm<- glm(y~.,data=dis , family="gaussian", epsilon=0.00001)
  if(model.glm$null.deviance==0){ 
    p.vector[i]=1 
  } else{
    # "1"(model.glm.0)代表的是对照组模型
    model.glm.0<-glm(y~1, family="gaussian", epsilon=0.00001)
    #计算p值
    test<-anova(model.glm.0,model.glm,test="F")
      if (is.na(test[6][2,1])) {
        p.vector[i]=1
      } else{
        p.vector[i]=test[6][2,1]
      }
   }
}

model.glm

其中model.glm<- glm(y~.,data=dis , family="gaussian",epsilon=0.00001)代表的是多项式回归方程模型,里面有各个多项式的回归系数

model.glm.0

其中model.glm.0<-glm(y~1, family="gaussian", epsilon=0.00001)代表的是原假设模型,即各个回归系数均为0

test

这里的p.vector代表的是两个模型model.glm和model.glm.0利用anova函数做F检验的结果,即检验多项式回归方程的各个回归系数总体显著性
之后根据p值来做矫正:

p.adjusted <- p.adjust(p.vector, method = "BH", n = length(p.vector))
#筛选出总体回归系数显著的基因
genes.selected <- rownames(dat)[which(p.adjusted <= 0.05)]

FDR <- sort(p.vector)[length(genes.selected)]

#SELEC即为我们筛选出的总体回归系数显著的基因
SELEC <- as.matrix(as.data.frame(dat)[genes.selected, ])
if (nrow(SELEC) == 0) 
  print("no significant genes")

p.vector <- as.matrix(p.vector)
rownames(p.vector) <- rownames(dat)
colnames(p.vector) <- c("p.value")

output <- list(SELEC, p.vector, p.adjusted, G, g, FDR, 
               nrow(SELEC), dis, dat, min.obs, 0.05, groups.vector, edesign, family)
names(output) <- c("SELEC", "p.vector", "p.adjusted", "G", 
                   "g", "FDR", "i", "dis", "dat", "min.obs", "Q", "groups.vector", 
                   "edesign", "family")
output

SELEC即为我们筛选出的总体回归系数显著的基因
那么最终的output主要是关于p值的相关的一些数据,这就是p.vector函数的主要作用,后续会根据p值对基因做一些筛选

下期预告:maSigpro建模代码分析之T.fit

你可能感兴趣的:(maSigpro建模代码分析之p.vector)