二、为什么需要用 Lasso + Cox 生存分析模式一般我们在筛选影响患者预后的变量时,通常先进行单因素Cox分析筛选出关联的变量,然后构建多因素模型进一步确认变量与生存的关联是否独立。
但这种做法没有考虑到变量之间多重共线性的影响,有时候我们甚至会发现单因素和多因素Cox回归得到的风险比是矛盾的,这是变量之间多重共线性导致模型 失真的结果。并且,当变量个数大于样本量时(例如筛选影响预后的基因或突变位点,候选的变量数可能远超样本个数),此时传统的Cox回归的逐步回归、前 进法、后退法等变量筛选方法都不再适用。
因此,当变量之间存在多重共线性或者变量个数大于样本量时,需要用Lasso(Least absolute shrinkage and selection operator)回归首先进行变量的筛选,然后构建Cox回归模型分析预后影响,这就是Lasso + Cox 生存分析模式。
三、什么是 Lasso + Cox 生存分析模式Lasso可以在模型参数估计的同时实现变量的选择,能够较好的解决回归分析中的多重共线性问题,并且能够很好的解释结果。Lasso回归算法使用L1范数进行收缩惩罚,对一些对于因变量贡献不大的变量系数进行罚分矫正,将一些不太重要的变量的系数压缩为0,保留重要变量的系数大于0,以减少Cox回归中协变量的个数。
5.7+生信文章复现(五):单因素cox+lasso筛选预后相关DEGs
load("G:/r/duqiang_IPF/GSE70866_metainformation_4_platforms/3_ipf_combined_cox_univariate_Adjuste_for_age_sex.RData")
head(cox_results)
rownames(cox_results)
cox_results2=cox_results %>% as.data.frame() %>% filter(p<0.05)

identical(colnames(exprSet),rownames(phe))
x=exprSet[rownames(exprSet) %in% rownames(cox_results2),]
x=t(x)
dim(x)
y=phe %>%select('time','event')
head(y)[1:4,1:2]
head(x)[1:4,1:4]

#构建模型
y=data.matrix(Surv(time=y$time,
event= y$event))
head(y)
head(x)[1:4,1:5]

fit <- glmnet(x, y, family = 'cox', type.measure = "deviance", nfolds = 10)
plot(fit,xvar = 'lambda',label = T) #候选DEHGs的lasso系数

#十折交叉检验筛选最佳lambda:
set.seed(007)
lasso_fit <- cv.glmnet(x, y, family = 'cox', type.measure = 'deviance', nfolds = 10)

#提取最佳λ值(这里选择1se对应lambda):
lambda.1se <- lasso_fit$lambda.1se
lasso_fit$lambda.min
lambda.1se #[1] 0.2617315
model_lasso_1se <- glmnet(x, y, family = 'cox',
type.measure = 'deviance', nfolds = 10,
lambda = lambda.1se)
#拎出建模使用基因:
gene_1se <- rownames(model_lasso_1se$beta)[as.numeric(model_lasso_1se$beta)!=0]#as.numeric后"."会转化为0
gene_1se #筛选出5个 #"HS3ST1" "MRVI1" "TPST1" "SOD3" "S100A14"
library(dplyr)
#save(phe,phe_final_3,exprSet,cox_results,file = "G:/r/duqiang_IPF/GSE70866_metainformation_4_platforms/3_ipf_combined_cox_univariate_Adjuste_for_age_sex.RData")
load("G:/r/duqiang_IPF/GSE70866_metainformation_4_platforms/3_ipf_combined_cox_univariate_Adjuste_for_age_sex.RData")
head(cox_results)
rownames(cox_results)
cox_results2=cox_results %>% as.data.frame() %>% filter(p<0.05)
getElement(cox_results,"p")
cox_results['p']
head(cox_results)
dim(cox_results)
head(exprSet)
dim(exprSet)
dim(phe)
head(phe)
identical(colnames(exprSet),rownames(phe))
x=exprSet[rownames(exprSet) %in% rownames(cox_results2),]
x=t(x)
dim(x)
y=phe %>%select('time','event')
head(y)[1:4,1:2]
head(x)[1:4,1:4]
table(y$time==0)
#OS单位从天转换为年: 是否转换成年不影响结果
if(1==1){
y$time <- round(y$time/365,5) #单位年,保留5位小数 time不可以有0
head(y)
}
#构建模型
y=data.matrix(Surv(time=y$time,
event= y$event))
head(y)
head(x)[1:4,1:5]
fit <- glmnet(x, y, family = 'cox', type.measure = "deviance", nfolds = 10)
plot(fit,xvar = 'lambda',label = T) #候选DEHGs的lasso系数
head(coef(fit))
#十折交叉检验筛选最佳lambda:
set.seed(007)
lasso_fit <- cv.glmnet(x, y, family = 'cox', type.measure = 'deviance', nfolds = 10)
plot(lasso_fit)
lasso_fit
head(coef(lasso_fit))
rownames(lasso_fit$beta)[as.numeric(lasso_fit$beta)>0]
#提取最佳λ值(这里选择1se对应lambda):
lambda.1se <- lasso_fit$lambda.1se
lasso_fit$lambda.min
lambda.1se #[1] 0.2617315
#使用1se的lambda重新建模:
model_lasso_1se <- glmnet(x, y, family = 'cox',
type.measure = 'deviance', nfolds = 10,
lambda = lambda.1se)
head(model_lasso_1se)
head(coef(model_lasso_1se))
#拎出建模使用基因:
gene_1se <- rownames(model_lasso_1se$beta)[as.numeric(model_lasso_1se$beta)!=0]#as.numeric后"."会转化为0
gene_1se #筛选出5个 #"HS3ST1" "MRVI1" "TPST1" "SOD3" "S100A14"


一、LASSO简要介绍
随着科技的进步,收集数据的技术也有了很大的发展。因此如何有效地从数据中挖掘出有用的信息也越来越受到人们的关注。统计建模无疑是目前处理这一问题的最有效的手段之一。在模型建立之初,为了尽量减小因缺少重要自变量而出现的模型偏差,人们通常会选择尽可能多的自变量。但实际建模过程中通常需要寻找对响应变量最具有解释性的自变量子集—即模型选择(或称变量选择、特征选择),以提高模型的解释性和预测精度。所以模型选择在统计建模过程中是极其重要的问题。
Lasso(Least absolute shrinkage and selection operator, Tibshirani(1996))方法是一种压缩估计。它通过构造一个罚函数得到一个较为精炼的模型,使得它压缩一些系数,同时设定一些系数为零。因此保留了子集收缩的优点,是一种处理具有复共线性数据的有偏估计。
Lasso 的基本思想是在回归系数的绝对值之和小于一个常数的约束条件下,使残差平方和最小化,从而能够产生某些严格等于0 的回归系数,得到可以解释的模型。R的Lars 算法的软件包提供了Lasso编程,我们根据模型改进的需要,可以给出Lasso算法,并利用AIC准则和BIC准则给统计模型的变量做一个截断,进而达到降维的目的。因此,我们通过研究Lasso可以将其更好的应用到变量选择中去。
说简单点:在回归分析中因素筛选主要用到逐步回归stepwise、向前、向后等等方法,这些方法比较传统,而对于共线性问题比较严重的数据,或者变量个数大于观测值个数例如基因测序数据,基因个数远大于观测值个数(病人数),上述传统方法不合适,而Lasso 方法就是为了解决上述问题而生,它提供了一种新的变量筛选算法,可以很好的解决共线性问题,对于我们平常做的回归分析,如果大家觉得用普通的方法筛选到的变量不理想,自己想要的变量没有筛选到,可以用此方法试一试,具体流程是先在R软件中用此方法筛选出变量,之后对筛选出的变量再做COX回归或者其他回归分析。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA