如何计算R中图形的AUC?
How to calculate the AUC of a graph in R?
我有一个数据框 (gdata),其中包含函数的 x(作为“r”)和 y(作为“km”)坐标。
当我这样绘制时:
plot(x = gdata$r, y = gdata$km, type = "l")
我得到函数图:
现在我想计算从 x = 0 到 x = 0.6 的曲线下面积。当我寻找合适的包时,我只找到像计算 ROC 曲线的 AUC 这样的东西。但是有没有办法只计算一个正常函数的AUC?
一组给定数据点的曲线下面积 (AUC) 可以使用数字积分来存档:
设 data
为包含 x 和 y 值的数据框。您可以通过对函数进行积分来获得从较低 x0=0 到较高 x1=0.6 的曲线下面积,该函数线性逼近您的数据。
这是一个数值近似值,并不精确,因为我们没有无限多的数据点:对于 y=sqrt(x)
,我们将得到 0.3033 而不是真实值 0.3098。对于 data
中的 200 行,auc=0.3096 会变得更好。
library(tidyverse)
data <-
tibble(
x = seq(0, 2, length.out = 20)
) %>%
mutate(y = sqrt(x))
data
#> # A tibble: 20 × 2
#> x y
#> <dbl> <dbl>
#> 1 0 0
#> 2 0.105 0.324
#> 3 0.211 0.459
#> 4 0.316 0.562
#> 5 0.421 0.649
#> 6 0.526 0.725
#> 7 0.632 0.795
#> 8 0.737 0.858
#> 9 0.842 0.918
#> 10 0.947 0.973
#> 11 1.05 1.03
#> 12 1.16 1.08
#> 13 1.26 1.12
#> 14 1.37 1.17
#> 15 1.47 1.21
#> 16 1.58 1.26
#> 17 1.68 1.30
#> 18 1.79 1.34
#> 19 1.89 1.38
#> 20 2 1.41
qplot(x, y, data = data)
integrate(approxfun(data$x, data$y), 0, 0.6)
#> 0.3033307 with absolute error < 8.8e-05
由 reprex package (v2.0.1)
于 2021-10-03 创建
integrate
返回的绝对误差是正确的,前提是每两个数据点之间的真实世界是一个完美的线性插值,正如我们假设的那样。
我使用了 MESS 包来解决问题:
# Toy example
library(MESS)
x <- seq(0,3, by=0.1)
y <- x^2
auc(x,y, from = 0.1, to = 2, type = "spline")
解析结果为:
7999/3000
大约是 2.666333333333333
提供的 R 脚本给出:使用样条近似的 2.66632 和使用线性近似的 2.6695。
我有一个数据框 (gdata),其中包含函数的 x(作为“r”)和 y(作为“km”)坐标。 当我这样绘制时:
plot(x = gdata$r, y = gdata$km, type = "l")
我得到函数图:
现在我想计算从 x = 0 到 x = 0.6 的曲线下面积。当我寻找合适的包时,我只找到像计算 ROC 曲线的 AUC 这样的东西。但是有没有办法只计算一个正常函数的AUC?
一组给定数据点的曲线下面积 (AUC) 可以使用数字积分来存档:
设 data
为包含 x 和 y 值的数据框。您可以通过对函数进行积分来获得从较低 x0=0 到较高 x1=0.6 的曲线下面积,该函数线性逼近您的数据。
这是一个数值近似值,并不精确,因为我们没有无限多的数据点:对于 y=sqrt(x)
,我们将得到 0.3033 而不是真实值 0.3098。对于 data
中的 200 行,auc=0.3096 会变得更好。
library(tidyverse)
data <-
tibble(
x = seq(0, 2, length.out = 20)
) %>%
mutate(y = sqrt(x))
data
#> # A tibble: 20 × 2
#> x y
#> <dbl> <dbl>
#> 1 0 0
#> 2 0.105 0.324
#> 3 0.211 0.459
#> 4 0.316 0.562
#> 5 0.421 0.649
#> 6 0.526 0.725
#> 7 0.632 0.795
#> 8 0.737 0.858
#> 9 0.842 0.918
#> 10 0.947 0.973
#> 11 1.05 1.03
#> 12 1.16 1.08
#> 13 1.26 1.12
#> 14 1.37 1.17
#> 15 1.47 1.21
#> 16 1.58 1.26
#> 17 1.68 1.30
#> 18 1.79 1.34
#> 19 1.89 1.38
#> 20 2 1.41
qplot(x, y, data = data)
integrate(approxfun(data$x, data$y), 0, 0.6)
#> 0.3033307 with absolute error < 8.8e-05
由 reprex package (v2.0.1)
于 2021-10-03 创建integrate
返回的绝对误差是正确的,前提是每两个数据点之间的真实世界是一个完美的线性插值,正如我们假设的那样。
我使用了 MESS 包来解决问题:
# Toy example
library(MESS)
x <- seq(0,3, by=0.1)
y <- x^2
auc(x,y, from = 0.1, to = 2, type = "spline")
解析结果为:
7999/3000
大约是 2.666333333333333
提供的 R 脚本给出:使用样条近似的 2.66632 和使用线性近似的 2.6695。