Google Colab で R : カプランマイヤー法と生存曲線 編



おはこんばんちわ。今日も引き続きChatGPT先生をお迎えして、「Google Colab で R : カプランマイヤー法と生存曲線 編」というテーマで雑談したいと思います。以前[「ChatGPT と Python で学ぶ カプランマイヤー法と生存曲線」](https://qiita.com/maskot1977/items/6fdd55c9307c3da9a906)というテーマで雑談しましたが、そのR版です。それではChatGPT先生、よろしくお願いします。

---

### **assistant**:

よろしくお願いします。生存曲線とは生存時間に対して生存状態を描画したグラフで、カプランマイヤー法は生存曲線を描く一つの手法としてよく使われます。具体的には、ある時間点までにイベント（例えば、病気の発症や死亡など）が発生しなかった人の割合をプロットし、生存率の変化を視覚的に把握するのに使われます。

Rには `survival` と `Survminer` というパッケージがあり、これを使ってカプランマイヤー法と生存曲線を容易にプロットすることができます。これらのパッケージを使って分析を進めましょう。

まずは必要なパッケージをインストールし、データを読み込みます：

```R
install.packages("survival")
install.packages("survminer")
library(survival)
library(survminer)

# 生存時間データの読み込み
data(lung)
```

これでlungというデータフレームが使用可能になります。次に、Surv関数を使用して生存時間とイベント発生の有無から生存オブジェクトを作成します。このデータセットでは、生存時間は "time" 列に、イベント発生の有無は "status" 列に記録されています：

```R
surv_obj <- Surv(time = lung$time, event = lung$status)
```

次に、Survfit関数を使用して生存曲線を推定します：

```R
surv_fit <- survfit(surv_obj ~ 1) #~1は全体の生存曲線を見たいという意味
```

最後に、ggsurvplot関数を使用して生存曲線をプロットします：

```R
ggsurvplot(surv_fit, risk.table = TRUE)
```

これで、生存曲線がプロットされ、推定された生存時間とイベント発生の有無に応じたリスクテーブルも表示されます。リスクテーブルは、各時間点での生存者とイベント発生者の数を示しています。

---

### **user**:

ありがとうございます。以前教えていただいたように https://colab.research.google.com/notebook#create=true&language=r  にアクセスして Google Colaboratory 上で動かします。

最初のコードを動かしていますが、めっちゃ時間がかかってますね（まだ終わらない...）

```
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)

Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)

also installing the dependencies ‘numDeriv’, ‘SparseM’, ‘MatrixModels’, ‘minqa’, ‘nloptr’, ‘RcppEigen’, ‘carData’, ‘abind’, ‘pbkrtest’, ‘quantreg’, ‘lme4’, ‘Rcpp’, ‘corrplot’, ‘car’, ‘markdown’, ‘png’, ‘jpeg’, ‘ggrepel’, ‘ggsci’, ‘cowplot’, ‘ggsignif’, ‘polynom’, ‘rstatix’, ‘exactRankTests’, ‘mvtnorm’, ‘KMsurv’, ‘zoo’, ‘km.ci’, ‘xtable’, ‘gridtext’, ‘ggpubr’, ‘gridExtra’, ‘maxstat’, ‘survMisc’, ‘ggtext’
```

---

### **assistant**:

Rのパッケージのインストールは少々時間がかかることがあります。特に`survminer`パッケージは他の多くのパッケージに依存しているため、それらのパッケージも同時にインストールする必要があるので、そういったときは特に時間がかかる可能性があります。適切なインストールが完了すれば、`survival`と`survminer`パッケージを使用した分析はスムーズに行われるはずです。

ただし、全てのコードを一度に走らせるとエラーや不具合が起こる可能性もあるため、それぞれのコードは時間を置いて一つずつ走らせることをおすすめします。

なお、Google Colabでは新しいセッションを作成するたびにパッケージのインストールが必要になるため、この点もご注意ください。

---

### **user**:

終わりました。ですがワーニングが出ているようです。

```
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)

Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)

also installing the dependencies ‘numDeriv’, ‘SparseM’, ‘MatrixModels’, ‘minqa’, ‘nloptr’, ‘RcppEigen’, ‘carData’, ‘abind’, ‘pbkrtest’, ‘quantreg’, ‘lme4’, ‘Rcpp’, ‘corrplot’, ‘car’, ‘markdown’, ‘png’, ‘jpeg’, ‘ggrepel’, ‘ggsci’, ‘cowplot’, ‘ggsignif’, ‘polynom’, ‘rstatix’, ‘exactRankTests’, ‘mvtnorm’, ‘KMsurv’, ‘zoo’, ‘km.ci’, ‘xtable’, ‘gridtext’, ‘ggpubr’, ‘gridExtra’, ‘maxstat’, ‘survMisc’, ‘ggtext’


Loading required package: ggplot2

Loading required package: ggpubr


Attaching package: ‘survminer’


The following object is masked from ‘package:survival’:

    myeloma


Warning message in data(lung):
“data set ‘lung’ not found”
```

---

### **assistant**:

エラーメッセージを見ると、「data set ‘lung’ not found」となっていますね。恐らくパッケージの読み込みがうまく行ってない可能性があります。

`survival`パッケージには`lung`という名前のデータセットが含まれているはずです。試しに以下のコードを走らせて、`lung`データセットが存在するか確認してみてください。

```R
library(survival)
data("lung")
```

これで`lung`というデータセットが使えるようになるはずです。その後、生存時間とイベント発生の有無から生存オブジェクトを作成し、生存曲線を推定し、プロットするコードを続けて走らせてみてください。

---

### **user**:

ありがとうございます。このような結果になりました。

```
Warning message in data("lung"):
“data set ‘lung’ not found”
```

---

### **assistant**:

このエラーメッセージから見るに、`lung`データセットが見つからない模様です。`survival`パッケージを再度正しくロードして、データセットがロードされているか確認してみてください。

もしまだ問題が解決しない場合は、他のビルトインデータセットに置き換えて試すことも可能です。例えば、`survival`パッケージに含まれる`ovarian`データセットを使うこともできます。その場合、以下のようにコードを書き換えて試してみてください：

```R
data("ovarian")
surv_obj <- Surv(time = ovarian$futime, event = ovarian$fustat)
surv_fit <- survfit(surv_obj ~ 1)
ggsurvplot(surv_fit, risk.table = TRUE)
```

ここでは、`ovarian`データセットの`futime`列を生存時間、`fustat`列をイベント発生の有無として使っています。

---

### **user**:

次の結果が得られました。


```
Warning message in data("ovarian"):
“data set ‘ovarian’ not found”
Error in .get_data(fit, data = data, complain = FALSE): The `data` argument should be provided either to ggsurvfit or survfit.
Traceback:

1. ggsurvplot(surv_fit, risk.table = TRUE)
2. do.call(ggsurvplot_core, opts)
3. (function (fit, data = NULL, fun = NULL, color = NULL, palette = NULL, 
 .     linetype = 1, break.x.by = NULL, break.y.by = NULL, break.time.by = NULL, 
 .     surv.scale = c("default", "percent"), xscale = 1, conf.int = FALSE, 
 .     conf.int.fill = "gray", conf.int.style = "ribbon", conf.int.alpha = 0.3, 
 .     censor = TRUE, censor.shape = "+", censor.size = 4.5, pval = FALSE, 
 .     pval.size = 5, pval.coord = c(NULL, NULL), test.for.trend = FALSE, 
 .     pval.method = FALSE, pval.method.size = pval.size, pval.method.coord = c(NULL, 
 .         NULL), log.rank.weights = c("survdiff", "1", "n", "sqrtN", 
 .         "S1", "S2", "FH_p=1_q=1"), title = NULL, xlab = "Time", 
 .     ylab = "Survival probability", xlim = NULL, ylim = NULL, 
 .     axes.offset = TRUE, legend = c("top", "bottom", "left", "right", 
 .         "none"), legend.title = "Strata", legend.labs = NULL, 
 .     fontsize = 4.5, font.family = "", tables.height = 0.25, tables.y.text = TRUE, 
 .     tables.col = "black", tables.y.text.col = TRUE, risk.table = FALSE, 
 .     risk.table.pos = c("out", "in"), risk.table.title = NULL, 
 .     risk.table.col = tables.col, risk.table.fontsize = fontsize, 
 .     risk.table.y.text = tables.y.text, risk.table.y.text.col = tables.y.text.col, 
 .     risk.table.height = tables.height, surv.plot.height = 0.75, 
 .     ncensor.plot.height = tables.height, cumevents.height = tables.height, 
 .     cumcensor.height = tables.height, ncensor.plot = FALSE, ncensor.plot.title = NULL, 
 .     cumevents = FALSE, cumevents.col = tables.col, cumevents.title = NULL, 
 .     cumevents.y.text = tables.y.text, cumevents.y.text.col = tables.y.text.col, 
 .     cumcensor = FALSE, cumcensor.col = tables.col, cumcensor.title = NULL, 
 .     cumcensor.y.text = tables.y.text, cumcensor.y.text.col = tables.y.text.col, 
 .     surv.median.line = c("none", "hv", "h", "v"), ggtheme = theme_survminer(), 
 .     tables.theme = ggtheme, ...) 
 . {
 .     if (!inherits(fit, "survfit")) 
 .         stop("Can't handle an object of class ", class(fit))
 .     surv.median.line <- match.arg(surv.median.line)
 .     stopifnot(log.rank.weights %in% c("survdiff", "1", "n", "sqrtN", 
 .         "S1", "S2", "FH_p=1_q=1"))
 .     log.rank.weights <- match.arg(log.rank.weights)
 .     if (ncensor.plot & cumcensor) {
 .         warning("Both ncensor.plot and cumsensor are TRUE.", 
 .             "In this case, we consider only cumcensor.", call. = FALSE)
 .         ncensor.plot <- FALSE
 .     }
 .     if (cumcensor) 
 .         ncensor.plot.height <- cumcensor.height
 .     if (is.null(ncensor.plot.title)) 
 .         ncensor.plot.title <- "Number of censoring"
 .     if (is.null(cumcensor.title)) 
 .         cumcensor.title <- "Cumulative number of censoring"
 .     if (is.null(cumevents.title)) 
 .         cumevents.title <- "Cumulative number of events"
 .     risk.table.pos <- match.arg(risk.table.pos)
 .     risktable <- .parse_risk_table_arg(risk.table)
 .     risk.table <- risktable$display
 .     risk.table.type <- risktable$type
 .     extra.params <- list(...)
 .     .expand <- ggplot2::waiver()
 .     if (!axes.offset) 
 .         .expand <- c(0, 0)
 .     data <- .get_data(fit, data = data, complain = FALSE)
 .     d <- surv_summary(fit, data = data)
 .     if (!is.null(fit$start.time)) 
 .         d <- subset(d, d$time >= fit$start.time)
 .     xmin <- ifelse(.is_cloglog(fun), min(c(1, d$time)), 0)
 .     if (!is.null(fit$start.time)) 
 .         xmin <- fit$start.time
 .     xmax <- .get_default_breaks(d$time, .log = .is_cloglog(fun)) %>% 
 .         max()
 .     if (is.null(xlim)) 
 .         xlim <- c(xmin, xmax)
 .     p <- ggsurvplot_df(d, fun = fun, color = color, palette = palette, 
 .         linetype = linetype, break.x.by = break.x.by, break.time.by = break.time.by, 
 .         break.y.by = break.y.by, surv.scale = surv.scale, xscale = xscale, 
 .         conf.int = conf.int, conf.int.fill = conf.int.fill, conf.int.style = conf.int.style, 
 .         conf.int.alpha = conf.int.alpha, censor = censor, censor.shape = censor.shape, 
 .         censor.size = censor.size, title = title, xlab = xlab, 
 .         ylab = ylab, xlim = xlim, ylim = ylim, axes.offset = axes.offset, 
 .         legend = legend, legend.title = legend.title, legend.labs = legend.labs, 
 .         ggtheme = ggtheme, ...)
 .     pms <- attr(p, "parameters")
 .     color <- surv.color <- pms$color
 .     pval <- surv_pvalue(fit, method = log.rank.weights, data = data, 
 .         pval = pval, pval.coord = pval.coord, pval.method.coord = pval.method.coord, 
 .         test.for.trend = test.for.trend)
 .     if (pval$pval.txt != "") {
 .         p <- p + ggplot2::annotate("text", x = pval$pval.x, y = pval$pval.y, 
 .             label = pval$pval.txt, size = pval.size, hjust = 0, 
 .             family = font.family)
 .         if (pval.method) 
 .             p <- p + ggplot2::annotate("text", x = pval$method.x, 
 .                 y = pval$method.y, label = pval$method, size = pval.method.size, 
 .                 hjust = 0, family = font.family)
 .     }
 .     if (surv.median.line %in% c("hv", "h", "v")) 
 .         p <- .add_surv_median(p, fit, type = surv.median.line, 
 .             fun = fun, data = data)
 .     res <- list(plot = p)
 .     if (risk.table | cumevents | cumcensor | ncensor.plot) {
 .         scurve_cols <- .extract_ggplot_colors(p, grp.levels = pms$legend.labs)
 .     }
 .     pms <- attr(p, "parameters")
 .     surv.color <- pms$color
 .     pms$fit <- fit
 .     pms$data <- data
 .     pms$risk.table.type <- risk.table.type
 .     pms$risk.table.title <- risk.table.title
 .     pms$cumevents.title <- cumevents.title
 .     pms$cumcensor.title <- cumcensor.title
 .     pms$fontsize <- fontsize
 .     pms$ggtheme <- ggtheme
 .     pms$ylab <- pms$legend.title
 .     pms$tables.theme <- tables.theme
 .     pms$y.text <- tables.y.text
 .     pms$color <- tables.col
 .     pms$font.family <- font.family
 .     pms$axes.offset <- axes.offset
 .     if (risk.table) {
 .         if (risk.table.pos == "in") 
 .             risk.table.col = surv.color
 .         pms$color <- risk.table.col
 .         pms$title <- risk.table.title
 .         pms$y.text <- risk.table.y.text
 .         pms$y.text.col <- risk.table.y.text.col
 .         pms$fontsize <- risk.table.fontsize
 .         pms$survtable <- "risk.table"
 .         if (risk.table.y.text.col) 
 .             pms$y.text.col <- scurve_cols
 .         res$table <- risktable <- do.call(ggsurvtable, pms)
 .     }
 .     if (cumevents) {
 .         pms$color <- cumevents.col
 .         pms$title <- cumevents.title
 .         pms$y.text <- cumevents.y.text
 .         if (cumevents.y.text.col) 
 .             pms$y.text.col <- scurve_cols
 .         pms$fontsize <- fontsize
 .         pms$survtable <- "cumevents"
 .         res$cumevents <- do.call(ggsurvtable, pms)
 .     }
 .     if (ncensor.plot) {
 .         ncensor_plot <- ggplot(d, aes_string("time", "n.censor")) + 
 .             ggpubr::geom_exec(geom_bar, d, color = surv.color, 
 .                 fill = surv.color, stat = "identity", position = "dodge") + 
 .             coord_cartesian(xlim = xlim) + scale_y_continuous(breaks = sort(unique(d$n.censor))) + 
 .             ggtheme
 .         ncensor_plot <- ggpubr::ggpar(ncensor_plot, palette = pms$palette)
 .         ncensor_plot <- ncensor_plot + ggplot2::labs(color = pms$legend.title, 
 .             fill = pms$legend.title, x = xlab, y = "n.censor", 
 .             title = ncensor.plot.title)
 .         ncensor_plot <- .set_general_gpar(ncensor_plot, ...)
 .         ncensor_plot <- .set_ncensorplot_gpar(ncensor_plot, ...)
 .         ncensor_plot <- ncensor_plot + tables.theme
 .         if (!pms$xlog) 
 .             ncensor_plot <- ncensor_plot + scale_x_continuous(breaks = pms$time.breaks, 
 .                 labels = pms$xticklabels, expand = .expand)
 .         else ncensor_plot <- ncensor_plot + ggplot2::scale_x_continuous(breaks = pms$time.breaks, 
 .             trans = "log10", labels = pms$xticklabels)
 .     }
 .     else if (cumcensor) {
 .         pms$color <- cumcensor.col
 .         pms$title <- cumcensor.title
 .         if (cumcensor.y.text.col) 
 .             pms$y.text.col <- scurve_cols
 .         pms$fontsize <- fontsize
 .         pms$survtable <- "cumcensor"
 .         ncensor_plot <- do.call(ggsurvtable, pms)
 .     }
 .     if (ncensor.plot | cumcensor) 
 .         res$ncensor.plot <- ncensor_plot
 .     heights <- list(plot = surv.plot.height, table = ifelse(risk.table, 
 .         risk.table.height, 0), ncensor.plot = ifelse(ncensor.plot | 
 .         cumcensor, ncensor.plot.height, 0), cumevents = ifelse(cumevents, 
 .         cumevents.height, 0))
 .     y.text <- list(table = risk.table.y.text, cumevents = cumevents.y.text, 
 .         cumcensor = cumcensor.y.text)
 .     y.text.col <- list(table = risk.table.y.text.col, cumevents = cumevents.y.text.col, 
 .         cumcensor = cumcensor.y.text.col)
 .     res$data.survplot <- d
 .     res$data.survtable <- .get_timepoints_survsummary(fit, data, 
 .         pms$time.breaks)
 .     class(res) <- c("ggsurvplot", "ggsurv", "list")
 .     attr(res, "heights") <- heights
 .     attr(res, "y.text") <- y.text
 .     attr(res, "y.text.col") <- y.text.col
 .     attr(res, "legend.position") <- legend
 .     attr(res, "legend.labs") <- legend.labs
 .     attr(res, "cumcensor") <- cumcensor
 .     attr(res, "risk.table.pos") <- risk.table.pos
 .     attr(res, "axes.offset") <- axes.offset
 .     res
 . })(fit = structure(list(n = 26L, time = c(59, 115, 156, 268, 
 . 329, 353, 365, 377, 421, 431, 448, 464, 475, 477, 563, 638, 744, 
 . 769, 770, 803, 855, 1040, 1106, 1129, 1206, 1227), n.risk = c(26, 
 . 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 
 . 9, 8, 7, 6, 5, 4, 3, 2, 1), n.event = c(1, 1, 1, 1, 1, 1, 1, 
 . 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), n.censor = c(0, 
 . 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 
 . 1, 1, 1, 1), surv = c(0.961538461538462, 0.923076923076923, 0.884615384615385, 
 . 0.846153846153846, 0.807692307692308, 0.769230769230769, 0.730769230769231, 
 . 0.730769230769231, 0.730769230769231, 0.687782805429864, 0.687782805429864, 
 . 0.641930618401207, 0.596078431372549, 0.596078431372549, 0.54640522875817, 
 . 0.496732026143791, 0.496732026143791, 0.496732026143791, 0.496732026143791, 
 . 0.496732026143791, 0.496732026143791, 0.496732026143791, 0.496732026143791, 
 . 0.496732026143791, 0.496732026143791, 0.496732026143791), std.err = c(0.0392232270276368, 
 . 0.0566138517072298, 0.0708288246974828, 0.0836242010007091, 0.0956948752938691, 
 . 0.107417231105915, 0.119037979174001, 0.119037979174001, 0.119037979174001, 
 . 0.133590834543636, 0.133590834543636, 0.150360951832482, 0.167639259514219, 
 . 0.167639259514219, 0.188888006252999, 0.211588251084842, 0.211588251084842, 
 . 0.211588251084842, 0.211588251084842, 0.211588251084842, 0.211588251084842, 
 . 0.211588251084842, 0.211588251084842, 0.211588251084842, 0.211588251084842, 
 . 0.211588251084842), cumhaz = c(0.0384615384615385, 0.0784615384615385, 
 . 0.120128205128205, 0.16360646599777, 0.209061011452316, 0.256680059071363, 
 . 0.306680059071363, 0.306680059071363, 0.306680059071363, 0.365503588483128, 
 . 0.365503588483128, 0.432170255149795, 0.503598826578366, 0.503598826578366, 
 . 0.5869321599117, 0.67784125082079, 0.67784125082079, 0.67784125082079, 
 . 0.67784125082079, 0.67784125082079, 0.67784125082079, 0.67784125082079, 
 . 0.67784125082079, 0.67784125082079, 0.67784125082079, 0.67784125082079
 . ), std.chaz = c(0.0384615384615385, 0.0554913501442198, 0.069393090808376, 
 . 0.0818887063042364, 0.0936582934003221, 0.10506878517812, 0.11635914067578, 
 . 0.11635914067578, 0.11635914067578, 0.130382733639323, 0.130382733639323, 
 . 0.146438047227171, 0.162929869858273, 0.162929869858273, 0.183004335840652, 
 . 0.204340523994619, 0.204340523994619, 0.204340523994619, 0.204340523994619, 
 . 0.204340523994619, 0.204340523994619, 0.204340523994619, 0.204340523994619, 
 . 0.204340523994619, 0.204340523994619, 0.204340523994619), type = "right", 
 .     logse = TRUE, conf.int = 0.95, conf.type = "log", lower = c(0.890389006776242, 
 .     0.826129433945158, 0.769954183720261, 0.718237843191738, 
 .     0.669561265046851, 0.623193528520079, 0.578701944188642, 
 .     0.578701944188642, 0.578701944188642, 0.529344725133514, 
 .     0.529344725133514, 0.478080044961745, 0.429149500239206, 
 .     0.429149500239206, 0.377340207736834, 0.328108828053112, 
 .     0.328108828053112, 0.328108828053112, 0.328108828053112, 
 .     0.328108828053112, 0.328108828053112, 0.328108828053112, 
 .     0.328108828053112, 0.328108828053112, 0.328108828053112, 
 .     0.328108828053112), upper = c(1, 1, 1, 0.996851305104251, 
 .     0.974319898657336, 0.949489924480652, 0.922795705115128, 
 .     0.922795705115128, 0.922795705115128, 0.893642960786396, 
 .     0.893642960786396, 0.861937081841449, 0.827938739645533, 
 .     0.827938739645533, 0.791218820291978, 0.752014833800737, 
 .     0.752014833800737, 0.752014833800737, 0.752014833800737, 
 .     0.752014833800737, 0.752014833800737, 0.752014833800737, 
 .     0.752014833800737, 0.752014833800737, 0.752014833800737, 
 .     0.752014833800737), call = survfit(formula = surv_obj ~ 1)), class = "survfit"), 
 .     data = NULL, fun = NULL, color = NULL, palette = NULL, linetype = 1, 
 .     conf.int = TRUE, pval = FALSE, pval.method = FALSE, test.for.trend = FALSE, 
 .     surv.median.line = "none", risk.table = TRUE, cumevents = FALSE, 
 .     cumcensor = FALSE, tables.height = 0.25, ggtheme = structure(list(
 .         line = structure(list(colour = "black", linewidth = 0.545454545454545, 
 .             linetype = 1, lineend = "butt", arrow = FALSE, inherit.blank = TRUE), class = c("element_line", 
 .         "element")), rect = structure(list(fill = "white", colour = "black", 
 .             linewidth = 0.545454545454545, linetype = 1, inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), text = structure(list(family = "", face = "plain", 
 .             colour = "black", size = 12, hjust = 0.5, vjust = 0.5, 
 .             angle = 0, lineheight = 0.9, margin = structure(c(0, 
 .             0, 0, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = FALSE, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), title = NULL, aspect.ratio = NULL, axis.title = NULL, 
 .         axis.title.x = structure(list(family = NULL, face = "plain", 
 .             colour = "black", size = 14, hjust = NULL, vjust = 1, 
 .             angle = NULL, lineheight = NULL, margin = structure(c(3, 
 .             0, 0, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), axis.title.x.top = structure(list(family = NULL, 
 .             face = NULL, colour = NULL, size = NULL, hjust = NULL, 
 .             vjust = 0, angle = NULL, lineheight = NULL, margin = structure(c(0, 
 .             0, 3, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.title.x.bottom = NULL, axis.title.y = structure(list(
 .             family = NULL, face = "plain", colour = "black", 
 .             size = 14, hjust = NULL, vjust = 1, angle = 90, lineheight = NULL, 
 .             margin = structure(c(0, 3, 0, 0), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = FALSE), class = c("element_text", 
 .         "element")), axis.title.y.left = NULL, axis.title.y.right = structure(list(
 .             family = NULL, face = NULL, colour = NULL, size = NULL, 
 .             hjust = NULL, vjust = 0, angle = -90, lineheight = NULL, 
 .             margin = structure(c(0, 0, 0, 3), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.text = structure(list(family = NULL, 
 .             face = NULL, colour = "grey30", size = structure(0.8, class = "rel"), 
 .             hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL, 
 .             margin = NULL, debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.text.x = structure(list(family = NULL, 
 .             face = "plain", colour = "black", size = 12, hjust = NULL, 
 .             vjust = 1, angle = 0, lineheight = NULL, margin = structure(c(2.4, 
 .             0, 0, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), axis.text.x.top = structure(list(family = NULL, 
 .             face = NULL, colour = NULL, size = NULL, hjust = NULL, 
 .             vjust = 0, angle = NULL, lineheight = NULL, margin = structure(c(0, 
 .             0, 2.4, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.text.x.bottom = NULL, axis.text.y = structure(list(
 .             family = NULL, face = "plain", colour = "black", 
 .             size = 12, hjust = 1, vjust = NULL, angle = 0, lineheight = NULL, 
 .             margin = structure(c(0, 2.4, 0, 0), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = FALSE), class = c("element_text", 
 .         "element")), axis.text.y.left = NULL, axis.text.y.right = structure(list(
 .             family = NULL, face = NULL, colour = NULL, size = NULL, 
 .             hjust = 0, vjust = NULL, angle = NULL, lineheight = NULL, 
 .             margin = structure(c(0, 0, 0, 2.4), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.ticks = structure(list(colour = "grey20", 
 .             linewidth = NULL, linetype = NULL, lineend = NULL, 
 .             arrow = FALSE, inherit.blank = TRUE), class = c("element_line", 
 .         "element")), axis.ticks.x = NULL, axis.ticks.x.top = NULL, 
 .         axis.ticks.x.bottom = NULL, axis.ticks.y = NULL, axis.ticks.y.left = NULL, 
 .         axis.ticks.y.right = NULL, axis.ticks.length = structure(3, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), axis.ticks.length.x = NULL, axis.ticks.length.x.top = NULL, 
 .         axis.ticks.length.x.bottom = NULL, axis.ticks.length.y = NULL, 
 .         axis.ticks.length.y.left = NULL, axis.ticks.length.y.right = NULL, 
 .         axis.line = structure(list(colour = "black", linewidth = structure(1, class = "rel"), 
 .             linetype = NULL, lineend = NULL, arrow = FALSE, inherit.blank = TRUE), class = c("element_line", 
 .         "element")), axis.line.x = NULL, axis.line.x.top = NULL, 
 .         axis.line.x.bottom = NULL, axis.line.y = NULL, axis.line.y.left = NULL, 
 .         axis.line.y.right = NULL, legend.background = structure(list(
 .             fill = NULL, colour = NA, linewidth = NULL, linetype = NULL, 
 .             inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), legend.margin = structure(c(6, 6, 6, 6), unit = 8L, class = c("margin", 
 .         "simpleUnit", "unit", "unit_v2")), legend.spacing = structure(12, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), legend.spacing.x = NULL, legend.spacing.y = NULL, 
 .         legend.key = structure(list(), class = c("element_blank", 
 .         "element")), legend.key.size = structure(1.2, unit = 3L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), legend.key.height = NULL, legend.key.width = NULL, 
 .         legend.text = structure(list(family = NULL, face = "plain", 
 .             colour = "black", size = 10, hjust = NULL, vjust = NULL, 
 .             angle = NULL, lineheight = NULL, margin = NULL, debug = NULL, 
 .             inherit.blank = FALSE), class = c("element_text", 
 .         "element")), legend.text.align = NULL, legend.title = structure(list(
 .             family = NULL, face = "plain", colour = "black", 
 .             size = 10, hjust = 0, vjust = NULL, angle = NULL, 
 .             lineheight = NULL, margin = NULL, debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), legend.title.align = NULL, legend.position = "top", 
 .         legend.direction = NULL, legend.justification = "center", 
 .         legend.box = NULL, legend.box.just = NULL, legend.box.margin = structure(c(0, 
 .         0, 0, 0), unit = 1L, class = c("margin", "simpleUnit", 
 .         "unit", "unit_v2")), legend.box.background = structure(list(), class = c("element_blank", 
 .         "element")), legend.box.spacing = structure(12, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), panel.background = structure(list(
 .             fill = "white", colour = NA, linewidth = NULL, linetype = NULL, 
 .             inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), panel.border = structure(list(), class = c("element_blank", 
 .         "element")), panel.spacing = structure(6, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), panel.spacing.x = NULL, panel.spacing.y = NULL, 
 .         panel.grid = structure(list(colour = "grey92", linewidth = NULL, 
 .             linetype = NULL, lineend = NULL, arrow = FALSE, inherit.blank = TRUE), class = c("element_line", 
 .         "element")), panel.grid.major = structure(list(), class = c("element_blank", 
 .         "element")), panel.grid.minor = structure(list(), class = c("element_blank", 
 .         "element")), panel.grid.major.x = NULL, panel.grid.major.y = NULL, 
 .         panel.grid.minor.x = NULL, panel.grid.minor.y = NULL, 
 .         panel.ontop = FALSE, plot.background = structure(list(
 .             fill = NULL, colour = "white", linewidth = NULL, 
 .             linetype = NULL, inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), plot.title = structure(list(family = NULL, 
 .             face = "plain", colour = "black", size = 16, hjust = 0, 
 .             vjust = 1, angle = NULL, lineheight = 1, margin = structure(c(0, 
 .             0, 6, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), plot.title.position = "panel", plot.subtitle = structure(list(
 .             family = NULL, face = "plain", colour = "black", 
 .             size = 15, hjust = 0, vjust = 1, angle = NULL, lineheight = 1, 
 .             margin = structure(c(0, 0, 6, 0), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = FALSE), class = c("element_text", 
 .         "element")), plot.caption = structure(list(family = NULL, 
 .             face = "plain", colour = "black", size = 15, hjust = 1, 
 .             vjust = 1, angle = NULL, lineheight = 1, margin = structure(c(6, 
 .             0, 0, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), plot.caption.position = "panel", plot.tag = structure(list(
 .             family = NULL, face = NULL, colour = NULL, size = structure(1.2, class = "rel"), 
 .             hjust = 0.5, vjust = 0.5, angle = NULL, lineheight = NULL, 
 .             margin = NULL, debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), plot.tag.position = "topleft", plot.margin = structure(c(6, 
 .         6, 6, 6), unit = 8L, class = c("margin", "simpleUnit", 
 .         "unit", "unit_v2")), strip.background = structure(list(
 .             fill = "white", colour = "black", linewidth = structure(2, class = "rel"), 
 .             linetype = NULL, inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), strip.background.x = NULL, strip.background.y = NULL, 
 .         strip.clip = "inherit", strip.placement = "inside", strip.text = structure(list(
 .             family = NULL, face = NULL, colour = "grey10", size = structure(0.8, class = "rel"), 
 .             hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL, 
 .             margin = structure(c(4.8, 4.8, 4.8, 4.8), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = TRUE), class = c("element_text", 
 .         "element")), strip.text.x = NULL, strip.text.x.bottom = NULL, 
 .         strip.text.x.top = NULL, strip.text.y = structure(list(
 .             family = NULL, face = NULL, colour = NULL, size = NULL, 
 .             hjust = NULL, vjust = NULL, angle = -90, lineheight = NULL, 
 .             margin = NULL, debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), strip.text.y.left = structure(list(family = NULL, 
 .             face = NULL, colour = NULL, size = NULL, hjust = NULL, 
 .             vjust = NULL, angle = 90, lineheight = NULL, margin = NULL, 
 .             debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), strip.text.y.right = NULL, strip.switch.pad.grid = structure(3, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), strip.switch.pad.wrap = structure(3, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2"))), class = "theme", complete = TRUE, validate = TRUE), 
 .     tables.theme = structure(list(line = structure(list(colour = "black", 
 .         linewidth = 0.545454545454545, linetype = 1, lineend = "butt", 
 .         arrow = FALSE, inherit.blank = TRUE), class = c("element_line", 
 .     "element")), rect = structure(list(fill = "white", colour = "black", 
 .         linewidth = 0.545454545454545, linetype = 1, inherit.blank = TRUE), class = c("element_rect", 
 .     "element")), text = structure(list(family = "", face = "plain", 
 .         colour = "black", size = 12, hjust = 0.5, vjust = 0.5, 
 .         angle = 0, lineheight = 0.9, margin = structure(c(0, 
 .         0, 0, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .         "unit", "unit_v2")), debug = FALSE, inherit.blank = TRUE), class = c("element_text", 
 .     "element")), title = NULL, aspect.ratio = NULL, axis.title = NULL, 
 .         axis.title.x = structure(list(family = NULL, face = "plain", 
 .             colour = "black", size = 14, hjust = NULL, vjust = 1, 
 .             angle = NULL, lineheight = NULL, margin = structure(c(3, 
 .             0, 0, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), axis.title.x.top = structure(list(family = NULL, 
 .             face = NULL, colour = NULL, size = NULL, hjust = NULL, 
 .             vjust = 0, angle = NULL, lineheight = NULL, margin = structure(c(0, 
 .             0, 3, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.title.x.bottom = NULL, axis.title.y = structure(list(
 .             family = NULL, face = "plain", colour = "black", 
 .             size = 14, hjust = NULL, vjust = 1, angle = 90, lineheight = NULL, 
 .             margin = structure(c(0, 3, 0, 0), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = FALSE), class = c("element_text", 
 .         "element")), axis.title.y.left = NULL, axis.title.y.right = structure(list(
 .             family = NULL, face = NULL, colour = NULL, size = NULL, 
 .             hjust = NULL, vjust = 0, angle = -90, lineheight = NULL, 
 .             margin = structure(c(0, 0, 0, 3), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.text = structure(list(family = NULL, 
 .             face = NULL, colour = "grey30", size = structure(0.8, class = "rel"), 
 .             hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL, 
 .             margin = NULL, debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.text.x = structure(list(family = NULL, 
 .             face = "plain", colour = "black", size = 12, hjust = NULL, 
 .             vjust = 1, angle = 0, lineheight = NULL, margin = structure(c(2.4, 
 .             0, 0, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), axis.text.x.top = structure(list(family = NULL, 
 .             face = NULL, colour = NULL, size = NULL, hjust = NULL, 
 .             vjust = 0, angle = NULL, lineheight = NULL, margin = structure(c(0, 
 .             0, 2.4, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.text.x.bottom = NULL, axis.text.y = structure(list(
 .             family = NULL, face = "plain", colour = "black", 
 .             size = 12, hjust = 1, vjust = NULL, angle = 0, lineheight = NULL, 
 .             margin = structure(c(0, 2.4, 0, 0), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = FALSE), class = c("element_text", 
 .         "element")), axis.text.y.left = NULL, axis.text.y.right = structure(list(
 .             family = NULL, face = NULL, colour = NULL, size = NULL, 
 .             hjust = 0, vjust = NULL, angle = NULL, lineheight = NULL, 
 .             margin = structure(c(0, 0, 0, 2.4), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = TRUE), class = c("element_text", 
 .         "element")), axis.ticks = structure(list(colour = "grey20", 
 .             linewidth = NULL, linetype = NULL, lineend = NULL, 
 .             arrow = FALSE, inherit.blank = TRUE), class = c("element_line", 
 .         "element")), axis.ticks.x = NULL, axis.ticks.x.top = NULL, 
 .         axis.ticks.x.bottom = NULL, axis.ticks.y = NULL, axis.ticks.y.left = NULL, 
 .         axis.ticks.y.right = NULL, axis.ticks.length = structure(3, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), axis.ticks.length.x = NULL, axis.ticks.length.x.top = NULL, 
 .         axis.ticks.length.x.bottom = NULL, axis.ticks.length.y = NULL, 
 .         axis.ticks.length.y.left = NULL, axis.ticks.length.y.right = NULL, 
 .         axis.line = structure(list(colour = "black", linewidth = structure(1, class = "rel"), 
 .             linetype = NULL, lineend = NULL, arrow = FALSE, inherit.blank = TRUE), class = c("element_line", 
 .         "element")), axis.line.x = NULL, axis.line.x.top = NULL, 
 .         axis.line.x.bottom = NULL, axis.line.y = NULL, axis.line.y.left = NULL, 
 .         axis.line.y.right = NULL, legend.background = structure(list(
 .             fill = NULL, colour = NA, linewidth = NULL, linetype = NULL, 
 .             inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), legend.margin = structure(c(6, 6, 6, 6), unit = 8L, class = c("margin", 
 .         "simpleUnit", "unit", "unit_v2")), legend.spacing = structure(12, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), legend.spacing.x = NULL, legend.spacing.y = NULL, 
 .         legend.key = structure(list(), class = c("element_blank", 
 .         "element")), legend.key.size = structure(1.2, unit = 3L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), legend.key.height = NULL, legend.key.width = NULL, 
 .         legend.text = structure(list(family = NULL, face = "plain", 
 .             colour = "black", size = 10, hjust = NULL, vjust = NULL, 
 .             angle = NULL, lineheight = NULL, margin = NULL, debug = NULL, 
 .             inherit.blank = FALSE), class = c("element_text", 
 .         "element")), legend.text.align = NULL, legend.title = structure(list(
 .             family = NULL, face = "plain", colour = "black", 
 .             size = 10, hjust = 0, vjust = NULL, angle = NULL, 
 .             lineheight = NULL, margin = NULL, debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), legend.title.align = NULL, legend.position = "top", 
 .         legend.direction = NULL, legend.justification = "center", 
 .         legend.box = NULL, legend.box.just = NULL, legend.box.margin = structure(c(0, 
 .         0, 0, 0), unit = 1L, class = c("margin", "simpleUnit", 
 .         "unit", "unit_v2")), legend.box.background = structure(list(), class = c("element_blank", 
 .         "element")), legend.box.spacing = structure(12, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), panel.background = structure(list(
 .             fill = "white", colour = NA, linewidth = NULL, linetype = NULL, 
 .             inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), panel.border = structure(list(), class = c("element_blank", 
 .         "element")), panel.spacing = structure(6, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), panel.spacing.x = NULL, panel.spacing.y = NULL, 
 .         panel.grid = structure(list(colour = "grey92", linewidth = NULL, 
 .             linetype = NULL, lineend = NULL, arrow = FALSE, inherit.blank = TRUE), class = c("element_line", 
 .         "element")), panel.grid.major = structure(list(), class = c("element_blank", 
 .         "element")), panel.grid.minor = structure(list(), class = c("element_blank", 
 .         "element")), panel.grid.major.x = NULL, panel.grid.major.y = NULL, 
 .         panel.grid.minor.x = NULL, panel.grid.minor.y = NULL, 
 .         panel.ontop = FALSE, plot.background = structure(list(
 .             fill = NULL, colour = "white", linewidth = NULL, 
 .             linetype = NULL, inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), plot.title = structure(list(family = NULL, 
 .             face = "plain", colour = "black", size = 16, hjust = 0, 
 .             vjust = 1, angle = NULL, lineheight = 1, margin = structure(c(0, 
 .             0, 6, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), plot.title.position = "panel", plot.subtitle = structure(list(
 .             family = NULL, face = "plain", colour = "black", 
 .             size = 15, hjust = 0, vjust = 1, angle = NULL, lineheight = 1, 
 .             margin = structure(c(0, 0, 6, 0), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = FALSE), class = c("element_text", 
 .         "element")), plot.caption = structure(list(family = NULL, 
 .             face = "plain", colour = "black", size = 15, hjust = 1, 
 .             vjust = 1, angle = NULL, lineheight = 1, margin = structure(c(6, 
 .             0, 0, 0), unit = 8L, class = c("margin", "simpleUnit", 
 .             "unit", "unit_v2")), debug = NULL, inherit.blank = FALSE), class = c("element_text", 
 .         "element")), plot.caption.position = "panel", plot.tag = structure(list(
 .             family = NULL, face = NULL, colour = NULL, size = structure(1.2, class = "rel"), 
 .             hjust = 0.5, vjust = 0.5, angle = NULL, lineheight = NULL, 
 .             margin = NULL, debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), plot.tag.position = "topleft", plot.margin = structure(c(6, 
 .         6, 6, 6), unit = 8L, class = c("margin", "simpleUnit", 
 .         "unit", "unit_v2")), strip.background = structure(list(
 .             fill = "white", colour = "black", linewidth = structure(2, class = "rel"), 
 .             linetype = NULL, inherit.blank = TRUE), class = c("element_rect", 
 .         "element")), strip.background.x = NULL, strip.background.y = NULL, 
 .         strip.clip = "inherit", strip.placement = "inside", strip.text = structure(list(
 .             family = NULL, face = NULL, colour = "grey10", size = structure(0.8, class = "rel"), 
 .             hjust = NULL, vjust = NULL, angle = NULL, lineheight = NULL, 
 .             margin = structure(c(4.8, 4.8, 4.8, 4.8), unit = 8L, class = c("margin", 
 .             "simpleUnit", "unit", "unit_v2")), debug = NULL, 
 .             inherit.blank = TRUE), class = c("element_text", 
 .         "element")), strip.text.x = NULL, strip.text.x.bottom = NULL, 
 .         strip.text.x.top = NULL, strip.text.y = structure(list(
 .             family = NULL, face = NULL, colour = NULL, size = NULL, 
 .             hjust = NULL, vjust = NULL, angle = -90, lineheight = NULL, 
 .             margin = NULL, debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), strip.text.y.left = structure(list(family = NULL, 
 .             face = NULL, colour = NULL, size = NULL, hjust = NULL, 
 .             vjust = NULL, angle = 90, lineheight = NULL, margin = NULL, 
 .             debug = NULL, inherit.blank = TRUE), class = c("element_text", 
 .         "element")), strip.text.y.right = NULL, strip.switch.pad.grid = structure(3, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2")), strip.switch.pad.wrap = structure(3, unit = 8L, class = c("simpleUnit", 
 .         "unit", "unit_v2"))), class = "theme", complete = TRUE, validate = TRUE), 
 .     conf.int.fill = "strata")
4. .get_data(fit, data = data, complain = FALSE)
5. stop("The `data` argument should be provided either to ggsurvfit or survfit.")
```

---

### **assistant**:



---

### **user**:

次の結果が得られました。

```
Warning message in data("ovarian"):
“data set ‘ovarian’ not found”
```

---

### **assistant**:

このエラーメッセージは、"ovarian"という名前のデータセットが見つからないために表示されています。これは、次の理由のいずれかによるものです。

1. データセットがインストールされていない。"ovarian"データセットは特定のパッケージに属している可能性があるので、そのパッケージをインストールして読み込んでみてください。
2. データセットの名前が間違っている。データセットの名前が正しくない場合にこのエラーが発生します。スペルミスや大文字小文字の違いに注意してください。
3. ワーキングディレクトリにデータセットが存在しない。Rは現在のワーキングディレクトリでデータセットを探しますので、データセットをワーキングディレクトリに保存するか、データセットのパスを正しく指定する必要があります。

エラーを解決するには、上記の問題を確認して修正してみてください。

---

### **user**:

Google Colaboratory特有の問題でしょうか？

---

### **assistant**:

Google Colaboratory（通常Colabと略されます）では、Rプログラミングをサポートしていません。Google Colabは主にPythonの実行環境として使用されます。

そのため、"ovarian"という名前のデータセットが見つからないというエラーは、Google Colab特有の問題というよりは、Rプログラミングに関連した問題である可能性が高いです。

RとPythonは異なるプログラミング言語であり、それぞれ異なるパッケージやデータセットの管理方法を持っています。したがって、R用のデータセットをPythonのGoogle Colabで直接使用することは基本的に不可能です。

Pythonでデータセットを使用したい場合は、Python用のデータセットにアクセスするか、データをPythonが読み込める形式（CSVやExcelなど）に変換してから読み込む必要があります。

---

### **user**:

Rで使える survival と Survminer などのパッケージのインストール先を、現在のワーキングディレクトリに指定することはできますか？

---

### **assistant**:

Rでパッケージをインストールする際に、そのインストール先ディレクトリを指定することは可能です。しかし、一般的には推奨されません。Rのバージョンや他のパッケージとの依存関係など、細かい設定を手動で管理する必要があり、それがエラーや問題を引き起こす可能性があるからです。

Rのパッケージは通常、Rのライブラリのディレクトリにインストールされます。このディレクトリは `.libPaths()` という関数を実行することで確認できます。また、`.libPaths(new_path)` とすることでライブラリのパスを新しいパスに変更することが可能です。

パッケージのインストール先を指定するには `install.packages()` 関数の `lib` 引数を使用します。以下に一例を示します。

```R
install.packages("survival", lib = "/your/directory/")
```

ただし、改めて注意を促したいのが、この方法を使用するとパッケージが新たにインストールされるディレクトリを追加、または変更する必要があるときには `.libPaths()` を使用して適切に設定する必要があるという点です。

もしも特定のパッケージを特定のプロジェクトだけで使いたいという場面では、"packrat" や "renv" のようなパッケージ管理ツールを使用することをお勧めします。これらのツールを使用すると、プロジェクトごとに独立したパッケージの環境を作成し、パッケージのバージョンを固定することができます。

---

### **user**:

```r
install.packages("survival", lib = ".")
```

のようにすると、Google Colaboratory 上にインストールされたことを確認できました。ここから

```r
data(lung)
```

のようにしてもまだ読み込めませんが、このコードを改変して、読み込めるようにできますか？

---

### **assistant**:

コード`install.packages("survival", lib = ".")`にて、Google Colaboratory上に"survival"パッケージをインストールできた場合、データを読み込む前にパッケージを読み込む必要があります。`lib`引数が指定されているため、具体的には以下のように行う必要があります。

```r
# survivalパッケージの読み込み
library(survival, lib.loc = ".") 

# データの読み込み
data(lung)
```

ここで`library(パッケージ名, lib.loc=パッケージの場所)`とすることで、特定の場所にインストールしたパッケージを読み込めます。上記コードではカレントディレクトリからパッケージを読み込んでいます。この後に`data(lung)`を実行すれば、lungデータを読み込むことができます。

---

### **user**:

ありがとうございます。まだ読み込めないですね。

```
Warning message in data(lung):
“data set ‘lung’ not found”
```

---

### **assistant**:

すみません、ミスがありました。書き込み先がワーキングディレクトリ指定の場合は `data()` メソッドではなく `read.table()` や `read.csv()` などからデータファイルを読み込む必要があります。

ただし、エラーメッセージを見る限り、`lung` データセットは現在のワーキングディレクトリに存在していないようです。

一度、ワーキングディレクトリを確認し、適切なディレクトリに `lung` データセットが存在するかどうかをご確認ください。Rのワーキングディレクトリは`getwd()`関数で確認できます。

また、"lung"データセットは`survival`パッケージに含まれていますので、上記の方法でパッケージを読み込むことができていれば、`lung`データセットにもアクセスできるはずです。

以下のコードを試してみてください。

```r
# survivalパッケージの読み込み
library(survival, lib.loc = ".") 

# lungデータセットの存在確認
exists("lung")
```

`exists("lung")` が `TRUE` を返すなら、`lung`データセットにアクセスできているはずです。

もしこれでもアクセスできない場合は、パッケージが正しくインストールできていない可能性があります。

なお、Google Colabは主にPython用の環境であり、Rの一部機能が正常に動作しない場合があります。そのため、もし可能であればローカル環境でRを実行することをお勧めします。

---

### **user**:

```
exists("lung")
```

の結果として

```
TRUE
```

が返ってきました。また、ディレクトリ構成を確認すると

```
./survival/R/survival
./survival/R/survival.rdb
./survival/R/survival.rdx
./survival/R/data/Rdata.rdb
./survival/R/data/Rdata.rds
./survival/R/data/Rdata.rdx
```

のようになっていました。



---

### **assistant**:

`exists("lung")`が`TRUE`を返してきたとのことで、`lung`データセットは存在していることが確認できました。

また、ディレクトリ構成から見るに、`.rdb`や`.rds`といった形式でデータが格納されているようです。

Rには内蔵されているデータセットにアクセスする際の機能がいくつか存在し、その一つが`data()`です。しかし、`data()`は特定のパスへのアクセスはサポートしていません。

したがって、次に試すべきなのは `save()` 関数を使ってデータを保存し、それを `load()` 関数で読み込むという方法です。

まず、現在のワーキングディレクトリに `lung` データセットを保存してみてください。

```r
# lungデータセットの保存
save(lung, file = "./lung.RData")
```

保存できたら、そのファイルを `load()` 関数で読み込みます。

```r
# lungデータセットの読み込み
load("./lung.RData")
```

この操作により、`lung` データセットが現在のワーキングディレクトリに存在する状態で R に読み込まれるはずです。

もし `save()` や `load()` 関数でエラーが生じた場合は、それらのエラーメッセージをご提供いただければと思います。

---

### **user**:

ありがとうございます。上記コードはエラーなく実行できたようです。ですがその後に改めて

```
data(lung)
```

を実行してもまだ

```
Warning message in data(lung):
“data set ‘lung’ not found”
```

のままです。

---

### **assistant**:

少し説明が不足してしまっていました。`save()`と`load()`関数によって`lung`データセットを現在のワーキングディレクトリに保存し、そのデータを読み込んだ後は、`data()`関数ではなく直接`lung`と記述してデータセットにアクセスすることができるはずです。つまり、以下のようにします。

```r
# lungデータセットの確認
lung
```

`data()`関数はパッケージに内包されているデータセットを読み込むためのもので、特定のディレクトリにある`.RData`ファイルを読み込むためのものではありません。

これにより`lung`データセットに正しくアクセスできることを確認してください。もしエラーが出る場合は、そのエラーメッセージをご提供いただければと思います。


<table class="dataframe">
<caption>A data.frame: 228 × 10</caption>
<thead>
	<tr><th></th><th scope=col>inst</th><th scope=col>time</th><th scope=col>status</th><th scope=col>age</th><th scope=col>sex</th><th scope=col>ph.ecog</th><th scope=col>ph.karno</th><th scope=col>pat.karno</th><th scope=col>meal.cal</th><th scope=col>wt.loss</th></tr>
	<tr><th></th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>
</thead>
<tbody>
	<tr><th scope=row>1</th><td> 3</td><td> 306</td><td>2</td><td>74</td><td>1</td><td> 1</td><td> 90</td><td>100</td><td>1175</td><td> NA</td></tr>
	<tr><th scope=row>2</th><td> 3</td><td> 455</td><td>2</td><td>68</td><td>1</td><td> 0</td><td> 90</td><td> 90</td><td>1225</td><td> 15</td></tr>
	<tr><th scope=row>3</th><td> 3</td><td>1010</td><td>1</td><td>56</td><td>1</td><td> 0</td><td> 90</td><td> 90</td><td>  NA</td><td> 15</td></tr>
	<tr><th scope=row>4</th><td> 5</td><td> 210</td><td>2</td><td>57</td><td>1</td><td> 1</td><td> 90</td><td> 60</td><td>1150</td><td> 11</td></tr>
	<tr><th scope=row>5</th><td> 1</td><td> 883</td><td>2</td><td>60</td><td>1</td><td> 0</td><td>100</td><td> 90</td><td>  NA</td><td>  0</td></tr>
	<tr><th scope=row>6</th><td>12</td><td>1022</td><td>1</td><td>74</td><td>1</td><td> 1</td><td> 50</td><td> 80</td><td> 513</td><td>  0</td></tr>
	<tr><th scope=row>7</th><td> 7</td><td> 310</td><td>2</td><td>68</td><td>2</td><td> 2</td><td> 70</td><td> 60</td><td> 384</td><td> 10</td></tr>
	<tr><th scope=row>8</th><td>11</td><td> 361</td><td>2</td><td>71</td><td>2</td><td> 2</td><td> 60</td><td> 80</td><td> 538</td><td>  1</td></tr>
	<tr><th scope=row>9</th><td> 1</td><td> 218</td><td>2</td><td>53</td><td>1</td><td> 1</td><td> 70</td><td> 80</td><td> 825</td><td> 16</td></tr>
	<tr><th scope=row>10</th><td> 7</td><td> 166</td><td>2</td><td>61</td><td>1</td><td> 2</td><td> 70</td><td> 70</td><td> 271</td><td> 34</td></tr>
	<tr><th scope=row>11</th><td> 6</td><td> 170</td><td>2</td><td>57</td><td>1</td><td> 1</td><td> 80</td><td> 80</td><td>1025</td><td> 27</td></tr>
	<tr><th scope=row>12</th><td>16</td><td> 654</td><td>2</td><td>68</td><td>2</td><td> 2</td><td> 70</td><td> 70</td><td>  NA</td><td> 23</td></tr>
	<tr><th scope=row>13</th><td>11</td><td> 728</td><td>2</td><td>68</td><td>2</td><td> 1</td><td> 90</td><td> 90</td><td>  NA</td><td>  5</td></tr>
	<tr><th scope=row>14</th><td>21</td><td>  71</td><td>2</td><td>60</td><td>1</td><td>NA</td><td> 60</td><td> 70</td><td>1225</td><td> 32</td></tr>
	<tr><th scope=row>15</th><td>12</td><td> 567</td><td>2</td><td>57</td><td>1</td><td> 1</td><td> 80</td><td> 70</td><td>2600</td><td> 60</td></tr>
	<tr><th scope=row>16</th><td> 1</td><td> 144</td><td>2</td><td>67</td><td>1</td><td> 1</td><td> 80</td><td> 90</td><td>  NA</td><td> 15</td></tr>
	<tr><th scope=row>17</th><td>22</td><td> 613</td><td>2</td><td>70</td><td>1</td><td> 1</td><td> 90</td><td>100</td><td>1150</td><td> -5</td></tr>
	<tr><th scope=row>18</th><td>16</td><td> 707</td><td>2</td><td>63</td><td>1</td><td> 2</td><td> 50</td><td> 70</td><td>1025</td><td> 22</td></tr>
	<tr><th scope=row>19</th><td> 1</td><td>  61</td><td>2</td><td>56</td><td>2</td><td> 2</td><td> 60</td><td> 60</td><td> 238</td><td> 10</td></tr>
	<tr><th scope=row>20</th><td>21</td><td>  88</td><td>2</td><td>57</td><td>1</td><td> 1</td><td> 90</td><td> 80</td><td>1175</td><td> NA</td></tr>
	<tr><th scope=row>21</th><td>11</td><td> 301</td><td>2</td><td>67</td><td>1</td><td> 1</td><td> 80</td><td> 80</td><td>1025</td><td> 17</td></tr>
	<tr><th scope=row>22</th><td> 6</td><td>  81</td><td>2</td><td>49</td><td>2</td><td> 0</td><td>100</td><td> 70</td><td>1175</td><td> -8</td></tr>
	<tr><th scope=row>23</th><td>11</td><td> 624</td><td>2</td><td>50</td><td>1</td><td> 1</td><td> 70</td><td> 80</td><td>  NA</td><td> 16</td></tr>
	<tr><th scope=row>24</th><td>15</td><td> 371</td><td>2</td><td>58</td><td>1</td><td> 0</td><td> 90</td><td>100</td><td> 975</td><td> 13</td></tr>
	<tr><th scope=row>25</th><td>12</td><td> 394</td><td>2</td><td>72</td><td>1</td><td> 0</td><td> 90</td><td> 80</td><td>  NA</td><td>  0</td></tr>
	<tr><th scope=row>26</th><td>12</td><td> 520</td><td>2</td><td>70</td><td>2</td><td> 1</td><td> 90</td><td> 80</td><td> 825</td><td>  6</td></tr>
	<tr><th scope=row>27</th><td> 4</td><td> 574</td><td>2</td><td>60</td><td>1</td><td> 0</td><td>100</td><td>100</td><td>1025</td><td>-13</td></tr>
	<tr><th scope=row>28</th><td>13</td><td> 118</td><td>2</td><td>70</td><td>1</td><td> 3</td><td> 60</td><td> 70</td><td>1075</td><td> 20</td></tr>
	<tr><th scope=row>29</th><td>13</td><td> 390</td><td>2</td><td>53</td><td>1</td><td> 1</td><td> 80</td><td> 70</td><td> 875</td><td> -7</td></tr>
	<tr><th scope=row>30</th><td> 1</td><td>  12</td><td>2</td><td>74</td><td>1</td><td> 2</td><td> 70</td><td> 50</td><td> 305</td><td> 20</td></tr>
	<tr><th scope=row>⋮</th><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td></tr>
	<tr><th scope=row>199</th><td> 1</td><td>276</td><td>1</td><td>52</td><td>2</td><td>0</td><td>100</td><td> 80</td><td> 975</td><td>  0</td></tr>
	<tr><th scope=row>200</th><td>32</td><td>135</td><td>2</td><td>60</td><td>1</td><td>1</td><td> 90</td><td> 70</td><td>1275</td><td>  0</td></tr>
	<tr><th scope=row>201</th><td>15</td><td> 79</td><td>2</td><td>64</td><td>2</td><td>1</td><td> 90</td><td> 90</td><td> 488</td><td> 37</td></tr>
	<tr><th scope=row>202</th><td>22</td><td> 59</td><td>2</td><td>73</td><td>1</td><td>1</td><td> 60</td><td> 60</td><td>2200</td><td>  5</td></tr>
	<tr><th scope=row>203</th><td>32</td><td>240</td><td>1</td><td>63</td><td>2</td><td>0</td><td> 90</td><td>100</td><td>1025</td><td>  0</td></tr>
	<tr><th scope=row>204</th><td> 3</td><td>202</td><td>1</td><td>50</td><td>2</td><td>0</td><td>100</td><td>100</td><td> 635</td><td>  1</td></tr>
	<tr><th scope=row>205</th><td>26</td><td>235</td><td>1</td><td>63</td><td>2</td><td>0</td><td>100</td><td> 90</td><td> 413</td><td>  0</td></tr>
	<tr><th scope=row>206</th><td>33</td><td>105</td><td>2</td><td>62</td><td>1</td><td>2</td><td> NA</td><td> 70</td><td>  NA</td><td> NA</td></tr>
	<tr><th scope=row>207</th><td> 5</td><td>224</td><td>1</td><td>55</td><td>2</td><td>0</td><td> 80</td><td> 90</td><td>  NA</td><td> 23</td></tr>
	<tr><th scope=row>208</th><td>13</td><td>239</td><td>2</td><td>50</td><td>2</td><td>2</td><td> 60</td><td> 60</td><td>1025</td><td> -3</td></tr>
	<tr><th scope=row>209</th><td>21</td><td>237</td><td>1</td><td>69</td><td>1</td><td>1</td><td> 80</td><td> 70</td><td>  NA</td><td> NA</td></tr>
	<tr><th scope=row>210</th><td>33</td><td>173</td><td>1</td><td>59</td><td>2</td><td>1</td><td> 90</td><td> 80</td><td>  NA</td><td> 10</td></tr>
	<tr><th scope=row>211</th><td> 1</td><td>252</td><td>1</td><td>60</td><td>2</td><td>0</td><td>100</td><td> 90</td><td> 488</td><td> -2</td></tr>
	<tr><th scope=row>212</th><td> 6</td><td>221</td><td>1</td><td>67</td><td>1</td><td>1</td><td> 80</td><td> 70</td><td> 413</td><td> 23</td></tr>
	<tr><th scope=row>213</th><td>15</td><td>185</td><td>1</td><td>69</td><td>1</td><td>1</td><td> 90</td><td> 70</td><td>1075</td><td>  0</td></tr>
	<tr><th scope=row>214</th><td>11</td><td> 92</td><td>1</td><td>64</td><td>2</td><td>2</td><td> 70</td><td>100</td><td>  NA</td><td> 31</td></tr>
	<tr><th scope=row>215</th><td>11</td><td> 13</td><td>2</td><td>65</td><td>1</td><td>1</td><td> 80</td><td> 90</td><td>  NA</td><td> 10</td></tr>
	<tr><th scope=row>216</th><td>11</td><td>222</td><td>1</td><td>65</td><td>1</td><td>1</td><td> 90</td><td> 70</td><td>1025</td><td> 18</td></tr>
	<tr><th scope=row>217</th><td>13</td><td>192</td><td>1</td><td>41</td><td>2</td><td>1</td><td> 90</td><td> 80</td><td>  NA</td><td>-10</td></tr>
	<tr><th scope=row>218</th><td>21</td><td>183</td><td>2</td><td>76</td><td>1</td><td>2</td><td> 80</td><td> 60</td><td> 825</td><td>  7</td></tr>
	<tr><th scope=row>219</th><td>11</td><td>211</td><td>1</td><td>70</td><td>2</td><td>2</td><td> 70</td><td> 30</td><td> 131</td><td>  3</td></tr>
	<tr><th scope=row>220</th><td> 2</td><td>175</td><td>1</td><td>57</td><td>2</td><td>0</td><td> 80</td><td> 80</td><td> 725</td><td> 11</td></tr>
	<tr><th scope=row>221</th><td>22</td><td>197</td><td>1</td><td>67</td><td>1</td><td>1</td><td> 80</td><td> 90</td><td>1500</td><td>  2</td></tr>
	<tr><th scope=row>222</th><td>11</td><td>203</td><td>1</td><td>71</td><td>2</td><td>1</td><td> 80</td><td> 90</td><td>1025</td><td>  0</td></tr>
	<tr><th scope=row>223</th><td> 1</td><td>116</td><td>2</td><td>76</td><td>1</td><td>1</td><td> 80</td><td> 80</td><td>  NA</td><td>  0</td></tr>
	<tr><th scope=row>224</th><td> 1</td><td>188</td><td>1</td><td>77</td><td>1</td><td>1</td><td> 80</td><td> 60</td><td>  NA</td><td>  3</td></tr>
	<tr><th scope=row>225</th><td>13</td><td>191</td><td>1</td><td>39</td><td>1</td><td>0</td><td> 90</td><td> 90</td><td>2350</td><td> -5</td></tr>
	<tr><th scope=row>226</th><td>32</td><td>105</td><td>1</td><td>75</td><td>2</td><td>2</td><td> 60</td><td> 70</td><td>1025</td><td>  5</td></tr>
	<tr><th scope=row>227</th><td> 6</td><td>174</td><td>1</td><td>66</td><td>1</td><td>1</td><td> 90</td><td>100</td><td>1075</td><td>  1</td></tr>
	<tr><th scope=row>228</th><td>22</td><td>177</td><td>1</td><td>58</td><td>2</td><td>1</td><td> 80</td><td> 90</td><td>1060</td><td>  0</td></tr>
</tbody>
</table>



---

### **user**:

おお。できました。ありがとうございます。

---

### **assistant**:

うまくいって良かったです！お手数をおかけしました。もしご不明な点や新たな問題が出てきましたら、いつでもお気軽にご質問ください。Rのコーディングにお手伝いできることがあれば何でもお知らせください。引き続き楽しいコーディングライフをお過ごしください！

---

### **user**:

では、ここまでのまとめを書いてもらってよろしいでしょうか。

---

### **assistant**:

もちろんです。まとめさせていただきます。

このスレッドでは、特定のRパッケージ（`survival`）をGoogle Colaboratory上にインストールし、そのパッケージ内のデータセット（`lung`）にアクセスしようとするときのエラーに対処しました。

まず、Rのパッケージは特定のディレクトリ（ワーキングディレクトリ）にインストールすることが可能であることを見ました。そのため、次のコードでパッケージをインストールしました。

```r
install.packages("survival", lib = ".")
```
  
次に、特定のディレクトリからパッケージを読み込むには、インストールした位置を指定する必要があることを確認しました。

```r
library(survival, lib.loc = ".")
```
  
しかし、`data()`関数はあくまでパッケージに添付されているデータを読み込むもので、特定のディレクトリにあるRのデータファイル（`.RData`ファイル）を読み込むものではないため、以下のようなエラーメッセージが出力されました。

```
Warning message in data(lung):
“data set ‘lung’ not found”
```
  
この問題解決のために、まず`save()`と`load()`関数を使用して`lung`データセットをワーキングディレクトリに保存し、そのデータを読み込みました。

```r
# lungデータセットの保存
save(lung, file = "./lung.RData")

# lungデータセットの読み込み
load("./lung.RData")
```
  
そして、保存・読み込み後は、`data()`関数ではなく直接`lung`と記述してデータセットにアクセスしました。

```r
# lungデータセットの確認
lung
```

この結果、問題なく`lung`データセットにアクセスできることを確認しました。

以上がこのスレッドでの問題解決の主要なステップです。この情報が今後のRプログラミングに役立つことを願っています。

---

### **user**:

ありがとうございます。実はまだ「Google Colab で R : カプランマイヤー法と生存曲線 編」は始まったばかりです。このデータを用いて、Rでカプランマイヤー曲線を描画するコードを書いてください。

---

### **assistant**:

まずは、`survminer`パッケージをインストールし、読み込むところから始めましょう。このパッケージは生存分析のための便利な機能を提供します。

```r
# survminerパッケージのインストール
install.packages("survminer", lib = ".")

# survminerパッケージの読み込み
library(survminer, lib.loc = ".")
```

そして、以下のコードでカプランマイヤー曲線を描画できます。

```r
# サバイバルオブジェクトの作成
surv_obj <- Surv(time = lung$time, event = lung$status)

# データのフィット（カプランマイヤー推定量の計算）
fit <- survfit(surv_obj ~ 1)

# 生存曲線の描画
ggsurvplot(fit)
```

以上のコードでは、`ggsurvplot()`関数（`survminer` パッケージの一部）を使用して生存曲線を描画しています。各行の説明は以下の通りです:

1. `Surv()`関数でサバイバルオブジェクトを作成。`time` は生存時間を、`event` は観測終了時にイベントが発生したかどうかを表します。
2. `survfit()`関数でデータをフィットし、カプランマイヤーの生存曲線を計算します。この関数はサバイバルオブジェクトとそのオブジェクトに関連する他の変数（ここではなし）を引数に取ります。
3. `ggsurvplot()`関数で生存曲線を描画します。この関数は`survfit()`関数の出力を引数に取ります。

注意: データセットおよびパッケージの読み込みに問題が出た際には、前述のインストールと読み込みのステップを確認してみてください。

---

### **user**:

ありがとうございます。上記コードをベースに、改変した全コードを書いてください。

```
Error in .get_data(fit, data = data, complain = FALSE): The `data` argument should be provided either to ggsurvfit or survfit.
Traceback:

1. ggsurvplot(fit)
2. do.call(ggsurvplot_core, opts)
3. (function (fit, data = NULL, fun = NULL, color = NULL, palette = NULL, 

（中略）  

4. .get_data(fit, data = data, complain = FALSE)
5. stop("The `data` argument should be provided either to ggsurvfit or survfit.")
```


---

### **assistant**:

申し訳ありません、エラーが発生してしまったようです。`ggsurvplot()`関数の`data`引数にデータセット（この場合は`lung`）を渡すことでこの問題は解決します。

```r
# survivalパッケージの読み込み
library(survival, lib.loc = ".") 

# survminerパッケージのインストール
install.packages("survminer", lib = ".")

# survminerパッケージの読み込み
library(survminer, lib.loc = ".")

# lungデータセットの保存
save(lung, file = "./lung.RData")

# lungデータセットの読み込み
load("./lung.RData")

# lungデータセットの確認
lung

# サバイバルオブジェクトの作成
surv_obj <- Surv(time = lung$time, event = lung$status - 1)

# データのフィット（カプランマイヤー推定量の計算）
fit <- survfit(surv_obj ~ 1, data = lung)

# 生存曲線の描画
ggsurvplot(fit, data = lung)
```

注意点として、lungデータセットの`status`フィールドは2が死亡、1が打ち切り（観測終了時に生存）を表していますが、`Surv()`関数はイベントが発生した場合に`1`、発生しなかった場合に`0`を期待します。そのため、`event = lung$status - 1`として`status`フィールドを変換しています。

また、`survfit()`と`ggsurvplot()`関数の`data`引数にデータセットを渡しています。`survfit()`はこのデータを使用してモデルをフィットし、`ggsurvplot()`はこのデータを使用してプロットを作成します。

この修正により、上記のエラーは解消され、生存曲線のプロットが正しく表示されるはずです。エラーが引き続き発生する場合はお知らせください。



---

### **user**:

でーーきたーーー！！

![output_16_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/a3f68fb2-b1e7-f7aa-c77d-f325dcb22705.png)


---

### **assistant**:

素晴らしいです！問題が解決し、カプランマイヤー曲線を生成できてとても嬉しいです。

カプランマイヤー曲線は、生存分析や信頼性分析の重要なツールです。さまざまな条件下での生存結果を視覚的に比較するのに非常に有用です。また、カプランマイヤー曲線はさまざまな統計的分析（例えば、生存時間の比較や、特定の変数が生存にどの程度影響を及ぼすかを評価するためのコックス比例ハザードモデルなど）の基礎となります。

Rで生存分析を進める際は、`survminer`パッケージの他にも`survival`パッケージや`survplot`パッケージなど、いくつかの有用なパッケージがあります。これらのパッケージはそれぞれ異なる特性や機能を持っており、タスクや目的によって使い分けることができます。

データ分析を進める中で何かご不明な点がありましたら、いつでも質問してください。引き続き楽しいデータ分析ライフをお過ごしください！

---

### **user**:

２つの群について、生存期間が有意に異なるかどうかを調べるためのRコードを作成してください。また、それを実行するためのデータがあれば使ってみたいです。

---

### **assistant**:

2つの群の生存期間を比較する一般的なテストはlog-rankテストと呼ばれます。ここでは、再び`survival`パッケージの`survfit()`関数と`survdiff()`関数を使用します。

利用できるデータセットとしては、先程の`lung`データセットを利用します。このデータには`sex`というフィールドがありますが、これを2つの群（男性と女性）として利用することが可能です。

```r
# survivalパッケージの読み込み
library(survival, lib.loc = ".")

# lungデータセットの保存
save(lung, file = "./lung.RData")

# lungデータセットの読み込み
load("./lung.RData")

# lungデータセットの確認
lung

# サバイバルオブジェクトの作成
surv_obj <- Surv(time = lung$time, event = lung$status - 1)

# データのフィット（カプランマイヤー推定量の計算）
fit <- survfit(surv_obj ~ sex, data = lung)

# 各群の生存曲線を描画
plot(fit, col=c(2,1))

# log-rankテストを行う
res.logrank <- survdiff(surv_obj ~ sex, data = lung)
print(res.logrank)
```

上記のコードを実行すると、log-rankテストの結果が表示され、2つの群の生存曲線が異なるかどうかについてのp値が得られます。p値が0.05未満であれば、2つの群は有意に異なると言えます。

注意: `sex`フィールドの値は1が男性、2が女性を表しています。

---

### **user**:

ありがとうございます。次のような結果が得られました。


<table class="dataframe">
<caption>A data.frame: 228 × 10</caption>
<thead>
	<tr><th></th><th scope=col>inst</th><th scope=col>time</th><th scope=col>status</th><th scope=col>age</th><th scope=col>sex</th><th scope=col>ph.ecog</th><th scope=col>ph.karno</th><th scope=col>pat.karno</th><th scope=col>meal.cal</th><th scope=col>wt.loss</th></tr>
	<tr><th></th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th><th scope=col>&lt;dbl&gt;</th></tr>
</thead>
<tbody>
	<tr><th scope=row>1</th><td> 3</td><td> 306</td><td>2</td><td>74</td><td>1</td><td> 1</td><td> 90</td><td>100</td><td>1175</td><td> NA</td></tr>
	<tr><th scope=row>2</th><td> 3</td><td> 455</td><td>2</td><td>68</td><td>1</td><td> 0</td><td> 90</td><td> 90</td><td>1225</td><td> 15</td></tr>
	<tr><th scope=row>3</th><td> 3</td><td>1010</td><td>1</td><td>56</td><td>1</td><td> 0</td><td> 90</td><td> 90</td><td>  NA</td><td> 15</td></tr>
	<tr><th scope=row>4</th><td> 5</td><td> 210</td><td>2</td><td>57</td><td>1</td><td> 1</td><td> 90</td><td> 60</td><td>1150</td><td> 11</td></tr>
	<tr><th scope=row>5</th><td> 1</td><td> 883</td><td>2</td><td>60</td><td>1</td><td> 0</td><td>100</td><td> 90</td><td>  NA</td><td>  0</td></tr>
	<tr><th scope=row>6</th><td>12</td><td>1022</td><td>1</td><td>74</td><td>1</td><td> 1</td><td> 50</td><td> 80</td><td> 513</td><td>  0</td></tr>
	<tr><th scope=row>7</th><td> 7</td><td> 310</td><td>2</td><td>68</td><td>2</td><td> 2</td><td> 70</td><td> 60</td><td> 384</td><td> 10</td></tr>
	<tr><th scope=row>8</th><td>11</td><td> 361</td><td>2</td><td>71</td><td>2</td><td> 2</td><td> 60</td><td> 80</td><td> 538</td><td>  1</td></tr>
	<tr><th scope=row>9</th><td> 1</td><td> 218</td><td>2</td><td>53</td><td>1</td><td> 1</td><td> 70</td><td> 80</td><td> 825</td><td> 16</td></tr>
	<tr><th scope=row>10</th><td> 7</td><td> 166</td><td>2</td><td>61</td><td>1</td><td> 2</td><td> 70</td><td> 70</td><td> 271</td><td> 34</td></tr>
	<tr><th scope=row>11</th><td> 6</td><td> 170</td><td>2</td><td>57</td><td>1</td><td> 1</td><td> 80</td><td> 80</td><td>1025</td><td> 27</td></tr>
	<tr><th scope=row>12</th><td>16</td><td> 654</td><td>2</td><td>68</td><td>2</td><td> 2</td><td> 70</td><td> 70</td><td>  NA</td><td> 23</td></tr>
	<tr><th scope=row>13</th><td>11</td><td> 728</td><td>2</td><td>68</td><td>2</td><td> 1</td><td> 90</td><td> 90</td><td>  NA</td><td>  5</td></tr>
	<tr><th scope=row>14</th><td>21</td><td>  71</td><td>2</td><td>60</td><td>1</td><td>NA</td><td> 60</td><td> 70</td><td>1225</td><td> 32</td></tr>
	<tr><th scope=row>15</th><td>12</td><td> 567</td><td>2</td><td>57</td><td>1</td><td> 1</td><td> 80</td><td> 70</td><td>2600</td><td> 60</td></tr>
	<tr><th scope=row>16</th><td> 1</td><td> 144</td><td>2</td><td>67</td><td>1</td><td> 1</td><td> 80</td><td> 90</td><td>  NA</td><td> 15</td></tr>
	<tr><th scope=row>17</th><td>22</td><td> 613</td><td>2</td><td>70</td><td>1</td><td> 1</td><td> 90</td><td>100</td><td>1150</td><td> -5</td></tr>
	<tr><th scope=row>18</th><td>16</td><td> 707</td><td>2</td><td>63</td><td>1</td><td> 2</td><td> 50</td><td> 70</td><td>1025</td><td> 22</td></tr>
	<tr><th scope=row>19</th><td> 1</td><td>  61</td><td>2</td><td>56</td><td>2</td><td> 2</td><td> 60</td><td> 60</td><td> 238</td><td> 10</td></tr>
	<tr><th scope=row>20</th><td>21</td><td>  88</td><td>2</td><td>57</td><td>1</td><td> 1</td><td> 90</td><td> 80</td><td>1175</td><td> NA</td></tr>
	<tr><th scope=row>21</th><td>11</td><td> 301</td><td>2</td><td>67</td><td>1</td><td> 1</td><td> 80</td><td> 80</td><td>1025</td><td> 17</td></tr>
	<tr><th scope=row>22</th><td> 6</td><td>  81</td><td>2</td><td>49</td><td>2</td><td> 0</td><td>100</td><td> 70</td><td>1175</td><td> -8</td></tr>
	<tr><th scope=row>23</th><td>11</td><td> 624</td><td>2</td><td>50</td><td>1</td><td> 1</td><td> 70</td><td> 80</td><td>  NA</td><td> 16</td></tr>
	<tr><th scope=row>24</th><td>15</td><td> 371</td><td>2</td><td>58</td><td>1</td><td> 0</td><td> 90</td><td>100</td><td> 975</td><td> 13</td></tr>
	<tr><th scope=row>25</th><td>12</td><td> 394</td><td>2</td><td>72</td><td>1</td><td> 0</td><td> 90</td><td> 80</td><td>  NA</td><td>  0</td></tr>
	<tr><th scope=row>26</th><td>12</td><td> 520</td><td>2</td><td>70</td><td>2</td><td> 1</td><td> 90</td><td> 80</td><td> 825</td><td>  6</td></tr>
	<tr><th scope=row>27</th><td> 4</td><td> 574</td><td>2</td><td>60</td><td>1</td><td> 0</td><td>100</td><td>100</td><td>1025</td><td>-13</td></tr>
	<tr><th scope=row>28</th><td>13</td><td> 118</td><td>2</td><td>70</td><td>1</td><td> 3</td><td> 60</td><td> 70</td><td>1075</td><td> 20</td></tr>
	<tr><th scope=row>29</th><td>13</td><td> 390</td><td>2</td><td>53</td><td>1</td><td> 1</td><td> 80</td><td> 70</td><td> 875</td><td> -7</td></tr>
	<tr><th scope=row>30</th><td> 1</td><td>  12</td><td>2</td><td>74</td><td>1</td><td> 2</td><td> 70</td><td> 50</td><td> 305</td><td> 20</td></tr>
	<tr><th scope=row>⋮</th><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td><td>⋮</td></tr>
	<tr><th scope=row>199</th><td> 1</td><td>276</td><td>1</td><td>52</td><td>2</td><td>0</td><td>100</td><td> 80</td><td> 975</td><td>  0</td></tr>
	<tr><th scope=row>200</th><td>32</td><td>135</td><td>2</td><td>60</td><td>1</td><td>1</td><td> 90</td><td> 70</td><td>1275</td><td>  0</td></tr>
	<tr><th scope=row>201</th><td>15</td><td> 79</td><td>2</td><td>64</td><td>2</td><td>1</td><td> 90</td><td> 90</td><td> 488</td><td> 37</td></tr>
	<tr><th scope=row>202</th><td>22</td><td> 59</td><td>2</td><td>73</td><td>1</td><td>1</td><td> 60</td><td> 60</td><td>2200</td><td>  5</td></tr>
	<tr><th scope=row>203</th><td>32</td><td>240</td><td>1</td><td>63</td><td>2</td><td>0</td><td> 90</td><td>100</td><td>1025</td><td>  0</td></tr>
	<tr><th scope=row>204</th><td> 3</td><td>202</td><td>1</td><td>50</td><td>2</td><td>0</td><td>100</td><td>100</td><td> 635</td><td>  1</td></tr>
	<tr><th scope=row>205</th><td>26</td><td>235</td><td>1</td><td>63</td><td>2</td><td>0</td><td>100</td><td> 90</td><td> 413</td><td>  0</td></tr>
	<tr><th scope=row>206</th><td>33</td><td>105</td><td>2</td><td>62</td><td>1</td><td>2</td><td> NA</td><td> 70</td><td>  NA</td><td> NA</td></tr>
	<tr><th scope=row>207</th><td> 5</td><td>224</td><td>1</td><td>55</td><td>2</td><td>0</td><td> 80</td><td> 90</td><td>  NA</td><td> 23</td></tr>
	<tr><th scope=row>208</th><td>13</td><td>239</td><td>2</td><td>50</td><td>2</td><td>2</td><td> 60</td><td> 60</td><td>1025</td><td> -3</td></tr>
	<tr><th scope=row>209</th><td>21</td><td>237</td><td>1</td><td>69</td><td>1</td><td>1</td><td> 80</td><td> 70</td><td>  NA</td><td> NA</td></tr>
	<tr><th scope=row>210</th><td>33</td><td>173</td><td>1</td><td>59</td><td>2</td><td>1</td><td> 90</td><td> 80</td><td>  NA</td><td> 10</td></tr>
	<tr><th scope=row>211</th><td> 1</td><td>252</td><td>1</td><td>60</td><td>2</td><td>0</td><td>100</td><td> 90</td><td> 488</td><td> -2</td></tr>
	<tr><th scope=row>212</th><td> 6</td><td>221</td><td>1</td><td>67</td><td>1</td><td>1</td><td> 80</td><td> 70</td><td> 413</td><td> 23</td></tr>
	<tr><th scope=row>213</th><td>15</td><td>185</td><td>1</td><td>69</td><td>1</td><td>1</td><td> 90</td><td> 70</td><td>1075</td><td>  0</td></tr>
	<tr><th scope=row>214</th><td>11</td><td> 92</td><td>1</td><td>64</td><td>2</td><td>2</td><td> 70</td><td>100</td><td>  NA</td><td> 31</td></tr>
	<tr><th scope=row>215</th><td>11</td><td> 13</td><td>2</td><td>65</td><td>1</td><td>1</td><td> 80</td><td> 90</td><td>  NA</td><td> 10</td></tr>
	<tr><th scope=row>216</th><td>11</td><td>222</td><td>1</td><td>65</td><td>1</td><td>1</td><td> 90</td><td> 70</td><td>1025</td><td> 18</td></tr>
	<tr><th scope=row>217</th><td>13</td><td>192</td><td>1</td><td>41</td><td>2</td><td>1</td><td> 90</td><td> 80</td><td>  NA</td><td>-10</td></tr>
	<tr><th scope=row>218</th><td>21</td><td>183</td><td>2</td><td>76</td><td>1</td><td>2</td><td> 80</td><td> 60</td><td> 825</td><td>  7</td></tr>
	<tr><th scope=row>219</th><td>11</td><td>211</td><td>1</td><td>70</td><td>2</td><td>2</td><td> 70</td><td> 30</td><td> 131</td><td>  3</td></tr>
	<tr><th scope=row>220</th><td> 2</td><td>175</td><td>1</td><td>57</td><td>2</td><td>0</td><td> 80</td><td> 80</td><td> 725</td><td> 11</td></tr>
	<tr><th scope=row>221</th><td>22</td><td>197</td><td>1</td><td>67</td><td>1</td><td>1</td><td> 80</td><td> 90</td><td>1500</td><td>  2</td></tr>
	<tr><th scope=row>222</th><td>11</td><td>203</td><td>1</td><td>71</td><td>2</td><td>1</td><td> 80</td><td> 90</td><td>1025</td><td>  0</td></tr>
	<tr><th scope=row>223</th><td> 1</td><td>116</td><td>2</td><td>76</td><td>1</td><td>1</td><td> 80</td><td> 80</td><td>  NA</td><td>  0</td></tr>
	<tr><th scope=row>224</th><td> 1</td><td>188</td><td>1</td><td>77</td><td>1</td><td>1</td><td> 80</td><td> 60</td><td>  NA</td><td>  3</td></tr>
	<tr><th scope=row>225</th><td>13</td><td>191</td><td>1</td><td>39</td><td>1</td><td>0</td><td> 90</td><td> 90</td><td>2350</td><td> -5</td></tr>
	<tr><th scope=row>226</th><td>32</td><td>105</td><td>1</td><td>75</td><td>2</td><td>2</td><td> 60</td><td> 70</td><td>1025</td><td>  5</td></tr>
	<tr><th scope=row>227</th><td> 6</td><td>174</td><td>1</td><td>66</td><td>1</td><td>1</td><td> 90</td><td>100</td><td>1075</td><td>  1</td></tr>
	<tr><th scope=row>228</th><td>22</td><td>177</td><td>1</td><td>58</td><td>2</td><td>1</td><td> 80</td><td> 90</td><td>1060</td><td>  0</td></tr>
</tbody>
</table>



    Call:
    survdiff(formula = surv_obj ~ sex, data = lung)
    
            N Observed Expected (O-E)^2/E (O-E)^2/V
    sex=1 138      112     91.6      4.55      10.3
    sex=2  90       53     73.4      5.68      10.3
    
     Chisq= 10.3  on 1 degrees of freedom, p= 0.001 


![output_17_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/1d684590-3203-a622-5cc0-6b96730fef9c.png)


---

### **assistant**:

分析の結果、男性（label "1"）と女性（label "2"）の群間で生存時間に有意差があることが示されました。具体的には、p値が0.001であり、これは0.05よりも小さいため、男性と女性の間に生存時間の違いがあると結論付けることができます。これは生存曲線が男性と女性で異なり、つまり生存経験が性別によって有意に異なることを示しています。

ただし、この結果は、データセット中の男性と女性の間に生存時間の差があることを示すものであり、全ての男性と女性が同じ傾向を示すわけではないことに注意してください。さらに多くの要因が生存時間に影響を及ぼす可能性があります。

これらの結果をさらに詳しく解釈するには、コックス比例ハザードモデルのようなより洗練された統計モデリング手法を探求することをお勧めします。性別以外の要因（年齢、喫煙習慣、肺の機能値等）を制御した上での生存時間の差を調べることが可能です。

分析に関して何か他の質問がありましたら、いつでもお気軽にお問い合わせください。

---

### **user**:

ありがとうございました。コックス比例ハザードモデルについては、また後日お聞きしたいと思います。

---

### **assistant**:

はい、もちろんです！コックス比例ハザードモデルは生存分析の重要な一部であり、それについて話す機会を楽しみにしています。それが多変数の解析を行うための強力なツールであり、生存時間に影響を与える可能性のあるさまざまな変数を一度に考慮することができます。

その他の質問や助けが必要な場合は、いつでも気軽にお知らせください。データ分析の旅において最高の助けとなるよう努力いたします。引き続き良い一日をお過ごしください！

---