当前位置:   article > 正文

生信文章复现学习 PMID:36898287(二)_svmrfe函数用法k=10, halve.above=100

svmrfe函数用法k=10, halve.above=100

原文框架

继续上文,这次先补充一个原文框架:

上文复现了DEG和WGCNA之后,与原文章有出入,最后我借用sangerbox工具取交集,选出210个gene进行LASSO和SVM分析,继续筛选核心基因,其实可以使用更多的机器学习办法,如随机森林和Xgboost。目前生信的工具很多,仙桃,GEPIA,大家活学活用就好。

LASSO回归

  1. rm(list = ls())
  2. library(tidyr)
  3. library(dplyr)
  4. library(tibble)
  5. library(data.table)
  6. #############################数据准备#####################
  7. setwd("D:\\BioR\\new\\NAFLD_Bio\\03intersect")
  8. intergene <- read.csv('vennData.csv',header = T)
  9. load('D:\\BioR\\new\\NAFLD_Bio\\01preprocess\\ex_ma.Rdata')
  10. ex_ma2 <- rownames_to_column(ex_ma,'gene')
  11. interexpr <- ex_ma[ex_ma2$gene %in% intergene$gene,]
  12. ##(2)读取分组信息,来自GEO
  13. group <- fread("group.txt",data.table = F)
  14. library(stringr)
  15. ##观察分组信息,发现‘_’为分隔,采用split函数分开字符串,并取第二个
  16. group$group2=trimws(str_split(group$group,'_',simplify = T)[,2])
  17. table(group$group2)
  18. ##此处提取HC和SS的分组信息,grep和grepl都可以,grep是提取包含某一或某些字符的行
  19. ##提取group2列里包含HC或者SS的行
  20. groupf <-group[grep('HC|SS',group$group2),]
  21. save(groupf,file='D:\\BioR\\new\\NAFLD_Bio\\01preprocess\\group.Rdata')
  22. groupf <- groupf[,-2]
  23. interexpr2 <- as.data.frame(t(interexpr))
  24. interexpr2 <- rownames_to_column(interexpr2,'symbol')
  25. interexpr2 <- merge(interexpr2,groupf,by='symbol')
  26. interexpr2 <- interexpr2[,c(1,212,2:211)] ##调换列的顺序,把分组信息放到第二列
  27. interexpr2 <- interexpr2[,-1]
  28. interexpr2$group2 <- ifelse(interexpr2$group2=='SS',1,0)
  29. ############################机器学习筛选核心基因#############################
  30. library(randomForestSRC)
  31. library(tidyverse)
  32. library(ggplot2)
  33. library(ggvenn)
  34. library(glmnet)
  35. #####################LASSO#############
  36. rt <- interexpr2
  37. x=as.matrix(rt[,c(2:ncol(rt))])
  38. y=data.matrix(rt$group2)
  39. library(caret)
  40. library(VennDiagram)
  41. fit = glmnet(x, y, family = "binomial", alpha = 1, lambda = NULL)
  42. # 绘制LASSO回归曲线图
  43. pdf("1A_lasso.pdf", width = 30, height = 15)
  44. plot(fit, xvar = "dev", label = TRUE)
  45. dev.off()
  46. #绘制LASSO回归10折交叉验证图
  47. cvfit = cv.glmnet(x, y,
  48. nfold=10,
  49. family = "binomial", type.measure = "class")
  50. pdf("2cvfit.pdf")
  51. plot(cvfit)
  52. dev.off()
  53. #查看最佳lambda
  54. cvfit$lambda.min
  55. # 获取LASSO选出来的特征
  56. myCoefs <- coef(cvfit, s="lambda.min")
  57. lasso_fea <- myCoefs@Dimnames[[1]][which(myCoefs != 0 )]
  58. (lasso_fea <- lasso_fea[-1])
  59. # 把lasso找到的特征保存到文件
  60. write.csv(lasso_fea,"3feature_lasso.csv")

LASSO回归结果和原文差别不小,我注意到原文四个基因都在那210个基因中,但是LASSO只选出了6个,其中只有2个基因和原文一致,LASSO具体参数尚不清楚。

 

FOSBMYCC13orf15THBS1SOCS2RFXDC2

SVM-RFE算法

  1. ##############随机森林#############
  2. library(e1071)
  3. source("D:\\BioR\\new\\NAFLD_Bio\\03intersect\\msvmRFE.R")
  4. input <- interexpr2
  5. ##############################
  6. library(caret)
  7. library(VennDiagram)
  8. input <- interexpr2
  9. #采用五折交叉验证 (k-fold crossValidation)
  10. svmRFE(input, k = 5, halve.above = 100) #分割数据,分配随机数
  11. nfold = 5
  12. nrows = nrow(input)
  13. folds = rep(1:nfold, len=nrows)[sample(nrows)]
  14. folds = lapply(1:nfold, function(x) which(folds == x))
  15. results = lapply(folds, svmRFE.wrap, input, k=5, halve.above=100) #特征选择
  16. top.features = WriteFeatures(results, input, save=F) #查看主要变量
  17. head(top.features)
  18. #把SVM-REF找到的特征保存到文件
  19. write.csv(top.features,"4feature_svm.csv")
  20. # 选前300个变量进行SVM模型构建,选取的变量越多,运行速度越慢!
  21. featsweep = lapply(1:40, FeatSweep.wrap, results, input) #40个变量
  22. # 画图
  23. no.info = min(prop.table(table(input[,1])))
  24. errors = sapply(featsweep, function(x) ifelse(is.null(x), NA, x$error))
  25. #绘制基于SVM-REF算法的错误率曲线图
  26. pdf("5B_svm-error.pdf",width = 5,height = 5)
  27. PlotErrors(errors, no.info=no.info) #查看错误率
  28. dev.off()
  29. #绘制基于SVM-REF算法的正确率曲线图
  30. #dev.new(width=4, height=4, bg='white')
  31. pdf("6B_svm-accuracy.pdf",width = 5,height = 5)
  32. Plotaccuracy(1-errors,no.info=no.info) #查看准确率
  33. dev.off()
  34. # 图中红色圆圈所在的位置,即错误率最低点
  35. which.min(errors)
  36. #比较lasso和SVM-REF方法一找出的特征变量,画Venn图
  37. (myoverlap <- intersect(lasso_fea, top.features[1:which.min(errors), "FeatureName"])) #交集
  38. #统计交叉基因有多少个
  39. summary(lasso_fea%in%top.features[1:which.min(errors), "FeatureName"])
  40. #绘制venn图
  41. pdf("7C_lasso_SVM_venn.pdf", width = 15, height = 8)
  42. grid.newpage()
  43. venn.plot<-venn.diagram(list(LASSO=lasso_fea, SVM_RFE=as.character(top.features[1:which.min(errors),"FeatureName"])), NULL,
  44. fill = c("#E31A1C","#E7B800"),
  45. alpha = c(0.5,0.5), cex = 4, cat.fontface=3,
  46. category.names = c("LASSO", "SVM_RFE"),
  47. main = "Overlap")
  48. grid.draw(venn.plot)
  49. dev.off()

取前38个基因和LASSO取交集,只有SOCS2和FOSB和原文一致,SVM估计参数也不一样,恳请指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/444368
推荐阅读
相关标签
  

闽ICP备14008679号