哈雷尔“韵文”简介:使用Hmisc和rms包的预测建模


这篇帖子是为了介绍辛辛那提儿童医院医疗中心R用户组 (CCHMC-RUG)Frank Harrell提供的一些功能赫米斯克rms(有效值)数据描述和预测建模包。对于那些以前使用过这些包的人,希望我们将介绍一些新的内容。哈雷尔博士是范德比尔特大学生物统计学系的创始主席(直至2017年),美国统计协会会员R基金会在他的范德比尔特大学可以找到他的完整传记和众多成就和荣誉列表网页.

我给帖子起了标题哈雷尔“诗句”简介,因为就像tidyverse一样,这些包对R社区来说是一个巨大的资源;共享底层语法和数据结构;并反映了开发商的理念。我也喜欢这个词哈雷尔“诗”因为Hmisc和rms软件包将用户链接到更广泛的现代统计方法和计算材料集,包括预测建模、估计、假设检验和研究设计。我不知道他是如何抽出时间来开发这些丰富而密集的资源,并在社交媒体和其他地方分享他的想法的,但他对开源软件的贡献和对统计方法应用的洞察力非常值得赞赏!这些材料的链接可以在他的网页一些亮点包括:


我此次RUG会议的目标是向您简要介绍Hmisc和rms包的一些功能,我认为任何在R中执行统计建模的人都会感兴趣。这些示例显示在高级并不是为了证明模型构建和验证等方面的“最佳实践”。它们只是用来展示一些工具,这些包可以帮助您在哈雷尔“诗”.

下面,我将介绍这些包中的各种函数,作为五个提示“提示”只需简单介绍一下Hmisc和rms可以实现的功能,但我希望借此强调,在拟合广义线性模型、可视化拟合模型以及使用这些包进行预测和验证时,如何更容易地合并模型复杂性。涵盖的主题包括:

  1. 使用Hmisc检查您的数据
  2. 回归建模允许rms的复杂性
  3. 使用rms::validate()和rms:calibrate()验证拟合模型
  4. 带有rms::pentrace()的惩罚回归
  5. 除OLS以外的连续或半连续Y(rms)模型


我强烈推荐阅读哈雷尔教授的回归建模策略教科书(第二版)和课程笔记以了解更多信息。这两种文本都提供了详细的代码和解释教科书的第6章专门讨论R和rms包.

以下示例中使用的数据来自UCI机器学习库(https://archive.ics.uci.edu/ml/datasets/Wine网站)可以通过James Balamuta上的ucidata R包访问github存储库。我们将试图从一组13种特征中预测葡萄酒是红葡萄酒还是白葡萄酒。UCI网站上的数据集描述如下。

数据集信息:这些数据是对产于意大利同一地区但来自三个不同品种的葡萄酒进行化学分析的结果。分析确定了三种葡萄酒中每种葡萄酒中发现的13种成分的数量。我认为初始数据集大约有30个变量,但出于某种原因,我只有13维版本。我有一个30个左右变量的列表,但是a)我把它弄丢了,b)我不知道集合中包括了哪13个变量。这些属性是(由Riccardo Leardi、riclea“@”anchem.unige.it提供)1) 酒精2) 苹果酸3) 灰烬4) 灰分的碱性5) 镁6) 总酚类7) Flavanoids公司8) 非黄酮类酚类9) 原花青素类10) 颜色强度11) 色调12) 稀释葡萄酒的OD280/OD31513) 脯氨酸在分类上下文中,这是一个“表现良好”的类结构的良好问题。对于新分类器的首次测试来说,这是一个很好的数据集,但不是很有挑战性。属性信息:所有属性都是连续的



安装和加载软件包

#从github安装ucidata包#devtools::install_github(“无涂层/ucidata”)#加载程序包图书馆(“tidyverse”);软件包版本(“tidyverse”)
## [1] '1.3.0'
库(“rms”);包版本(“rms”)
## [1] '6.0.1'
图书馆(“ucidata”);软件包版本(“ucidata”)
## [1] '0.0.3'
图书馆(“cowplot”);软件包版本(“cowplot”)
## [1] '1.1.0'



加载示例数据集

既然ucidata包已经加载,我们可以使用基本R函数data()调用wine数据集。我们还将为red_wine创建一个二进制指示符,作为结果变量,其中“红酒”==1,“白葡萄酒”==0。使用dplyr::select()从data.frame中删除变量“color”。

#加载葡萄酒数据数据(葡萄酒)#重新编码结果mydata<-葡萄酒%>%dplyr::mutate(red_wine=ifelse(color==“red”,1,0))%>%dplyr::选择(-color)



提示1。使用Hmisc检查您的数据

Hmisc包具有一些出色的功能,可以帮助您了解变量分布、类别变量级别、缺失值数量等方面的数据。它还具有一些非常有用的命令,可以帮助可视化此信息。下面是我最常用的几个函数。


Hmisc::describe()

描述是一个非常方便的函数,它允许……如您所料……描述一个data.frame。它将提供有关计数、缺失值数量和不同值的信息,并描述和绘制连续值的分布。对于分类变量,还提供了级别和计数的数量。我发现自己首先使用该函数来查找data.frame中不可信的值,了解缺失数据的程度,并快速访问一组预测值的特定分位数。下面的代码将生成并绘制此信息。提供了html选项以改进格式。

d<-Hmisc::描述(mydata)html(d,大小=80,滚动=TRUE)
我的数据

13个变量6497次观察

固定酸度
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
649701060.9997.2151.325.766.477.78.89.8
最低的 : 3.8 3.9 4.2 4.4 4.5 ,最高:14.3 15.0 15.5 15.6 15.9
挥发酸
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
649701870.9990.33970.17160.160.180.230.290.400.590.67
最低的 : 0.080 0.085 0.090 0.100 0.105 ,最高: 1.180 1.185 1.240 1.330 1.580
柠檬酸
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
64970890.9990.31860.15710.050.140.250.310.390.490.56
最低的 : 0.00 0.01 0.02 0.03 0.04 ,最高: 0.91 0.99 1.00 1.23 1.66
残余糖
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
6497031615.4434.9581.21.31.838.11315
最低的 : 0.60 0.70 0.80 0.90 0.95 ,最高: 22.60 23.50 26.05 31.60 65.80
氯化物
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
6497021410.056030.028690.0280.0310.0380.0470.0650.0860.102
最低的 : 0.009 0.012 0.013 0.014 0.015 ,最高: 0.422 0.464 0.467 0.610 0.611
游离硫氧化物
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
64970135130.5319.51691729415461
最低的 : 1.0 2.0 3.0 4.0 5.0 ,最高: 128.0 131.0 138.5 146.5 289.0
硫氧化物总量
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
649702761115.764.31193077118156188206
最低的 : 6.0 7.0 8.0 9.0 10.0 ,最高: 307.5 313.0 344.0 366.5 440.0
密度
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
6497099810.99470.0033880.98990.99070.99230.99490.99700.99840.9994
最低的 : 0.98711 0.98713 0.98722 0.98740 0.98742 ,最高: 1.00315 1.00320 1.00369 1.01030 1.03898
酸碱度
形象
n个丢失的不同的信息平均值Gmd公司.05.10.25.50.75.90.95
6497010813.2190.18022.973.023.113.213.323.423.50
最低的 : 2.72 2.74 2.77 2.79 2.80 ,最高: 3.81 3.82 3.85 3.90 4.01
硫酸盐
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
649701110.9990.53130.15560.350.370.430.510.600.720.79
最低的 : 0.22 0.23 0.25 0.26 0.27 ,最高: 1.61 1.62 1.95 1.98 2.00
酒精
形象
n个丢失的不同的信息平均值总经理.05.10.25.50.75.90.95
649701110.99910.491.34899.19.510.311.312.312.7
最低的 : 8.00 8.40 8.50 8.60 8.70 ,最高: 13.90 14.00 14.05 14.20 14.90
质量
形象
n个丢失的不同的信息平均值总经理
6497070.8775.8180.9233
最低的 : 3 4 5 6 7 ,最高: 5 6 7 8 9
值3 4 5 6 7 8 9频率30 216 2138 2836 1079 193 5比例0.005 0.033 0.329 0.437 0.166 0.030 0.001

红葡萄酒
n个丢失的不同的信息总和平均值总经理
6497020.55715990.24610.3711


正如您所看到的,许多有用的描述性信息被打印到控制台。您可以使用下面的绘图命令分别绘制这些预测值的直方图。

p<-图(d)p$连续



Hmisc::summaryM()获取按结果分层的预测因子表

Hmisc::summaryM()总结了S公式中列出的变量,计算描述性统计数据,并可选地进行组间差异的统计测试。当存在多个左手端变量,且这些变量独立于由单个右手端变量标记的组时,通常使用此函数(来自帮助).

我发现summaryM可以为手稿生成“表1”提供一个很好的“开端”。然而,当通过test=TRUE选项提供无条件测试表时,应该考虑传递的信息。当无条件和有条件估计值同时出现时,两者之间的差异可能会导致混淆(或者至少可能最终需要更长的解释时间)。此外,如果研究不是专门设计用来测试这些因素的,人们应该认真考虑是否包括正式测试(以及p值是否确实提供了有用的信息)。我在这里包括test=TRUE选项只是为了突出显示此功能。

s<-Hmisc::summaryM(固定酸度+挥发性酸度+柠檬酸+残余糖+氯化物+游离硫二氧化物+总硫氧化物+密度+pH值+硫酸盐+酒精+质量~红葡萄酒,数据=mydata,整体=真,测试=真,连续=5)html(s,caption='根据葡萄酒类型预测',exclude1=真,npct=“两者”,数字=2,prmsd=真,brmsd=假,msdsize=μ$小2)
根据葡萄酒类型预测。
0
N=4898
1
N=1599
组合
牛顿=6497
测试统计
固定酸度 6.30 6.80 7.30
6.85±0.84
7.10 7.90 9.20
8.32 ± 1.74
6.40 7.00 7.70
7.22 ± 1.30
F类16495=1421,P<0.001
挥发酸 0.21 0.26 0.32
0.28±0.10
0.39 0.52 0.64
0.53 ± 0.18
0.23 0.29 0.40
0.34 ± 0.16
F类16495=3637,P<0.001
柠檬酸 0.27 0.32 0.39
0.33 ± 0.12
0.09 0.26 0.42
0.27 ± 0.19
0.25 0.31 0.39
0.32 ± 0.15
F类16495=173,P<0.001
残余糖 1.7 5.2 9.9
6.4 ± 5.1
1.9 2.2 2.6
2.5 ± 1.4
1.8 3.0 8.1
5.4 ± 4.8
F类16495=458,P<0.001
氯化物 0.036 0.043 0.050
0.046 ± 0.022
0.070 0.079 0.090
0.087±0.047
0.038 0.047 0.065
0.056 ± 0.035
F类16495=5156,P<0.001
游离硫氧化物 23 34 46
35 ± 17
7 14 21
16±10
17 29 41
31 ± 18
F类16495=2409,P<0.001
硫氧化物总量 108 134 167
138 ±  42
22 38 62
46 ±  33
77 118 156
116 ±  57
F类16495=5473,P<0.001
密度 0.9917 0.9937 0.9961
0.9940 ± 0.0030
0.9956 0.9968 0.9978
0.9967 ± 0.0019
0.9923 0.9949 0.9970
0.9947 ± 0.0030
F类16495=1300,P<0.001
酸碱度 3.09 3.18 3.28
3.19 ± 0.15
3.21 3.31 3.40
3.31 ± 0.15
3.11 3.21 3.32
3.22 ± 0.16
F类16495=829,P<0.001
硫酸盐 0.41 0.47 0.55
0.49 ± 0.11
0.55 0.62 0.73
0.66 ± 0.17
0.43 0.51 0.60
0.53 ± 0.15
F类16495=2101,P<0.001
酒精 9.5 10.4 11.4
10.5 ±  1.2
9.5 10.2 11.1
10.4 ±  1.1
9.5 10.3 11.3
10.5 ±  1.2
F类16495=1.8,P=0.18
质量 5.00 6.00 6.00
5.88 ± 0.89
5.00 6.00 6.00
5.64 ± 0.81
5.00 6.00 6.00
5.82 ± 0.87
F类16495=100,P<0.001
b条 c(c)代表下四分位数,中位数b条和上四分位数c(c)对于连续变量。x±s代表X(X)±1标准偏差。
使用的测试:威尔科森测试。



使用Hmisc::histSpikeg()、ggplot和cowplot添加直方图

哈雷尔博士的histSpikeg函数提供了一种非常强大的方法来可视化连续预测值和二进制结果之间的单变量关联。它通过将连续的x变量分为等宽箱,然后计算并绘制每个箱中Y的频率计数来实现这一点。然后,该函数将比例显示为垂直直方图,并用一条较低的曲线拟合该图。histSpikeg允许将此功能添加为ggplot层。

在这里,我用克劳斯·威尔克的cowplot包plot_grid()功能。

dd<-datadist(我的数据)选项(datadist=“dd”)a<-ggplot(mydata,aes(x=酒精,y=红酒))+Hmisc::histSpikeg(红酒~酒精,lowess=TRUE,数据=mydata)+实验室(x=“酒精含量”,y=“概率(红酒)”)b<-ggplot(mydata,aes(x=柠檬酸,y=红葡萄酒))+Hmisc::histSpikeg(red_wine~柠檬酸,lowess=TRUE,data=mydata)+labs(x=“柠檬酸”,y=“概率(红酒)”)c<-ggplot(mydata,aes(x=硫酸盐,y=红葡萄酒))+Hmisc::histSpikeg(红酒~硫酸盐,lowess=TRUE,data=mydata)+labs(x=“\n硫酸盐”,y=“概率(红酒)\n”)cowplot::plot_grid(a,b,c,nrow=1,ncol=3,scale=.9,labels=“AUTO”)


这些图表明,考虑到线性模型方程右侧的复杂性/灵活性,可以提高性能。然而,哈雷尔博士认为(令人信服的是,国际海事组织),包括连续预报器的非线性项通常应该是默认做法,因为1。)真正的线性函数形式可能比规则(至少对大多数生物医学现象而言)更符合预期,2。)你可能会获得更多的成功,并“错过小机会”当包含非线性项时,如果真实关联碰巧是线性的,而不是如果真实关联是高度非线性的,并且使用简单的线性项对关联进行建模(即,将线性项与u形关联相匹配,从而降低模型性能)。当然,成本是一些模型的自由度和过拟合的可能性……我们稍后再讨论。



使用Hmisc::naplot和Hmisc:::naclus可视化缺失数据的模式

虽然这些数据中没有缺失值,但Hmisc包有几个很好的功能,可以评估和可视化缺失数据的程度以及变量之间缺失数据的模式。在这里,我们将使用dplyr::mutate()函数将一些值设置为missing。然后使用naplot函数绘制数据集中每个变量的缺失值比例,并使用naclus函数评估变量之间的“缺失”模式。这些信息可以非常有助于理解为什么值可能会丢失,并为插补策略提供信息。

虽然在本例中无需插补缺失值,但Hmisc::aregImpute函数提供了一种通过多重插补处理缺失数据的严格方法,该方法使用具有各种自举、预测平均值匹配选项的加性回归进行多重插补。然后,可以通过fit.mult.impute函数使用Rubin规则对多重插补进行适当组合。此函数也可用于Stef van Buuren的输出MICE套装.

缺少df<-mydata%>%dplyr::突变(固定酸度=ifelse(row_number()%,单位为%c(1:100),NA,固定酸度),volatile_acidity=ifelse(row_number()%,单位为%c(1:200),NA,volatile_acidity),柠檬酸=ifelse(row_number()%,单位:%c(50:400),NA,柠檬酸),residual_sugar=ifelse(row_number()%in%c(1000:1050),NA,residual_sugar),氯化物=ifelse(row_number()%,单位:%c(1000:1100),NA,氯化物)par(mfrow=c(1,2))na_patterns<-Hmisc::naclus(missing_df)Hmisc::naplot(na_patterns,'na-per-var')绘图(na_patterns)



提示2。考虑到rms复杂性的回归建模


一段时间前,当我在寻找更好的方法(比基本R函数……好得多)将非线性项和相互作用纳入广义线性模型框架时,向我推荐了Hmisc和rms包。rms包使增加这种复杂性变得非常容易合理违约。哈雷尔教授在其第二版第2章中讨论了使用限制三次样条项(自然样条)来放松连续预报器的线性假设,以及限制样条函数尾部线性的一些优点回归建模策略教科书。他还提供了关于结的数量和位置的详细描述,我发现这些信息非常丰富。我通常坚持推荐的默认结位置,除非我有充分的理由这样做,但替代位置可以很容易地适应。

rms包还简化了拟合和测试交互项所需的编程(使用anova.rms),并识别以下表单的语法,这些表单取自科尔·贝克的rms教程:

  • y~a:b,:表示a和b的相互作用
  • y~a*b,相当于y~a+b+a:b
  • y~(a+b)^2,等价于y~(a+b)*(a+b)
  • 非线性预报器的限制相互作用项%ia%在相互作用中不是双重非线性的

下面的代码将为全套预测器拟合一个加性模型,允许通过rms::rcs()函数使用受限三次样条拟合实现灵活性。


m0<-lrm(红酒~rcs(固定酸度,4)+rcs(挥发酸,4)+rcs(柠檬酸,4rcs(氯化物,4)+rcs(游离硫氧化物,4)+rcsrcs(硫酸盐,4)+rcs(酒精,4)+rcs(质量,3),数据=mydata,x=真,y=真)打印(m0,系数=假)
##Logistic回归模型##  ##lrm(公式=红葡萄酒~rcs(固定酸度,4)+rcs(挥发性酸度,##4)+rcs(柠檬酸,4)+rcs(残余糖,4)+rcs(氯化物,##4)+rcs(游离硫氧化物,4)+rcs(总硫氧化物,##4)+rcs(密度,4)+rcs(pH,4)+rcs(硫酸盐,4)+0cs(酒精,##4)+rcs(质量,3),数据=mydata,x=真,y=真)##  ##模型似然判别等级判别。##比率测试指标##Obs 6497 LR chi2 7008.47 R2 0.981 C 0.999##0 4898干膜35克8.879 Dxy 0.997##11599 Pr(>chi2)<0.0001 gr 7178.012伽马0.998##最大|衍生| 1e-05 gp 0.371 tau-a 0.370##布里尔0.004
绘图(方差分析(m0))

所以……看起来我们可以很容易地从这组特征中预测葡萄酒的类型!如果我知道这一点,我可能会选择一个更难的示例问题。我想,如果我至少不知道这么多,我的第二份侍酒师职业可能在这一点上是不可能的!

我们的下一步通常是验证模型并评估其在预测范围内的校准情况,但在这里,我想继续一个与我在实践中常见的情况更为相似的示例(即,我们有一组具有中等预测性能的功能)。我还想减少预测器的数量,以突出显示一些绘图功能。

因此,我将仅使用两个条件二次方值相对较小的预测因子(因为即使是最前面的几个预测因子也具有出色的性能)来显示一些关键功能。第一个模型是一个灵活的加性模型,每个预测器允许3节。

m2<-lrm(红酒~rcs(pH,3)+rcs(硫酸盐,3),数据=mydata,x=真,y=真)打印(m2)
##Logistic回归模型####lrm(公式=红酒~rcs(pH,3)+rcs(硫酸盐,3),数据=mydata,##x=真,y=真)####模型似然判别等级判别。##比率测试指标##Obs 6497 LR chi2 2294.01 R2 0.442 C 0.866##0 4898干膜4克2.415 Dxy 0.731##11599 Pr(>chi2)<0.0001 gr 11.186伽马0.731##最大|衍生|7e-07 gp 0.271 tau-a 0.271##布里尔0.125##  ##S.E.Wald Z Pr系数(>|Z|)##截距-40.0731 2.4341-16.46<0.0001##pH值8.4567 0.7536 11.22<0.0001##pH值-4.3193 0.7323-5.90<0.0001##硫酸盐23.5236 1.3365 17.60<0.0001##硫酸盐’-15.9641 1.3353-11.96<0.0001##
方差分析(m2)
##Wald统计响应:red_wine## ##系数Chi-Square d.f.P##pH值347.99 2<.0001##非线性34.79 1<.0001##硫酸盐920.43 2<.0001##非线性142.93 1<.0001##总非线性185.52 2<.0001##总计1205.84 4<.0001
p1<-ggplot(预测(m2,pH))p2<-ggplot(预测(m2,硫酸盐))p3<-ggplot(预测值(m2,pH,fun=plogis))p4<-ggplot(预测(m2,硫酸盐,fun=plogis))cowplot::plot_grid(p1,p2,p3,p4,nrow=2,ncol=2,scale=.9)

Brier分数和C-统计表明可能的预测性能适中打印模型还提供了系数和非线性项的信息和测试(根据您的目标,这些信息可能有信息也可能没有信息)。这个anova.rms函数令人印象深刻并自动测试设计中最有意义的假设,包括对非线性项的Wald测试,以及对包含的交互作用(如下所示),以及对任何感兴趣的项集的组块测试。下面是上的块测试示例的链接堆栈交换.

Predict函数选择合理的值来提供预测,并可以使用ggplot绘制。默认情况下,rms::lrm()的预测将以log-odds刻度返回。如果我们为fun=选项提供一个函数,我们可以在另一个尺度上获得预测。这里我们使用plogis函数返回预测的概率。默认情况下,这些是以连续变量的中值和类别变量的最常见水平计算的(但可以更改)。

下面我使用^2运算符来包括模型中的所有双向交互(在这个简单的例子中,这有点过分了,并使用了其他语法选择)。这个rms::bplot()函数非常酷并允许人们可视化双向交互。最后一行代码强调了如何将特性的特定值提供给rms::Predict()函数。当您想要检查多个因素如何运行时,这是非常有用的。哈雷尔博士在他的RMS教科书中提供了许多这样的例子。

m3<-lrm(红葡萄酒~(rcs(pH,3)+rcs(硫酸盐,3))^2,数据=mydata,x=真,y=真)打印(m3,系数=假)
##Logistic回归模型##  ##lrm(公式=红葡萄酒~(rcs(pH,3)+rcs(硫酸盐,3))^2,##数据=mydata,x=真,y=真)##  ##模型似然判别等级判别。##比率测试指标##Obs 6497 LR chi2 2333.97 R2 0.449 C 0.867##0 4898干膜厚度8克2.579 Dxy 0.734##1 1599 Pr(>chi2)<0.0001 gr 13.181伽马0.734##最大|衍生|2e-09 gp 0.272 tau-a 0.272##布里尔0.123
方差分析(m3)
##Wald统计响应:red_wine## ##系数Chi-Square d.f.P##pH(因子+高阶因子)355.42 6<.0001##所有交互35.00 4<.0001##非线性(因子+高阶因子)46.09 3<.0001##硫酸盐(因数+高阶因数)887.41 6<.0001##所有交互35.00 4<.0001##非线性(因子+高阶因子)161.97 3<.0001##pH*硫酸盐(因子+高阶因子)35.00 4<.0001##非线性6.41 3 0.0933##非线性相互作用:f(A,B)vs.AB 6.41 3 0.0933##f(A,B)vs.Af(B)+Bg(A)0.06 1 0.8011##pH与Af(B)的非线性相互作用2.36 2 0.3073##硫酸盐与Bg(A)的非线性相互作用2.94 2 0.2297##总非线性204.16 5<.0001##总非线性+相互作用214.89 6<.0001##总计1159.86 8<.0001
pred_intx<-预测(m3,“pH”,“硫酸盐”,fun=plogis,np=75)bplot(pred_intx,yhat~pH+硫酸盐,lfun=线框,ylab=“硫酸盐”,zlab=“Pr(红酒)”)

ggplot(预测(m2,硫酸盐,pH=c(3.0,3.2,3.4),fun=plogis))


从绝对歧视或基于等级的歧视来看,包含互动并不会增加太多。然而,此示例突出显示了anova.rms默认执行的各种类型的测试。它还允许我们查看bplot()返回的响应配置文件表面。

现在,让我们继续进行并调整受限交互,以达到指导目的。

#%ia%是限制相互作用-不是双重非线性m4<-lrm(红酒~rcs(pH,3)+rcs(硫酸盐,3)+pH%ia%硫酸盐,数据=mydata,x=真,y=真)打印(m4,系数=假)
##Logistic回归模型##  ##lrm(公式=红酒~rcs(pH,3)+rcs(硫酸盐,3)+pH%ia%##硫酸盐,数据=mydata,x=真,y=真)##  ##模型似然判别等级判别。##比率测试指标##Obs 6497 LR chi2 2327.12 R2 0.448 C 0.866##0 4898干膜5克2.657 Dxy 0.733##1 1599 Pr(>chi2)<0.0001 gr 14.252伽马0.733##最大|衍生|2e-11 gp 0.272 tau-a 0.272##布里尔0.124
方差分析(m4)
##Wald统计响应:red_wine## ##系数Chi-Square d.f.P##pH值(因数+高阶因数)362.84 3<.0001##所有交互32.25 1<.0001##非线性44.67 1<.0001##硫酸盐(因子+高阶因子)883.81 3<.0001##所有交互32.25 1<.0001##非线性154.96 1<.0001##pH*硫酸盐(因子+高阶因子)32.25 1<.0001##总非线性198.98 2<.0001##总非线性+相互作用205.24 3<.0001##总计1137.05 5<.0001
pred_intx_r<-预测(m4,‘pH’,‘硫酸盐’,fun=plogis,np=75)bplot(pred_intx_r,yhat~pH+硫酸盐,lfun=线框,ylab=“硫酸盐”,zlab=“Pr(红酒)\n”)


在这里我们可以看到,结果基本上没有变化;然而,受限制的相互作用和测试是针对1d.f。;然而,每个预报器中3节的交叉积项的相互作用需要4 d.f。

函数summary.rms()可用于获取每个预测值的对数和指数优势比。默认情况下提供四分位比值比。这些可以很容易地更改,并且可以测试更有趣或更复杂的关联。

与其他GLM一样,可以使用predict函数获得所有观测值的rms::lrm()对象的rms拟合值。

摘要(m4)
##效果响应:红酒## ##系数高低差异效应S.E.下限0.95上限0.95##pH值3.11 3.32 0.21 1.4116 0.084427 1.2461 1.5770##比值比3.11 3.32 0.21 4.1024 NA 3.4767 4.8406##硫酸盐0.43 0.60 0.17 2.7986 0.124910 2.5538 3.0434##比值比0.43 0.60 0.17 16.4220 NA 12.8560 20.9770## ##调整为:pH=3.21硫酸盐=0.51
summary(m4,pH=c(2.97,3.50))#第5块与第95块的对比度
##效果响应:红酒## ##系数高低差异效应S.E.下限0.95上限0.95##pH值2.97 3.5 0.53 3.4147 0.19978 3.0231 3.8062##比值比2.97 3.5 0.53 30.4070 NA 20.5550 44.9800##硫酸盐0.43 0.6 0.17 2.7986 0.12491 2.5538 3.0434##比值比0.43 0.6 0.17 16.4220 NA 12.8560 20.9770## ##调整为:pH=3.21硫酸盐=0.51
r<-mydatar$已安装<-预测(m4,type=“已安装”)头部(r$已安装)
## [1] 0.5605529 0.5164138 0.5470583 0.2846203 0.5605529 0.5605529



提示3。使用rms::validate()和rms:calibrate()验证拟合模型


在RMS教科书的第5章中,自助采购被提倡使用重采样获得模型未来性能的几乎无偏估计。validate()函数实现了这个过程,以返回特定于每种模型类型的偏差修正索引。返回了许多性能指标!使用?validate.lrm以获取有关每个指标的更多信息。基于bootstrap重采样获得乐观主义正确估计所执行的步骤是:

  • 在大小为n的原始样本中估计模型性能
  • 绘制一个大小相同的引导样本n,并将模型调整为引导样本
  • 将引导样本中获得的模型应用于原始样本
  • 从原始样本中的精度度量值中减去自举样本中发现的精度度量-这是乐观估计值(即过拟合)
  • 多次重复该过程,并对重复次数取平均值,以获得对每个度量值的乐观度的最终估计
  • 从观察到的/表观准确度测量值中减去该值,得到乐观修正估计值

也可以实施交叉验证或.632重采样等替代方法。下面是一个使用200个引导重采样的示例。第二行代码从Somer的D计算C-统计量(ROC曲线下的面积)。这里有很多事情要做……但是,validate函数将大部分内容抽象了!


(val<-验证(m4,B=200))
##原始训练测试乐观指数修正n##Dxy 0.7329 0.7329 07324 0.0005 0.7324 200型##R2 0.4477 0.4479 0.4471 0.0008 0.4469 200##截距0.0000 0.0000 0.0030-0.0030 0.0030 200##坡度1.0000 1.0000 0.9963 0.0037 0.9963 200##E最大值0.0000 0.0000 0.0013 0.0013 200##D 0.3580 0.3581 0.3574 0.0007 0.3573 200##U-0.0003-0.0003 0.0000-0.0003 0.0000 200单位##Q 0.3583 0.3584 0.3574 0.0010 0.3573 200##乙0.1237 0.1235 0.1238-0.0003 0.1240 200##克2.6569 2.6671 2.6562 0.0109 2.6460 200##gp 0.2719 0.2716 0.2716 0.0000 0.2719 200
(c_opt_corr<-0.5*(值[1,5]+1))
## [1] 0.8662209


这里我们几乎没有看到过拟合的证据。考虑到大样本和小模型d.f.,这是可以预期的。然而,在小数据集上估计复杂模型时,表观估计值和优化校正估计值之间的差异可能很大;表明在适合新数据时可能会出现性能下降。关于拟合预测模型所需受试者数量的良好信息对于连续的二进制的限制过拟合的结果可以在Richard Riley和同事的这组优秀论文中找到。

校准是模型验证的一个组成部分,旨在衡量模型预测与观测数据的拟合程度(在整个值范围内)。Bootstrap重采样也可用于获取模型性能的样本外估计值,以进行校准。

rms::calibrate()使用自举或交叉验证,根据预测值序列上的子设置预测,获得预测值与观测值的偏差校正(过拟合校正)估计。该函数显示理想的、明显的和经过优化校正的校准曲线。它还提供了一个直方图,突出显示预测的密度。

这里有一个例子。

cal<-校准(m4,B=200)绘图(cal)

## ##n=6497平均绝对误差=0.003平均平方误差=1e-05##0.9绝对误差分位数=0.006


该模型看起来很适合预测概率的范围。因此,考虑到有限的乐观情绪和出色的校准,我们可能期望该模型在新样本中表现良好。



提示4。带有rms::pentrace()的惩罚回归


惩罚回归可以通过减少极值系数的影响来提高模型在适应新数据时的性能。这是一种偏方差权衡我们可以向下偏移系数以改善新数据中的误差。惩罚回归与岭回归类似,因为它是一种“L-2”惩罚,将所有项保留在模型中,但将其缩小为零。这里使用惩罚最大似然估计来实现。对于熟悉贝叶斯统计的人来说,这种方法可以被认为是一种“频率主义方法”,将“怀疑先验”的思想引入模型构建练习中。我们想给原始系数分配的权重越小,我们就越能缩小它们。好处是可以改进新数据中的预测并降低有效自由度。然而,还有一些工作要做本·范·卡尔斯特(Ben Van Calster)、马尔滕·范·斯梅登(Maarten Van Smeden)、埃沃特·斯泰耶伯格(Ewout W.Steyerberg)例如,这表明,虽然收缩平均改善了预测,但它在单个数据集中的表现可能很差,并且通常不能解决与样本量小或每个变量的事件数少相关的问题。因此,这并不是收集不到足够数据的灵丹妙药。

在rms::pentrace()中,一个特别有用的函数是,主效应项可以比非线性项或交互作用接收不同的惩罚(收缩因子)。因此,它提供了一种很好的方法来考虑模型的复杂性,同时根据需要缩小一些/所有估计。

虽然对于这些数据,几乎不需要对过拟合进行调整,但出于教学目的,我们将应用pentrace函数。这里寻求AIC.c最大化的以及通过网格搜索确定的惩罚值。我们看到,实现最大AIC.c几乎不需要惩罚,并且在惩罚模型中有效d.f.减少。


五角大楼(m4,seq(.01,.1,by=.01))
## ##最佳惩罚:## ##罚款df##     0.01 4.981253## ##惩罚df aic bic aic.c##     0.00 5.000000 2317.119 2283.224 2317.110##     0.01 4.981253 2317.137 2283.369 2317.128##     0.02 4.963194 2317.118 2283.472 2317.109##     0.03 4.945779 2317.066 2283.538 2317.057##     0.04 4.928972 2316.984 2283.570 2316.975##     0.05 4.912738 2316.876 2283.572 2316.867##0.06 4.897045 2316.743 2283.546 2316.735##     0.07 4.881863 2316.590 2283.495 2316.581##     0.08 4.867167 2316.417 2283.422 2316.408##0.09 4.852930 2316.227 2283.328 2316.218##     0.10 4.839131 2316.021 2283.217 2316.013
m5<-更新(m4,惩罚=.01)5米
##Logistic回归模型##  ##lrm(公式=红酒~rcs(pH,3)+rcs(硫酸盐,3)+pH%ia%##硫酸盐,数据=mydata,x=真,y=真,罚款=0.01)##  ##  ##惩罚因素##  ##简单非线性相互作用非线性相互作用##     0.01      0.01        0.01                  0.01##  ##模型似然判别等级判别。##比率测试指标##Obs 6497 LR chi2 2327.10 R2 0.448 C 0.866##0 4898干膜4.981克2.649 Dxy 0.733##11599 Pr(>chi2)<0.0001 gr 14.138伽马0.733##max|deriv|1e-11惩罚1.15 gp 0.272 tau-a 0.272##布里尔0.124##  ##系数S.E.Wald Z Pr(>|Z|)惩罚尺度##截距-63.7296 4.9458-12.89<0.0001 0.0000##pH值15.5212 1.4868 10.44<0.0001 0.0161##pH值-5.0190 0.7531-6.66<0.0001 0.0140##硫酸盐58.7949 6.4401 9.13<0.0001 0.0149##硫酸盐-17.6434 1.4195-12.43<0.0001 0.0127##pH*硫酸盐-10.3680 1.8527-5.60<0.0001 0.0499##


五聚体(m4,列表(简单=0.01,非线性=c(0,0.01,0.02,0.03),相互作用=c(0,0.01,0.02,0.03))
## ##最佳惩罚:## ##简单非线性相互作用df##    0.01      0.02        0.02 4.972499## ##简单非线性相互作用df-aic bic-aic.c##    0.01      0.01        0.01 4.981253 2317.137 2283.369 2317.128##0.01 0.01 0.02 4.972933 2317.139 2283.427 2317.130##    0.01      0.02        0.02 4.972499 2317.139 2283.430 2317.130##    0.01      0.01        0.03 4.964759 2317.136 2283.479 2317.127##0.01 0.02 0.03 4.964326 2317.136 2283.483 2317.127##    0.01      0.03        0.03 4.963893 2317.137 2283.486 2317.127
m6<-更新(m4,惩罚=.01)6米
##Logistic回归模型##  ##lrm(公式=红酒~rcs(pH,3)+rcs(硫酸盐,3)+pH%ia%##硫酸盐,数据=mydata,x=真,y=真,罚款=0.01)##  ##  ##惩罚因素##  ##简单非线性相互作用非线性相互作用##     0.01      0.01        0.01                  0.01##  ##模型似然判别等级判别。##比率测试指标##Obs 6497 LR chi2 2327.10 R2 0.448 C 0.866##0 4898干膜4.981克2.649 Dxy 0.733##11599 Pr(>chi2)<0.0001 gr 14.138伽马0.733##max|deriv|1e-11惩罚1.15 gp 0.272 tau-a 0.272##布里尔0.124##  ##系数S.E.Wald Z Pr(>|Z|)惩罚尺度##截距-63.7296 4.9458-12.89<0.0001 0.0000##pH值15.5212 1.4868 10.44<0.0001 0.0161##pH’-5.0190 0.7531-6.66<0.0001 0.0140##硫酸盐58.7949 6.4401 9.13<0.0001 0.0149##硫酸盐-17.6434 1.4195-12.43<0.0001 0.0127##pH*硫酸盐-10.3680 1.8527-5.60<0.0001 0.0499##
有效.df(m6)
## ##原始和有效自由度## ##原始处罚##全部5 4.98##简单条款2 1.99##相互作用或非线性3 2.99##非线性2 2.00##相互作用1 0.99##非线性相互作用0.00



提示5。用于连续或半连续Y的OLS以外的模型


rms包的一个很好的特性是可以使用它来适应各种模型。例如,如果我们想对条件分位数进行预测,则rms包装了Roger Koenker的quantreg包允许rms包的大部分优点应用于分位数回归模型。我知道的唯一限制是,当使用rms时,一次只能对tau(分位数)的单个值建模。如果希望对有序或半连续数据建模,rms::orm()函数适用于连续或有序响应变量的有序累积概率模型。此外,该软件包可用于拟合OLS回归、生存模型、纵向数据的广义最小二乘等。

当对连续结果建模时,OLS以外的模型可能会很有用,并且人们希望对给定X的Y分布进行“较少限制”的假设。分位数回归只要求Y|X是连续的。比例赔率模型仅假设所有结果组的关联相同(即比例赔率或平行回归假设)。因此,如果在进行预测时不想依赖中心极限定理,可以根据您的目标考虑这些替代方法。

下面我们拟合了一个带有非线性项和相互作用的相当简单的两项模型,以预测pH值和硫酸盐的残糖值。OLS、序数和分位数回归模型适用于数据和各种预测。

lm1<-ols(残余糖~(rcs(pH,3)+rcs(硫酸盐,3))^2,数据=mydata,x=真,y=真)打印(lm1,coefs=FALSE)
##线性回归模型##  ##ols(公式=残糖~(rcs(pH,3)+rcs(硫酸盐,3))^2,##数据=mydata,x=真,y=真)##  ##模型似然判别##比率测试指标##Obs 6497 LR chi2 710.48 R2 0.104##σ4.5074 d.f.8 R2调节0.102##干重6488 Pr(>chi2)0.0000克1.719##  ##残差##  ##最小1Q中位数最大3Q##  -9.967 -3.202 -1.174  2.444 62.425 ##
r<-mydatar$剩余<-剩余(lm1)r$已安装<-已安装(lm1)r1<-ggplot(数据=r,aes(x=拟合,y=resid))+地理点()+地理平滑()r2<-ggplot(数据=r,aes(x=pH,y=resi))+geom_point()+geome_smooth()r3<-ggplot(数据=r,aes(x=硫酸盐,y=残渣))+geom_point()+geome_smooth()r4<-ggplot(数据=r,aes(样本=resid))+stat_qq()+geom_abline(截距=平均值(r$resid),斜率=sd(r$resid))cowplot::plot_grid(r1,r2,r3,r4,nrow=2,ncol=2,scale=.9)

ggplot(预测(lm1,硫酸盐,pH=c(3,3.2,3.4))


从上面我们可以看出,r平方值和模型拟合都不是很好。然而,在预测残余糖时,pH值和硫酸盐的影响确实以非线性方式相互作用。我们可以在此时进一步检查模型预测,或考虑某种类型的转换等,或替代模型。

我们将用rms::orm()实现的对数比例优势模型拟合这些数据,并获得残糖随pH值和硫酸盐变化的平均值和中位数预测。

或m1<-orm(残余糖~(rcs(pH,3)+rcs(硫酸盐,3))^2,数据=mydata,x=真,y=真)打印(orm1,coefs=FALSE)
##Logistic(比例奇数)序数回归模型##  ##orm(公式=残余糖~(rcs(pH,3)+rcs(硫酸盐,3))^2,##数据=mydata,x=真,y=真)##  ##模型似然判别等级判别。##比率测试指标##Obs 6497 LR chi2 476.63 R2 0.071 rho 0.268##独特Y 316 d.f.8 g 0.542##中值Y 3 Pr(>chi2)<0.0001 gr 1.720##max|deriv|2e-05得分chi2 482.68|Pr(Y>=中值)-0.5|0.098##Pr(>chi2)<0.0001
M<-平均值(或m1)qu<-分位数(或m1)med<-函数(x)qu(0.5,x)p1<-ggplot(预测(或m1,硫酸盐,pH=c(3,3.2,3.4),fun=M))+坐标自流(ylim=c(1,8))p2<-ggplot(预测(orm1,硫酸盐,pH=c(3,3.2,3.4),fun=med))+坐标自流(ylim=c(1,8))plot_grid(p1,p2,nrow=1,ncol=2,scale=0.9,labels=c(“ORM:平均值”,“ORM:中值”))


我们通常看到与OLS相同的模式。

不,让我们尝试rms::Rq函数,从同一组预测值中预测中值。

rq1<-Rq(残余糖~(rcs(pH,3)+rcs(硫酸盐,3))^2,数据=mydata,x=真,y=真,tau=0.5)打印(rq1,coefs=FALSE)
##分位数回归tau:0.5##  ##Rq(公式=残糖~(rcs(pH,3)+rcs(硫酸盐,3))^2,##tau=0.5,data=mydata,x=真,y=真)####歧视##索引##观察物6497克1.971##第9页##剩余d.f.6488##平均|Y-Y帽|3.345058
ggplot(预测(rq1,硫酸盐,pH=c(3,3.2,3.4))


此时,我们可以比较模型性能的优化修正估计值和校准曲线,以评估性能。我们还可以通过改变τ来模拟其他分位数,以查看预测因子的影响在剩余糖的分位数之间是否不同。



好处:在R之外进行预测


如果你想把你的预测放在R之外,把它们放到一个基于web的可视化的java脚本中,例如,rms::Function()将输出用于进行模型预测的R代码。


(pred_logit<-函数(m4))
##功能(pH=3.21,硫酸盐=0.51)## {##-64.339385+15.699039*pH值-31.487899*pmax(pH值-3.02,##0)^3+59.976951*pmax(pH值-3.21,0)^3-28.489052*##pmax(pH-3.42,0)^3+59.695226*硫酸盐-144.55604*##pmax(硫酸盐-0.37,0)^3+240.92673*pmax##0.51,0)^3-96.370692*pmax(硫酸盐-0.72,0)##10.624164*pH*硫酸盐## }##<环境:0x7f8c1b174328>



会话信息


sessionInfo()
##R版本4.0.2(2020-06-22)##平台:x86_64-apple-darwin17.0(64位)##运行于:macOS Catalina 10.15.6## ##矩阵产品:默认##BLAS:/Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib##LAPACK:/Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib(LAPACK)## ##区域设置:##[1]en_US.UTF-8/en_US-UTF-8/en_US.UNTF-8/C/en_US。UTF-8/C/en_US## ##附加的基本包:##[1]stats graphics grDevices utils datasets方法库## ##其他附加包:##[1]cowplot_1.1.0 ucidat_0.0.3 rms_6.0-1 SparseM_1.78##[5]Hmisc_4.4-1 Formula_1.2-3 survival_3.1-12晶格_0.20-41##[9]用于cats_0.5.0字符串_1.4.0 dplyr_1.0.2 purr_0.3.4##[13]阅读器_1.3.1 tidyr_1.1.2 tibble_3.0.3 ggplot2_3.3.2##[17]tidyverse_1.3.0## ##通过命名空间加载(未附加):##[1]nlme_3.1-148矩阵统计-0.56.0 fs_1.5.0##[4]润滑油_1.7.9 RColorBrewer_1.1-2 httr_1.4.2##[7]工具_S.0.2后端口_1.1.9 R6_2.5.0##[10]零件_4.1-15 mgcv_1.8-31 DBI_1.1.0##[13]colorspace_1.4-1 nnet_7.3-14和r_2.2.0##[16]tidyselect_1.1.0 gridExtra_2.3编译器_4.0.2##[19]cli_2.0.2服务器_0.3.6量程_5.67##[22]htmlTable_2.0.1 xml2_1.3.2和2.5-1##[25]标签_0.3 bookdown_0.21 scales_1.1.1##[28]checkmate_2.0.0 mvtnorm_1.1-1极轴_1.1.19##[31]消化_0.6.27外来_0.8-80 rmarkdown_2.5##[34]base64enc_0.1-3 jpeg_0.1-8.1 pkgconfig_2.0.3版本##[37]htmltools_0.5.0 dbplyr_1.4.4 htmlwidgets_1.5.1##[40]爱尔兰_0.4.8 readxl_1.3.1 rstudioapi_0.11##[43]farver_2.0.3通用_0.0.2动物园_1.8-8##[46]jsonlite_1.7.1磁头_2.0.1矩阵_1.2-18##[49]Rcpp_1.0.5 munsell_0.5.0 fansi_0.4.1门扇##[52]生命周期-0.2.0 multcomp_1.4-13字符串_1.5.3##[55]yaml_2.2.1 MASS_7.3-51.6网格_4.0.2##[58]blob_1.2.1蜡笔_1.3.4避风港_2.3.1##[61]花键_4.0.2 hms_0.5.3 knitr_1.30##[64]柱_1.4.6代码工具_0.2-16代表_0.3.0##[67]glue_1.4.2 evaluate_0.14博客_0.21.45##[70]晶格Extra_0.6-29数据。表_1.13.0模型_0.1.8##[73]png_0.1-7 vctrs_0.3.4矩阵模型_0.4-1##[76]cellranger_1.1.0 gtable_0.3.0断言_0.2.1##[79]xfun_0.19扫帚_0.7.0征服_1.0.2##[82]簇_2.1.0 TH.data_1.0-10椭圆_0.3.1
儿科副教授

相关的