我有关于外科手术结果的数据:
- 操作日期(YYYY-MM-DD 格式)
- 运行结果(0表示运行成功,1表示运行不成功)
日期通常仅用于案例排序。 我需要
- 绘制学习曲线。(我发现生成的曲线称为累积平均值。) x 应该是案例数 y - 失败的概率(通常会降低)。
- 获取有关当前性能质量的数据
问题是:
在 R 中实现这一点的方法是什么(如果可能的话,使用 ggplot2)?
对于这种情况是否足够统计,或者通常需要更高级的东西?
我有关于外科手术结果的数据:
日期通常仅用于案例排序。 我需要
问题是:
在 R 中实现这一点的方法是什么(如果可能的话,使用 ggplot2)?
对于这种情况是否足够统计,或者通常需要更高级的东西?
信息丰富的“学习曲线”将表明当前的成功表现。然而,累积平均值并没有这样做,因为它包括旧结果和新结果。当学习真正提高时,累积平均值将偏低。
一个好的解决方案是使用随时间绘制的响应的Lowess 平滑。这种强大的非参数平滑器在许多包中实现:在RSeek 页面R上搜索当前选择。
例如,这里是模拟数据的散点图、它们的累积平均值和数据的 Lowess 平滑:

绿色(上部)曲线是 Lowess 平滑曲线。(此编码使用 1 表示成功,0 表示失败,因此改善曲线向上倾斜。) 两条曲线有很大不同:累积平均值几乎没有正斜率(约 0.0015),最近一次约为 0.5,而 Lowess 平滑曲线的斜率约为 0.005(超过三倍),最终约为 0.85。要了解哪个是正确的,请考虑最近的响应,例如 time=80 之后的响应:其中 26 个响应平均为 0.77。Lowess 曲线在此期间与该水平一致,但累积平均曲线显然过低。
(这是准备逻辑回归的标准探索性技术。如果在logit尺度上,Lowess 平滑近似线性,则响应与时间的逻辑回归应该可以很好地模拟学习曲线。如果平滑不是线性的,您可以考虑使用三次样条进行逻辑回归,允许斜率随时间变化。)
如果您的日期是字符串或因子形式,请将它们转换为 Dates with (如果它是一个因子,则as.Date(DateVariable, format="%Y-%m-%d")可能带有一个as.character周围。DateVariable
按手术日期对带有日期和结果的 data.frame 进行排序。要获得您描述的 y 变量,最简单的方法是获取结果的累积数量并除以迄今为止的案例数量(这只是从 1 到排序时的案例数量的运行序列)。在代码中:
#Make some random data to play with
DF <- data.frame(DateVariable = as.Date(runif(100, 0, 800), origin="2005-01-01"),
outcome = rbinom(100, 1, 0.1))
#Sort by date
DF <- DF[order(DF$DateVariable),]
DF <- rbind.fill(data.frame(outcome=1),DF)
#Add case numbers (in order, since sorted)
DF$x <- seq(length=nrow(DF))
#Create your definition for y (average to date, which is sum to date divided by number to date)
DF$y <- cumsum(DF$outcome) / DF$x
#Plot it
library(ggplot2)
ggplot(DF, aes(x,y)) +
geom_point(shape=4) +
geom_point(aes(x,outcome),shape=3) +
stat_smooth(method="loess", se=FALSE, color="darkgreen", size=1) +
scale_y_continuous(name= "Failure rate", limits=c(0, 1)) +
scale_x_continuous(name= "Operations performed")
结果:

(加号标记成功和错误情况。X - 累积和,线 - 黄土曲线)
但是,我认为这不是一个好的指标。查看有关 CUSUM 曲线和风险调整 CUSUM 曲线的一些工作。CUSUM 只是绘制(负)结果的数量与案例数量的关系;风险调整 CUSUM 假设您可以确定负面结果的概率(基于术前变量)并使用它来确定性能是否超出或落后于预期。
用于as.POSIXct转换为日期,这些日期存储为从纪元开始的秒数(因此很容易绘制),但可以很容易地以人类可读的格式显示。帮助文件记录了如何从任意字符表示中导入。
使用geom_line进行绘图。您可以使用aggregate或by将观察结果分成几天或几周或其他任何时间。我认为 ggplot2 也有一些本机功能。
我对学习曲线了解不多,但我怀疑更多地描述你的总体目标,而不仅仅是数学,会帮助其他人建议统计数据是否会告诉你你想知道什么.