从基因表达谱数据到决策森林和随机网络和聚类热图

数据预处理:

#将表达谱数据的探针对应到基因,即将探针表达谱转化成基因的表达谱:

#芯片数据读入:

data<-read.table('GSE4498_series_matrix.txt',skip=74,sep='\t',row.names=1,header=T,fill=T)

#探针数据读入:

#我们用探针数据的第16行之后及它的第1与10列

anno_data<-read.table('ann.txt',skip=16,sep='\t',header=T,fill=T,quote='\"',row.names=1)

anno_data<-anno_data[,c(1,10)]

#因为重叠基因,有一个探针对应多个基因的情况,这种情况保留第一个基因

anno_data$Gene.Symbol2<-gsub(' .+$','',anno_data$Gene.Symbol)

#根据行名(探针名)合并探针数据和芯片数据

expr<-merge(anno_data[,c(1,3)],data,by=0)

#将基因表达矩阵的行名设为探针名

row.names(expr)<-expr[,1]

#去除无用信息

expr<-expr[-1:-2]

#可能有多个探针对应一个基因的情况,这时取平均值作为该基因的表达值

expr<-aggregate(expr[,2:23], list(expr$Gene.Symbol2), mean)

#保留可以被基因名注释的探针

expr<-expr[which(expr!=""),]

#求foldchange

expr$FC<-apply(expr[,2:23], 1, function(x){return(mean(x[1:12])/mean(x[13:22]))})

#保留|log2FC|>1的基因作为差异基因

expr <- expr[which(expr$FC>=2|expr$FC<=0.5),]

#将基因表达值由字符型改为数值型并转置

expr2 <- as.data.frame(apply(expr[ ,2:23], 1, as.numeric))

#列名改为基因名

colnames(expr2) <- expr$Group.1

#加上个体类别信息(吸烟与不吸烟)

expr2$Species <- as.factor(c(rep("N", 12), rep("P", 10)))

构建分类器:

决策森林:

#构建决策森林对trees_acc <- create_forest(2, expr2, 92, 11)

library(RWeka)

library(partykit)

library(caret)

#class_col是储存类别信息的列号

create_forest <- function(k_fold, data, class_col, n.fold){

#设置折叠数

k <- k_fold

#用列表储存分层折叠后的数据集

dataSet <- list()

#用列表储存构建的决策森林

forest <- list()

#储存每个树的准确度

acc <- c()

#将类别列的列名改为Species

colnames(data)[class_col] <- "Species"

#species_name储存类的名称

species_name <- names(table(data[,class_col]))

#class_num储存类的数量

class_num <- length(species_name)

#Species_num储存各类的数量

species_num <- as.numeric(table(data[,class_col]))

#分层折叠时以fold_index为参考索引

fold_index <- matrix(0, nrow=class_num, ncol=(k+1))

for(i in 1:class_num){

base_num <- species_num[i]%/%k

mod_num <- species_num[i]%%k

fold_index[i, 1] <- 1

for(j in 2:(k+1)){

if(j <= mod_num){

fold_index[i, j] <- fold_index[i, j-1] + base_num + 1

}

else{

fold_index[i, j] <- fold_index[i, j-1] + base_num

}

}

}

#分层折叠

#将混乱的索引按类储存进列表

for(n in 1:n.fold){

index <- list()

for(i in 1:class_num){

index[[i]] <- sample(which(data[,class_col]==species_name[i]),

length(which(data[,class_col]==species_name[i])),

replace=FALSE)

}

#将分层折叠的数据存入dataSet

for(i in 1:k){

dataSet[[i]] <- data[1,]

for(j in 1:class_num){

dataSet[[i]] <- rbind(dataSet[[i]],

data[index[[j]][fold_index[j,i]:(fold_index[j,i+1]-1)],])

}

dataSet[[i]] <- dataSet[[i]][-1, ]

}

#i为检验集,其他为训练集,构造决策树

for(i in 1:k){

test <- dataSet[[i]]

left <- dataSet[-i]

train <- test[1, ]

for(j in 1:length(left)){

train <- rbind(train, left[[j]])

}

train <- train[-1, ]

treeC4.5 <- J48(Species~., data=train)

forest[[i+(n-1)*k]] <- treeC4.5

acc[i+(n-1)*k] <- confusionMatrix(predict(treeC4.5, newdata=test),

test$Species)$overall[1]

}

}

#返回决策森林与树的准确率

return(list(forest, acc))

}


#用构造的森林预测样本的类别

myfun <- function(x){

return(names(x)[which.max(x)])

}

mypre <- function(trees_acc, data, class_col){

species <- names(table(data[,class_col]))

forest <- trees_acc[[1]]

acc <- trees_acc[[2]]

nrows <- nrow(data)

result <- c()

#得分矩阵,行是样本,一列代表一个类的得分,与CART树的预测结果类似

pre_score <- matrix(0, nrows*length(species), nrow=nrows, ncol=length(species))

colnames(pre_score) <- species

#每个树对所有样本预测

for(i in 1:length(forest)){

pre <- predict(forest[[i]], newdata=data)

#根据决策树的准确率来打分,每次预测后,更新得分矩阵

for(j in 1:nrows){

pre_score[j, pre[j]] <- pre_score[j, pre[j]] + acc[i]

}

}

#选得分最高的那个类作为预测的类

result <- apply(pre_score, 1, myfun)

return(as.factor(result))

}

#用原数据集对决策森林进行检验

trees_acc <- create_forest(2, expr2, 92, 11)

result <- mypre(trees_acc, expr2, 92)

confusionMatrix(result, expr2$Species)样本预测

#样本量太少了,所以准确率比较高




神经网络:

library(AMORE)

library(nnet)

#将类别信息转换为输出层形式

label <- class.ind(expr2$Species)

#构建神经网络(输入层:91,隐层:10,输出层:2)

netframe <- newff(n.neurons=c(ncol(expr2[,-92]), 10, ncol(label)),

learning.rate.global=1e-4, momentum.global=0.001,

error.criterium="LMS", Stao=NA, hidden.layer="sigmoid",

method="ADAPTgdwm")

#用原数据训练神经网络

bpnet <- train(netframe, expr2[,-92], label, error.LMS, report=T,

n.shows=20, show.step=500)

#对原数据进行预测

pre <- sim(bpnet$net, expr2[,-92])

colnames(pre) <- colnames(label)

myfun <- function(x){

return(names(x)[which.max(x)])

}

pre <- as.factor(apply(pre, 1, myfun))

confusionMatrix(expr2$Species, pre)


聚类热图:

library(pheatmap)

pdf("lll.pdf")

pheatmap(expr[2:23])

dev.off()



聚类效果并不好

你可能感兴趣的:(从基因表达谱数据到决策森林和随机网络和聚类热图)