数据预处理:
#将表达谱数据的探针对应到基因,即将探针表达谱转化成基因的表达谱:
#芯片数据读入:
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()
聚类效果并不好