往期推荐
####----11_Lasso_Regression----####
rm(list = ls())
gc()
load('TCGA_STAD_data.RData')
library(dplyr)
library(tidyverse)
library(ggplot2)
library(survival)
library(glmnet) # 正则化技术
library(car) # 多重共线性检验
library(corrplot) # 相关性绘图
library(ggpubr) #基于ggplot2的可视化包ggpubr
library(patchwork) # 拼图
library(ROCR) # 画ROC曲线
library(caret) # 切割数据
Data <- data[,c(6,12:30917)]
Data$Status = ifelse(Data$Status =='Dead','1','0')
Data <- as.data.frame(lapply(Data,as.numeric))
### 数据检查
min(Data$month) # 查看最小值,看是否有0
Data2 <- filter(Data, Data$month > 0) # 删除数据框中time值小于0的样本,有0的话后续分析会报错
dataL <- Data2 # 数据备份
hist(dataL$FBLN5, main = 'Distribution of gene expression levels',
xlab = 'FBLN5', ylab = 'gene expression', col = 'skyblue') # 直方图
curve(dnorm(x, mean = mean(dataL$FBLN5), sd = sd(dataL$FBLN5)), add = TRUE, col = 'red') # 正态分布的概率密度函数
# shapiro-wilk检验
shapiro.test(dataL$FBLN5) # 适用于小样本数据,N≤50,若p值<0.05,则数据不符合正态分布
# Kolmogorov-Smirnov检验
ks.test(dataL$FBLN5, pnorm, mean = mean(dataL$FBLN5), sd = sd(dataL$FBLN5)) # 适用于大样本数据,N>50,若p值<0.05,则数据不符合正态分布
# 对所有列的数据进行Kolmogorov-Smirnov循环检验
ks_result <- data.frame('Gene' = character(), 'p.value' = numeric())
for (i in 3:length(colnames(dataL))){
p.value <- ks.test(dataL[,i], pnorm, mean = mean(dataL[,i]), sd = sd(dataL[,i]))$p.value
Gene <- colnames(dataL)[i]
tmp <- data.frame(Gene = Gene,
p.value = p.value)
ks_result <- rbind(ks_result, tmp)
}
max(ks_result$p.value) # 若p值<0.05,则数据不符合正态分布
cor_matrix <- cor(dataL[,3:12], use = 'everything', method = c('spearman'))
corrplot(cor_matrix, type = 'upper', method = 'color', tl.cex = 0.8, tl.col = 'black', order = 'AOE')
dataL2 <- dataL[,1:12]
model <- coxph(Surv(month, Status) ~ ., data = dataL2)
vif(model)
plot(vif(model),
xlim = c(0,10), ylim = c(0,10),
xlab = 'variables', ylab = 'VIF',
cex = 3, pch = 1)
# 当VIF大于5时,认为存在多重共线性,当VIF大于10时,认为存在严重的多重共线性
time <- dataL[,'month']status <- dataL[,'Status']x <- as.matrix(dataL[,-c(1,2)]) #x为输入特征,是矩阵格式y <- as.matrix(dataL$Status)lasso <- glmnet(x = x, y = y, family = 'binomial', alpha = 1, # alpha = 1为LASSO回归,= 0为岭回归,0和1之间则为弹性网络 nlambda = 100) # nlambda表示正则化路径中的个数,这个参数就可以起到一个阈值的作用,决定有多少基因的系数可以留下来。默认值为100。print(lasso)plot(lasso, xvar = 'lambda', label = TRUE) # 系数分布图,由“log-lambda”与变量系数作图,展示根据lambda的变化情况每一个特征的系数变化,展示了Lasso回归筛选变量的动态过程plot(lasso, xvar = 'dev', label = TRUE) # 也可以对%dev绘图plot(lasso, xvar = 'norm', label = TRUE) # “L1范数”与变量系数作图
set.seed(1234) # 设置种子数,保证每次得到的交叉验证图是一致的
# 计算100个λ,画图,筛选表现最好的λ值
lasso_cv <- cv.glmnet(x = x, y = y, family = 'binomial', alpha = 1, nlambda = 100) # 交叉验证,如果结果不理想,可以重新单独运行这一行代码,或者换一下种子数
plot(lasso_cv) # 纵坐标:部分似然偏差。上横坐标:当前的变量数。下横坐标:log(λ)
coef_lasso <- coef(lasso, s = 0.1) # 查看每个变量的回归系数。s为lasso回归的结果中的lambda值,选取相应的λ值可以得到相应数量的变量的回归系数
coef_lasso
set.seed(1234) # 设置种子数,保证每次得到的交叉验证图是一致的
# 计算100个λ,画图,筛选表现最好的λ值
lasso_cv <- cv.glmnet(x = x, y = y, family = 'binomial', alpha = 1, nlambda = 100) # 交叉验证,如果结果不理想,可以重新单独运行这一行代码,或者换一下种子数
plot(lasso_cv) # 纵坐标:部分似然偏差。上横坐标:当前的变量数。下横坐标:log(λ)
lambda <- lasso_cv$lambda.min
# lambda <- lasso_cv$lambda.1se
lambda
coef_lasso_cv <- coef(lasso, s = lambda) # 查看每个变量的回归系数。s为lasso回归结果中的lambda值,可以得到相应数量的变量的回归系数
coef_lasso_cv[,1][coef_lasso_cv[,1]!=0]
exp(coef_lasso_cv[,1][coef_lasso_cv[,1]!=0]) # 自然对数的指数函数,它的定义为exp(x) = e^x,其中e是自然对数的底数(约等于2.718),回归系数<0的exp>1,反之<1。
model_lasso_min <- glmnet(x = x, y = y, alpha = 1, lambda = lasso_cv$lambda.min)
# model_lasso_1se <- glmnet(x = x, y = y, alpha = 1, lambda = lasso_cv$lambda.1se)
# 这两个值体现在参数lambda上。有了模型,可以将筛选的基因挑出来了。
# 所有基因存放于model_lasso_min模型的子集beta中,用到的基因有一个s0值,没用的基因只记录了“.”,所以可以用下面代码挑出用到的基因。
model_lasso_min$beta[,1][model_lasso_min$beta[,1]!=0]
choose_gene_min = rownames(model_lasso_min$beta)[as.numeric(model_lasso_min$beta) != 0]
# choose_gene_1se = rownames(model_lasso_1se$beta)[as.numeric(model_lasso_1se$beta) != 0]
length(choose_gene_min)
# length(choose_gene_1se)
DCBLD2 NECAB2 ECH1 SERPINE1
0.0001176182 0.0050609354 0.0013001252 0.0076438492
PAPPA2 EGF IGFBP1 GPC3
0.0058767537 0.0017086554 0.0018483925 0.0031675436
SYN2 PRTG H3C14 U3
0.0046942426 0.0172503772 -0.0108994643 -0.0100155497
CTAGE11P AL355001.1 AL022316.1 PRDX3P2
0.0059144276 -0.0078457384 -0.0172823521 -0.0105412767
MTHFD1P1 AC002480.1 SCAT8 PWP2
-0.0035888050 0.0047360137 0.0010923467 0.0090971061
PTPRJ.AS1 HPR AL049839.2 SOWAHCP2
-0.0011330955 0.0002045581 0.0045504295 -0.0013408436
AC016583.2
0.0054207717
主要参考资料来自博客园,作者小高不高,链接:
https://www.cnblogs.com/xiaogaobugao/p/17131487.html。
联系客服