使用 ggplot 和 purrr 绘制多条逻辑曲线的推导
Plot derivations of multiple logistical curves with ggplot and purrr
数据框“pars”的行包含定义逻辑曲线的两个参数:
library(ggplot2)
library(purrr)
pars <- data.frame(
diff = c(-1.5, 2.5),
disc = c(1.2, 2.5)
)
这两条曲线可以用 map() 和 ggplot() 像这样绘制。
icc <- function(x) map(
1:nrow(pars),
~ stat_function(fun = function(x)
(exp(pars$disc[.x]*(x - pars$diff[.x])))/(1 + exp(pars$disc[.x]*(x - pars$diff[.x]))))
)
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
icc()
对应的推导可以画成这样:
disc1 <- 1.2
disc2 <- 2.5
diff1 <- -1.5
diff2 <- 2.5
icc1 <- function(x) (exp(disc1*(x - diff1)))/(1 + exp(disc1*(x - diff1)))
icc2 <- function(x) (exp(disc2*(x - diff2)))/(1 + exp(disc2*(x - diff2)))
info1 <- Deriv(icc1, "x")
info2 <- Deriv(icc2, "x")
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
stat_function(fun = info1) +
stat_function(fun = info2)
但是,我想使用更通用的方法,最好也使用 purrr() 进行推导,因为我需要一个函数来处理不同数量的曲线。也许有一个 pmap() 的解决方案可以遍历带有参数的数据框并将函数和推导应用于每一行。不幸的是,到目前为止我很不走运。我非常感谢任何有用的答案。
一个选项可能如下所示:
- 我已经把你曲线的参数放在 data.frame
- 利用函数工厂和
pmap
遍历参数 df 以创建 icc
函数列表。
剩下的就很简单了。
遍历函数列表以获得导数。
使用地图添加stat_function
层。
library(ggplot2)
library(Deriv)
#> Warning: package 'Deriv' was built under R version 4.1.2
library(purrr)
df <- data.frame(
disc = c(1.2, 2.5),
diff = c(-1.5, 2.5)
)
icc <- function(disc, diff) {
function(x) (exp(disc*(x - diff)))/(1 + exp(disc*(x - diff)))
}
icc_list <- pmap(df, function(disc, diff) icc(disc, diff))
info_list <- map(icc_list, Deriv, "x")
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
map(info_list, ~ stat_function(fun = .x))
编辑 合并不同的颜色或...没什么大不了的,例如您可以使用 purrr::map2
遍历 info_list
和您的颜色向量,为每个函数或导数分配颜色:
colorVec <- c("red", "blue")
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
map2(info_list, colorVec, ~ stat_function(fun = .x, color = .y))
您也可以使用与 icc 绘图非常相似的方式来完成:
deriv_icc <- function(x) map(
1:nrow(pars),
~ stat_function(fun = function(x){
exb <- exp(pars$disc[.x]*(x-pars$diff[.x]))
pars$disc[.x]*(exb/(1+exb) - exb^2/(1+exb)^2)
}))
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
deriv_icc()
这简单地认识到这个问题的逻辑 CDF 的导数是判别参数乘以逻辑 PDF:
数据框“pars”的行包含定义逻辑曲线的两个参数:
library(ggplot2)
library(purrr)
pars <- data.frame(
diff = c(-1.5, 2.5),
disc = c(1.2, 2.5)
)
这两条曲线可以用 map() 和 ggplot() 像这样绘制。
icc <- function(x) map(
1:nrow(pars),
~ stat_function(fun = function(x)
(exp(pars$disc[.x]*(x - pars$diff[.x])))/(1 + exp(pars$disc[.x]*(x - pars$diff[.x]))))
)
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
icc()
对应的推导可以画成这样:
disc1 <- 1.2
disc2 <- 2.5
diff1 <- -1.5
diff2 <- 2.5
icc1 <- function(x) (exp(disc1*(x - diff1)))/(1 + exp(disc1*(x - diff1)))
icc2 <- function(x) (exp(disc2*(x - diff2)))/(1 + exp(disc2*(x - diff2)))
info1 <- Deriv(icc1, "x")
info2 <- Deriv(icc2, "x")
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
stat_function(fun = info1) +
stat_function(fun = info2)
但是,我想使用更通用的方法,最好也使用 purrr() 进行推导,因为我需要一个函数来处理不同数量的曲线。也许有一个 pmap() 的解决方案可以遍历带有参数的数据框并将函数和推导应用于每一行。不幸的是,到目前为止我很不走运。我非常感谢任何有用的答案。
一个选项可能如下所示:
- 我已经把你曲线的参数放在 data.frame
- 利用函数工厂和
pmap
遍历参数 df 以创建icc
函数列表。
剩下的就很简单了。
遍历函数列表以获得导数。
使用地图添加
stat_function
层。
library(ggplot2)
library(Deriv)
#> Warning: package 'Deriv' was built under R version 4.1.2
library(purrr)
df <- data.frame(
disc = c(1.2, 2.5),
diff = c(-1.5, 2.5)
)
icc <- function(disc, diff) {
function(x) (exp(disc*(x - diff)))/(1 + exp(disc*(x - diff)))
}
icc_list <- pmap(df, function(disc, diff) icc(disc, diff))
info_list <- map(icc_list, Deriv, "x")
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
map(info_list, ~ stat_function(fun = .x))
编辑 合并不同的颜色或...没什么大不了的,例如您可以使用 purrr::map2
遍历 info_list
和您的颜色向量,为每个函数或导数分配颜色:
colorVec <- c("red", "blue")
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
map2(info_list, colorVec, ~ stat_function(fun = .x, color = .y))
您也可以使用与 icc 绘图非常相似的方式来完成:
deriv_icc <- function(x) map(
1:nrow(pars),
~ stat_function(fun = function(x){
exb <- exp(pars$disc[.x]*(x-pars$diff[.x]))
pars$disc[.x]*(exb/(1+exb) - exb^2/(1+exb)^2)
}))
ggplot(data.frame(x = -5 : 5)) +
aes(x) +
deriv_icc()
这简单地认识到这个问题的逻辑 CDF 的导数是判别参数乘以逻辑 PDF: