- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当需要对模型变量之一进行分层时,我试图找到一种方法来从 Cox-PH 模型制作风险比的森林图。对于非分层模型,ggforest()
功能非常好。运行一些示例代码
library(survival)
library(survminer)
model <- coxph(Surv(time, status) ~ sex + rx + adhere,
data = colon )
ggforest(model)
colon <- within(colon, {
sex <- factor(sex, labels = c("female", "male"))
differ <- factor(differ, labels = c("well", "moderate", "poor"))
extent <- factor(extent, labels = c("submuc.", "muscle", "serosa", "contig."))
})
bigmodel <-
coxph(Surv(time, status) ~ sex + rx + adhere + differ + extent + node4,
data = colon )
ggforest(bigmodel)
产生这个图
stratamodel <- coxph(Surv(time, status) ~ sex + strata(rx) + adhere + differ + extent + node4,
data = colon )
ggforest(stratamodel)
出现以下错误消息:
"Error in
[.data.frame
(data, , var) : undefined columns selected
In .get_data(model, data = data) : The
data
argument is notprovided. Data will be extracted from model fit."
最佳答案
我认为所需的森林图是简单地跳过模型公式中分层 RX 变量的图。如果是这样,我们可以简单地在其中插入一个 if 子句,以忽略与数据中的列名不完全对应的公式部分(例如“strata(rx)”不是列名)。
方法一
如果您对 R 足够熟悉以修改函数,请运行 trace(ggforest, edit = TRUE)
并替换 allTerms <- lapply(...)
(大约第 10-25 行)在具有以下版本的弹出窗口中:
allTerms <- lapply(seq_along(terms), function(i) {
var <- names(terms)[i]
if(var %in% colnames(data)) {
if (terms[i] %in% c("factor", "character")) {
adf <- as.data.frame(table(data[, var]))
cbind(var = var, adf, pos = 1:nrow(adf))
}
else if (terms[i] == "numeric") {
data.frame(var = var, Var1 = "", Freq = nrow(data),
pos = 1)
}
else {
vars = grep(paste0("^", var, "*."), coef$term,
value = TRUE)
data.frame(var = vars, Var1 = "", Freq = nrow(data),
pos = seq_along(vars))
}
} else {
message(var, "is not found in data columns, and will be skipped.")
}
})
ggforest(stratamodel) # this should work after the modification
untrace(ggforest)
.
ggforest2 <- function (model, data = NULL, main = "Hazard ratio",
cpositions = c(0.02, 0.22, 0.4), fontsize = 0.7,
refLabel = "reference", noDigits = 2) {
conf.high <- conf.low <- estimate <- NULL
stopifnot(class(model) == "coxph")
data <- survminer:::.get_data(model, data = data)
terms <- attr(model$terms, "dataClasses")[-1]
coef <- as.data.frame(broom::tidy(model))
gmodel <- broom::glance(model)
allTerms <- lapply(seq_along(terms), function(i) {
var <- names(terms)[i]
if(var %in% colnames(data)) {
if (terms[i] %in% c("factor", "character")) {
adf <- as.data.frame(table(data[, var]))
cbind(var = var, adf, pos = 1:nrow(adf))
}
else if (terms[i] == "numeric") {
data.frame(var = var, Var1 = "", Freq = nrow(data),
pos = 1)
}
else {
vars = grep(paste0("^", var, "*."), coef$term,
value = TRUE)
data.frame(var = vars, Var1 = "", Freq = nrow(data),
pos = seq_along(vars))
}
} else {
message(var, "is not found in data columns, and will be skipped.")
}
})
allTermsDF <- do.call(rbind, allTerms)
colnames(allTermsDF) <- c("var", "level", "N",
"pos")
inds <- apply(allTermsDF[, 1:2], 1, paste0, collapse = "")
rownames(coef) <- gsub(coef$term, pattern = "`", replacement = "")
toShow <- cbind(allTermsDF, coef[inds, ])[, c("var", "level", "N", "p.value",
"estimate", "conf.low",
"conf.high", "pos")]
toShowExp <- toShow[, 5:7]
toShowExp[is.na(toShowExp)] <- 0
toShowExp <- format(exp(toShowExp), digits = noDigits)
toShowExpClean <- data.frame(toShow, pvalue = signif(toShow[, 4], noDigits + 1),
toShowExp)
toShowExpClean$stars <- paste0(round(toShowExpClean$p.value, noDigits + 1), " ",
ifelse(toShowExpClean$p.value < 0.05, "*", ""),
ifelse(toShowExpClean$p.value < 0.01, "*", ""),
ifelse(toShowExpClean$p.value < 0.001, "*", ""))
toShowExpClean$ci <- paste0("(", toShowExpClean[, "conf.low.1"],
" - ", toShowExpClean[, "conf.high.1"], ")")
toShowExpClean$estimate.1[is.na(toShowExpClean$estimate)] = refLabel
toShowExpClean$stars[which(toShowExpClean$p.value < 0.001)] = "<0.001 ***"
toShowExpClean$stars[is.na(toShowExpClean$estimate)] = ""
toShowExpClean$ci[is.na(toShowExpClean$estimate)] = ""
toShowExpClean$estimate[is.na(toShowExpClean$estimate)] = 0
toShowExpClean$var = as.character(toShowExpClean$var)
toShowExpClean$var[duplicated(toShowExpClean$var)] = ""
toShowExpClean$N <- paste0("(N=", toShowExpClean$N, ")")
toShowExpClean <- toShowExpClean[nrow(toShowExpClean):1, ]
rangeb <- range(toShowExpClean$conf.low, toShowExpClean$conf.high,
na.rm = TRUE)
breaks <- axisTicks(rangeb/2, log = TRUE, nint = 7)
rangeplot <- rangeb
rangeplot[1] <- rangeplot[1] - diff(rangeb)
rangeplot[2] <- rangeplot[2] + 0.15 * diff(rangeb)
width <- diff(rangeplot)
y_variable <- rangeplot[1] + cpositions[1] * width
y_nlevel <- rangeplot[1] + cpositions[2] * width
y_cistring <- rangeplot[1] + cpositions[3] * width
y_stars <- rangeb[2]
x_annotate <- seq_len(nrow(toShowExpClean))
annot_size_mm <- fontsize *
as.numeric(grid::convertX(unit(theme_get()$text$size, "pt"), "mm"))
p <- ggplot(toShowExpClean,
aes(seq_along(var), exp(estimate))) +
geom_rect(aes(xmin = seq_along(var) - 0.5,
xmax = seq_along(var) + 0.5,
ymin = exp(rangeplot[1]),
ymax = exp(rangeplot[2]),
fill = ordered(seq_along(var)%%2 + 1))) +
scale_fill_manual(values = c("#FFFFFF33", "#00000033"), guide = "none") +
geom_point(pch = 15, size = 4) +
geom_errorbar(aes(ymin = exp(conf.low), ymax = exp(conf.high)),
width = 0.15) +
geom_hline(yintercept = 1, linetype = 3) +
coord_flip(ylim = exp(rangeplot)) +
ggtitle(main) +
scale_y_log10(name = "", labels = sprintf("%g", breaks),
expand = c(0.02, 0.02), breaks = breaks) +
theme_light() +
theme(panel.grid.minor.y = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_blank(),
legend.position = "none",
panel.border = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
plot.title = element_text(hjust = 0.5)) +
xlab("") +
annotate(geom = "text", x = x_annotate, y = exp(y_variable),
label = toShowExpClean$var, fontface = "bold",
hjust = 0, size = annot_size_mm) +
annotate(geom = "text", x = x_annotate, y = exp(y_nlevel), hjust = 0,
label = toShowExpClean$level,
vjust = -0.1, size = annot_size_mm) +
annotate(geom = "text", x = x_annotate, y = exp(y_nlevel),
label = toShowExpClean$N, fontface = "italic", hjust = 0,
vjust = ifelse(toShowExpClean$level == "", 0.5, 1.1),
size = annot_size_mm) +
annotate(geom = "text", x = x_annotate, y = exp(y_cistring),
label = toShowExpClean$estimate.1, size = annot_size_mm,
vjust = ifelse(toShowExpClean$estimate.1 == "reference", 0.5, -0.1)) +
annotate(geom = "text", x = x_annotate, y = exp(y_cistring),
label = toShowExpClean$ci, size = annot_size_mm,
vjust = 1.1, fontface = "italic") +
annotate(geom = "text", x = x_annotate, y = exp(y_stars),
label = toShowExpClean$stars, size = annot_size_mm,
hjust = -0.2, fontface = "italic") +
annotate(geom = "text", x = 0.5, y = exp(y_variable),
label = paste0("# Events: ", gmodel$nevent,
"; Global p-value (Log-Rank): ",
format.pval(gmodel$p.value.log, eps = ".001"),
" \nAIC: ", round(gmodel$AIC, 2),
"; Concordance Index: ", round(gmodel$concordance, 2)),
size = annot_size_mm, hjust = 0, vjust = 1.2, fontface = "italic")
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
ggpubr::as_ggplot(gt)
}
这是
ggforest
的快照功能与目前相同,并进行了与上述相同的修改。如果包的创建者将来对包进行修改,这可能会损坏或过时。但现在,
ggforest2(stratamodel)
将产生与方法 1 相同的结果。
关于r - 当因子分层时,在 RStudio 中使用 ggforest 绘制 Cox PH 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63821274/
在使用 rstudio 中的“查找/替换”功能进行搜索时,如何(如果可能)在我的 Rscript 中计算搜索的总出现次数? 例如,假设我有以下脚本: a <- c(1,2,3) print(a) pr
我试图确保在保存文件时,Shiny 中 RStudio 中的代码折叠(通过 Alt+L)保持原位。目前,每次保存文件时,折叠都会消失。有人知道如何使折叠永久且独立于保存文件吗? 供引用:我在 Wind
我是一个非常注重视觉的人,希望区分#我注释掉的命令和##给我自己或同事的文件消息。我查看了 RStudio 是否支持不同类型的注释,但似乎不支持。有谁知道解决这个问题的方法吗? 谢谢! 最佳答案 你可
我正在使用 RStudio,并一直在尝试使用 rPython 包来为我处理一些电子邮件。这涉及到解压一些电子邮件附件,因此我需要使用比 2.7 更新的 Python 版本。 我在 ubuntu 上,所
我刚读了Google's R Style Guide , 并决定与函数名和变量中的字母大小写一致。如何在 RStudio 的编辑器中更改字母大小写?具体来说,如何换词 全部小写 全部大写 大写的大小写
有没有办法禁用 RStudio 中的所有断点?我查看了 RStudio 文档并进行了谷歌搜索,但找不到方法。 最佳答案 我也很好奇,特别想对断点有个大概的了解。 我跑了grep在我的项目文件夹中,这就
是否可以在 Rstudio 中更改背景颜色?我知道可以更改编辑器的主题,这是一个非常好的功能并且我已经在使用,但是是否可以更改其他窗口(环境、历史、文件等)的背景颜色... ) 到白色以外的其他东西,
我正在 RStudio 中开发一个包,并想使用断点来调试我的函数。但是,我一直遇到同样的问题:我设置了一个断点,RStudio 警告我必须构建并重新加载包才能激活断点(即使我刚刚构建并重新加载了包),
登录Desktop Rstudio后,会出现以下消息: Error in yaml.load(readLines(con), error.label = error.label, ...) : o
我已经开始学习 - Windows 操作系统上的机器学习类(class)。每当我启动 Spyder 3.2.4(Python 3.6) & RStudio(1.1.383) 的新实例时,每次我都需要在
我看了Fira Code我想使用列出的受支持编辑器之一进行尝试。所以我启动了 RStudio(Win 盒上的 0.99.491 版)并将字体设置为 Fira Code 但......没有。那么如何在
在 linux 中,我经常用鼠标突出显示文本进行复制,然后在其他地方单击鼠标中键进行粘贴。在 RStudio 中,这不起作用,强制使用 Ctrl+C 和 Ctrl+V 或右键单击菜单。我经常想在控制台
有没有办法改变 help 中显示的文本的字体大小? Rstudio 的选项卡? 我知道可以在所有面板中更改字体大小 Tools > Global > Options > Appearance ,但它不
我下载了最新版本的 Rstudio 以便能够自定义主题。 我按照这个教程安装了 Pandas 主题: https://towardsdatascience.com/customize-your-rst
我使用的是 RStudio 版本 1.1.456,它运行的是 R 版本 3.5.1。我在 64 位 Windows 7 Enterprise 上运行。 我刚开始使用 R Markdown,所以当我在
我一直使用 VScode 作为记笔记的主要 Markdown 平台,并且我已经习惯了实时预览功能。 现在我必须使用 Rmarkdown 生成可更新的报告,我想知道是否有人知道如何使用 Rstudio
我戴老花眼镜,可以阅读所有其他 Pane ,但经常不得不打开 R 寻求帮助,因为它的字体较大,虽然我觉得不方便。 我在 support.rstudio.com 中没有找到任何答案;其他人在 2014
实际上我需要使用 https 运行 rstudio 服务器。 默认为http://server-ip:8787 我正在关注这个文件-(ssl-配置) https://s3.amazonaws.com/
Anaconda 4.3.1 中包含的 Rstudio 安装在我的视网膜屏幕 macbook 上以低分辨率显示。 其他 anaconda 应用程序,以及独立版本的 Rstudio 看起来都不错。 关于
在我的代码完成执行后,我不断地在 RStudio 的编辑窗口中输入,当时我的目的是在控制台窗口中提供一些输入。是否有可以执行的 R 代码可以自动将焦点移动到 RStudio 的控制台窗口? 最佳答案
我是一名优秀的程序员,十分优秀!