找回密码
 立即注册
查看: 3411|回复: 1

关于用R语言做nomogram,本人还是初学者,仅仅是大自然的搬运工

[复制链接]
发表于 2015-4-28 09:42:22 | 显示全部楼层 |阅读模式
从一个网站上看到的,但是本人初学者,还看不太懂,先搬过来供大家分享学习。另若有侵权请告知,即刻删。 nomogram {rms}

[size=1.4em]Draw a Nomogram Representing a Regression Fit


Package:
rms


Version:
4.1-1



Description
Draws a partial nomogram that can be used to manually obtain predicted values from a regression model that was fitted with rms. The nomogram does not have lines representing sums, but it has a reference line for reading scoring points (default range 0--100). Once the reader manually totals the points, the predicted values can be read at the bottom. Non-monotonic transformations of continuous variables are handled (scales wrap around), as are transformations which have flat sections (tick marks are labeled with ranges). If interactions are in the model, one variable is picked as the “axis variable”, and separate axes are constructed for each level of the interacting factors (preference is given automatically to using any discrete factors to construct separate axes) and levels of factors which are indirectly related to interacting factors (see DETAILS). Thus the nomogram is designed so that only one axis is actually read for each variable, since the variable combinations are disjoint. For categorical interacting factors, the default is to construct axes for all levels. The user may specify coordinates of each predictor to label on its axis, or use default values. If a factor interacts with other factors, settings for one or more of the interacting factors may be specified separately (this is mandatory for continuous variables). Optional confidence intervals will be drawn for individual scores as well as for the linear predictor. If more than one confidence level is chosen, multiple levels may be displayed using different colors or gray scales. Functions of the linear predictors may be added to the nomogram.
print.nomogram prints axis information stored in an object returned by nomogram. This is useful in producing tables of point assignments by levels of predictors. It also prints how many linear predictor units there are per point and the number of points per unit change in the linear predictor.
legend.nomabbrev draws legends describing abbreviations used for labeling tick marks for levels of categorical predictors.

Usagenomogram(fit, ..., adj.to, lp=TRUE, lp.at=NULL,         fun=NULL, fun.at=NULL, fun.lp.at=NULL, funlabel="Predicted Value",         interact=NULL, kint=NULL,  conf.int=FALSE,          conf.lp=c("representative", "all", "none"),         est.all=TRUE, abbrev=FALSE, minlength=4, maxscale=100, nint=10,          vnames=c("labels","names"),         varname.label=TRUE, varname.label.sep="=",         omit=NULL, verbose=FALSE) ## S3 method for class 'nomogram':print((x, dec=0, ...))## S3 method for class 'nomogram':plot((x, lplabel="Linear Predictor", fun.side, col.conf=c(1, 0.3), conf.space=c(.08,.2), label.every=1, force.label=FALSE,  xfrac=.35, cex.axis=.85, cex.var=1, col.grid=NULL, varname.label=TRUE, varname.label.sep="=", ia.space=.7,  tck=NA, tcl=-0.25, lmgp=.4, naxes, points.label='Points', total.points.label='Total Points', total.sep.page=FALSE, total.fun, cap.labels=FALSE, ...)legend.nomabbrev(object, which, x, y, ncol=3, ...))
Argumentsfita regression model fit that was created with rms, and     (usually) with options(datadist ="object.name") in effect....settings of variables to use in constructing axes. If datadist was in effect, the default is to usepretty(total range, nint) for continuous variables, and the class levels for discrete ones. Forlegend.nomabbrev, ... specifies optional     parameters to pass to legend. Common ones are bty ="n" to suppress drawing the box. You may want to specify a non-proportionally spaced font (e.g., courier) number if abbreviations are more than one letter long. This will make the abbreviation definitions line up (e.g., specify font = 2, the default for courier). Ignored for print     and plot.adj.toIf you didn't define datadist for all predictors, you will have to define adjustment settings for the undefined ones, e.g. adj.to= list(age = 50, sex = "female").lpSet to FALSE to suppress creation of an axis for scoring X beta.lp.atIf lp=TRUE, lp.at may specify a vector of settings of X beta. Default is to use pretty(range of linear predictors, nint).funan optional function to transform the linear predictors, and to plot on another axis. If more than one transformation is plotted, put them in a list, e.g. list(function(x) x/2, function(x) 2*x). Any function values equal to NA will be ignored.fun.atfunction values to label on axis. Default fun evaluated at lp.at. If more than one fun was specified, using a vector for fun.at will cause all functions to be evaluated at the same argument values. To use different values, specify a list of vectors for fun.at, with elements corresponding to the different functions (lists of vectors also applies to fun.lp.at and fun.side).fun.lp.atIf you want to evaluate one of the functions at a different set of linear predictor values than may have been used in constructing the linear predictor axis, specify a vector or list of vectors of linear predictor values at which to evaluate the function. This is especially useful for discrete functions. The presence of this attribute also does away with the need for nomogram to compute numerical approximations of the inverse of the function. It also allows the user-supplied function to return factor objects, which is useful when e.g. a single tick mark position actually represents a range. If the fun.lp.at parameter is present, the fun.at vector for that function is ignored.funlabellabel for fun axis. If more than one function was given but funlabel is of length one, it will be duplicated as needed. If fun is a list of functions for which you specified names (see the final example below), these names will be used as labels.interactWhen a continuous variable interacts with a discrete one, axes are constructed so that the continuous variable moves within the axis, and separate axes represent levels of interacting factors. For interactions between two continuous variables, all but the axis variable must have discrete levels defined ininteract. For discrete interacting factors, you may specify levels to use in constructing the multiple axes. For continuous interacting factors, you must do this. Examples: interact = list(age =seq(10,70,by=10),       treat = c("A","B","D")).kintfor models such as the ordinal models with multiple intercepts, specifies which one to use in evaluating the linear predictor.         Default is to use fit$interceptRef if it exists, or 1.conf.intconfidence levels to display for each scoring. Default is FALSE to display no confidence limits. Settingconf.int to TRUE is the same as setting it to c(0.7, 0.9), with the line segment between the 0.7 and 0.9 levels shaded using gray scale.conf.lpdefault is "representative" to group all linear predictors evaluated into deciles, and to show, for the linear predictor confidence intervals, only the mean linear predictor within the deciles along with the median standard error within the deciles. Set conf.lp = "none" to suppress confidence limits for the linear predictors, and to "all" to show all confidence limits.est.allTo plot axes for only the subset of variables named in ..., set est.all = FALSE. Note: This option only works when zero has a special meaning for the variables that are omitted from the graph.abbrevSet to TRUE to use the abbreviate function to abbreviate levels of categorical factors, both for labeling tick marks and for axis titles. If you only want to abbreviate certain predictor variables, setabbrev to a vector of character strings containing their names.minlengthapplies if abbrev = TRUE. Is the minimum abbreviation length passed to the abbreviate function. If you set minlength = 1, the letters of the alphabet are used to label tick marks for categorical predictors, and all letters are drawn no matter how close together they are. For labeling axes (interaction settings), minlength = 1 causes minlength = 4 to be used.maxscaledefault maximum point score is 100nintnumber of intervals to label for axes representing continuous variables. See pretty.vnamesBy default, variable labels are used to label axes. Set vnames = "names" to instead use variable names.omitvector of character strings containing names of variables for which to suppress drawing axes. Default is to show all variables.verboseset to TRUE to get printed output detailing how tick marks are chosen and labeled for function axes. This is useful in seeing how certain linear predictor values cannot be solved for using inverse linear interpolation on the (requested linear predictor values, function values at these lp values). When this happens you will see NAs in the verbose output, and the corresponding tick marks will not appear in the nomogram.xan object created by nomogram, or the x coordinate for     a legenddecnumber of digits to the right of the decimal point, for rounding point scores in print.nomogram. Default is to round to the nearest whole number of points.lplabellabel for linear predictor axis. Default is "Linear Predictor".fun.sidea vector or list of vectors of side parameters for the axis function for labeling function values. Values may be 1 to position a tick mark label below the axis (the default), or 3 for above the axis. If for example an axis has 5 tick mark labels and the second and third will run into each other, specifyfun.side=c(1,1,3,1,1) (assuming only one function is specified as fun).col.confcolors corresponding to conf.int.conf.spacea 2-element vector with the vertical range within which to draw confidence bars, in units of 1=spacing between main bars. Four heights are used within this range (8 for the linear predictor if more than 16 unique values were evaluated), cycling them among separate confidence intervals to reduce overlapping.label.everySpecify label.every = i to label on every ith tick mark.force.labelset to TRUE to force every tick mark intended to be labeled to have a label plotted (whether the labels run into each other or not)xfracfraction of horizontal plot to set aside for axis titlescex.axischaracter size for tick mark labelscex.varcharacter size for axis titles (variable names)col.gridIf left unspecified, no vertical reference lines are drawn. Specify a vector of length one (to use the same color for both minor and major reference lines) or two (corresponding to the color for the major and minor divisions, respectively) containing colors, to cause vertical reference lines to the top points scale to be drawn. For R, a good choice is col.grid = gray(c(0.8, 0.95)).varname.labelIn constructing axis titles for interactions, the default is to add (interacting.varname = level) on the right. Specify varname.label = FALSE to instead use "(level)".varname.label.sepIf varname.label = TRUE, you can change the separator to something other than = by specifying this parameter.ia.spaceWhen multiple axes are draw for levels of interacting factors, the default is to group combinations related to a main effect. This is done by spacing the axes for the second to last of these within a group only 0.7 (by default) of the way down as compared with normal space of 1 unit.tcksee tck under partcllength of tick marks in nomogramlmgpspacing between numeric axis labels and axis (see par for mgp)naxesmaximum number of axes to allow on one plot. If the nomogram requires more than one “page”, the “Points” axis will be repeated at the top of each page when necessary.points.labela character string giving the axis label for the points scaletotal.points.labela character string giving the axis label for the total points scaletotal.sep.pageset to TRUE to force the total points and later axes to be placed on a separate pagetotal.funa user-provided function that will be executed before the total points axis is drawn. Default is not to execute a function. This is useful e.g. when total.sep.page = TRUE and you wish to use locator to find the coordinates for positioning an abbreviation legend before it's too late and a new page is started (i.e., total.fun = function() print(locator(1))).cap.labelslogical: should the factor labels have their first letter capitalized?objectthe result returned from nomogramwhicha character string giving the name of a variable for which to draw a legend with abbreviations of factor levelsyy-coordinate to pass to the legend function. This is the upper left corner of the legend box. You can omit y if x is a list with named elements x and y. To use the mouse to locate the legend, specifylocator(1) for x. For print, x is the result of nomogram.ncolthe number of columns to form in drawing the legend.
Details
A variable is considered to be discrete if it is categorical or ordered or if datadist stored values for it (meaning it had <11 unique values). A variable is said to be indirectly related to another variable if the two are related by some interaction. For example, if a model has variables a, b, c, d, and the interactions are a:c and c:d, variable d is indirectly related to variable a. The complete list of variables related to a is c, d. If an axis is made for variable a, several axes will actually be drawn, one for each combination of c and d specified in interact.
Note that with a caliper, it is easy to continually add point scores for individual predictors, and then to place the caliper on the upper “Points” axis (with extrapolation if needed). Then transfer these points to the “Total Points” axis. In this way, points can be added without without writing them down.
Confidence limits for an individual predictor score are really confidence limits for the entire linear predictor, with other predictors set to adjustment values. If lp = TRUE, all confidence bars for all linear predictor values evaluated are drawn. The extent to which multiple confidence bars of differing widths appear at the same linear predictor value means that precision depended on how the linear predictor was arrived at (e.g., a certain value may be realized from a setting of a certain predictor that was associated with a large standard error on the regression coefficients for that predictor).
On occasion, you may want to reverse the regression coefficients of a model to make the “points” scales reverse direction. For parametric survival models, which are stated in terms of increasing regression effects meaning longer survival (the opposite of a Cox model), just do something like fit$coefficients <- -fit$coefficients before invoking nomogram, and if you add function axes, negate the function arguments. For the Cox model, you also need to negate fit$center. If you omit lp.at, also negatefit$linear.predictors.

Values
a list of class "nomogram" that contains information used in plotting the axes. If you specified abbrev =TRUE, a list called abbrev is also returned that gives the abbreviations used for tick mark labels, if any. This list is useful for making legends and is used by legend.nomabbrev (see the last example). The returned list also has components called total.points, lp, and the function axis names. These components have components x (at argument vector given to axis), y (pos for axis), and x.real, the x-coordinates appearing on tick mark labels. An often useful result is stored in the list of data for each axis variable, namely the exact number of points that correspond to each tick mark on that variable's axis.

References
Banks J: Nomograms. Encylopedia of Statistical Sciences, Vol 6. Editors: S Kotz and NL Johnson. New York: Wiley; 1985.
Lubsen J, Pool J, van der Does, E: A practical device for the application of a diagnostic or prognostic function. Meth. Inform. Med. 17:127--129; 1978.

See Also
rms, plot.Predict, plot.summary.rms, axis, pretty, approx, latexrms, rmsMisc

Examples
n <- 1000    # define sample sizeset.seed(17) # so can reproduce the resultsage            <- rnorm(n, 50, 10)blood.pressure <- rnorm(n, 120, 15)cholesterol    <- rnorm(n, 200, 25)sex            <- factor(sample(c('female','male'), n,TRUE))  # Specify population model for log odds that Y=1L <- .4*(sex=='male') + .045*(age-50) +  (log(cholesterol - 10)-5.2)*(-2*(sex=='female') + 2*(sex=='male'))# Simulate binary y to have Prob(y=1) = 1/[1+exp(-L)]y <- ifelse(runif(n) < plogis(L), 1, 0)  ddist <- datadist(age, blood.pressure, cholesterol, sex)options(datadist='ddist')  f <- lrm(y ~ lsp(age,50)+sex*rcs(cholesterol,4)+blood.pressure)nom <- nomogram(f, fun=function(x)1/(1+exp(-x)),  # or fun=plogis    fun.at=c(.001,.01,.05,seq(.1,.9,by=.1),.95,.99,.999),    funlabel="Risk of Death")#Instead of fun.at, could have specified fun.lp.at=logit of#sequence above - faster and slightly more accurateplot(nom, xfrac=.45)print(nom)nom <- nomogram(f, age=seq(10,90,by=10))plot(nom, xfrac=.45)g <- lrm(y ~ sex + rcs(age,3)*rcs(cholesterol,3))nom <- nomogram(g, interact=list(age=c(20,40,60)),                 conf.int=c(.7,.9,.95))plot(nom, col.conf=c(1,.5,.2), naxes=7)  cens <- 15*runif(n)h <- .02*exp(.04*(age-50)+.8*(sex=='Female'))d.time <- -log(runif(n))/hdeath <- ifelse(d.time <= cens,1,0)d.time <- pmin(d.time, cens)  f <- psm(Surv(d.time,death) ~ sex*age, dist='lognormal')med  <- Quantile(f)surv <- Survival(f)  # This would also work if f was from cphplot(nomogram(f, fun=function(x) med(lp=x), funlabel="Median Survival Time"))nom <- nomogram(f, fun=list(function(x) surv(3, x),                            function(x) surv(6, x)),            funlabel=c("3-Month Survival Probability",                        "6-month Survival Probability"))plot(nom, xfrac=.7)  ## Not run:nom <- nomogram(fit.with.categorical.predictors, abbrev=TRUE, minlength=1)nom$x1$points   # print points assigned to each level of x1 for its axis#Add legend for abbreviations for category levelsabb <- attr(nom, 'info')$abbrev$treatmentlegend(locator(1), abb$full, pch=paste(abb$abbrev,collapse=&rdquo;),        ncol=2, bty='n')  # this only works for 1-letter abbreviations#Or use the legend.nomabbrev function:legend.nomabbrev(nom, 'treatment', locator(1), ncol=2, bty='n')## End(Not run)   #Make a nomogram with axes predicting probabilities Y>=j for all j=1-3#in an ordinal logistic model, where Y=0,1,2,3Y <- ifelse(y==0, 0, sample(1:3, length(y), TRUE))g <- lrm(Y ~ age+rcs(cholesterol,4)*sex)fun2 <- function(x) plogis(x-g$coef[1+g$coef[2)fun3 <- function(x) plogis(x-g$coef[1+g$coef[3)f <- Newlabels(g, c(age='Age in Years'))  #see Design.Misc, which also has Newlevels to change #labels for levels of categorical variablesg <- nomogram(f, fun=list('Prob Y>=1'=plogis, 'Prob Y>=2'=fun2,                      'Prob Y=3'=fun3),          fun.at=c(.01,.05,seq(.1,.9,by=.1),.95,.99))plot(g, lmgp=.2, cex.axis=.6)options(datadist=NULL)


Author(s)
Frank Harrell
Department of Biostatistics
Vanderbilt University
f.harrell@vanderbilt.edu

Documentation reproduced from package rms, version 4.1-1. License: GPL (>= 2)





回复

使用道具 举报

发表于 2015-5-5 15:13:42 | 显示全部楼层
这个是属于可视化研究吧?主要是作图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|R语言中文网

GMT+8, 2024-11-25 20:25 , Processed in 0.022306 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表