项目中一张Table需要基于Logistic回归模型,输出某事件发生的概率。该模型中,因变量为二分类资料,表示事件发生与否;自变量为定量资料。Table中需要输出,当自变量为特定值时,事件发生的概率以及对应的可信区间。

这篇文章简单介绍回归模型,然后分享Logistic回归模型预测概率的SAS程序实现。
我们常说的自变量(X)与因变量(Y)的关系是,自变量影响因变量,或者说因变量依赖于自变量。而回归模型的作用,就是使得自变量X与因变量Y间的关系得到量化、准确的描述。
常见的回归模型有线性回归、Logistic回归以及Cox回归。对于这3类回归,自变量X可以是数值变量、分类变量以及等级变量;而对于因变量Y,线性回归是数值变量,Logistic回归是分类变量,Cox回归是二分类+时间变量。
这3类回归中,线性回归是基础。Logistic回归与Cox回归是线性回归的扩展,即通过特定的变换(logit变换、Cox变换),转化为线性回归进行分析。
具体的模型介绍,可以参考相关的数理统计教材。
前面提到Loggistic回归的因变量是分类变量,包含3类:二分类变量、无序多分类变量、有序多分类变量。在日常分析中,因变量Y为二分类变量的情况居多,我们这次事件发生结果就是二分类变量。
二分类资料可以计算出“发病率”p、“未发病率”1-p。对于线性回归模型来说,因变量服从正态分布。而对于二分类资料,率的取值在0-1之间,不服从正态分布,不能直接应用线性回归模型。这时,对率进行logit变换:
loigt P = ln[P/(1-P)]
变换后,logitP的范围为 (-∞, +∞),服从正态分布,可以构建线性回归模型。Logistic回归模型定义为:

由于loigt P = ln[P/(1-P)],上式也可以等价写成:

这就是“发病率”P与自变量X的关系。根据现有数据可以估计出回归系数,建立回归方程。然后,将具体的自变量值代入方程,就可以获得其对应的事件发生概率的预测值。
在实际应用中,对于模型我们并不需要掌握得很深,只需知道如何应用就行。
下面进行SAS程序演示,选择SASHelp.class数据集作为演示数据集。不考虑实际意义,以二分类变量Sex作为因变量,Sex = “M”作为结果事件,数值变量Height作为自变量。
那么在各个Height取值下,发生Sex = “M”这个事件的预测发生概率以及对应的可信区间,实现程序如下:
proc logistic data = sashelp.class noprint;
model sex(event="M") = height;
output out = result predicted = pred lower = lcl upper = ucl;
run;
输出结果如下:

以上预测的概率值,是原始数据集中的各个Height值发生目标事件的预测概率。那么如何获取特定Height值对应的预测概率呢?例如,Height=59、69、79。
因为数据集中自变量的既有值不一定涵盖,想要分析的既定值。比如,当前数据集中就没有Height=79的数据。这就需要自己先构建自变量特定取值的记录,与原始数据集拼接,然后构建模型进行预测。
具体代码如下:
data tmp_pred;
do height = 59, 69, 79;
output;
end;
run;
data class;
set sashelp.class(in = a) tmp_pred(in = b);
if a then tmp_pred = 0;
if b then tmp_pred = 1;
run;
proc logistic data = class noprint;
model sex(event="M") = height;
output out = result predicted = pred lower = lcl upper = ucl;
run;
模型结果如下:

这样就获取了特定的Heigth值(59、69、79)的预测概率,我们可以看到原始数据集中也有Height=59、69的记录,新增记录与原始记录中的预测概率是相同的。
最后,整理输出结果时,只需筛选tmp_pred = 1的记录整理到Table中,即获取特定自变量值得预测值。这样就完成了自变量的既定取值对应的事件发生率的概率预测。
以上演示代码只涉及一个亚组的分析,若涉及多个亚组,需要使用by语句,例如by trt01pn paramcd;。演示模型中,自变量只纳入了一个数值变量,如果需要纳入数值变量,直接在模型中添加。如果纳入的自变量为分类变量,该变量需要在class语句中进行申明。
对模型的进一步理解,可以参考SAS官方文档中的这个例子,SAS Help Center: Example 74.2 Logistic Modeling with Categorical Predictors。
这篇文章简单介绍了回归模型的分类、二项Logistic回归模型的构建,演示了利用Logistic回归模型预测事件发生率的SAS程序实现。
这里有一点说明,在临床试验SAS编程工作中,对于程序员来讲,模型都是有统计师确定好的,程序员只需要将结果输出展现。如果对于构建模型感兴趣,可以参阅相关统计教材。
感谢阅读, 欢迎关注!
若有疑问,欢迎评论交流!
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/