假设我有一个数据框coefs
,其中每行包含曲线的模型系数。
coefs <- structure(list(a1 = c(1.22228259789383, 1.2064168157394, 1.09555089661994, 0.943947433470916, 0.883490658557721, 0.46125552320107), d = c(0.385227755933488, 0.457271644919152, 0.340063262461958, 0.305629949064525, 0.42459163183877, 0.425710112988664), g = c(0, 0, 0, 0, 0, 0), u = c(1, 1, 1, 1, 1, 1)), .Names = c("a1", "d", "g", "u"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
我想使用数据框的每一行根据定义的函数向绘图添加新曲线:(您可能将其识别为2PL项目响应模型)
TWOPL <- function(x,a1,b) {
1 / (1 + exp(-a1*(x-(b))))
}
基于this和this问题,我尝试了以下ggplot命令但得到计算失败的错误:
library(ggplot2)
p <- ggplot(coefs, aes(x = 0))
p + stat_function(fun = TWOPL) + xlim(-5,5)
我知道我需要一种方法来为函数提供各种系数。作为测试,我尝试使用固定参数的函数来创建1条曲线并且它可以工作,例如:
#1 curve based on fixed parameters
TWOPL_copy <- function(x) {
1 / (1 + exp(-1.22*(x-(.385))))
}
p <- ggplot(data.frame(x = 0), aes(x = 0))
p + stat_function(fun = TWOPL_copy) + xlim(-5,5)
我想知道如何将数据帧的每一行发送到ggplot。理想的下一步是以某种方式区分每条线的颜色。
答案 0 :(得分:6)
虽然你可以为每组参数调用stat_function
,或者通过编程方式调用它,但是自己进行计算会更简单:
library(tidyverse)
coefs %>%
mutate(curve = letters[row_number()]) %>% # add curve name
crossing(x = seq(-5, 5, .1)) %>% # repeat each row for every occurence of x
mutate(y = TWOPL(x, a1, d)) %>% # compute y values
ggplot(aes(x, y, color = curve)) +
geom_line()
以编程方式创建曲线的最简单方法是向绘图添加stat_function
调用列表。所有美学都必须反复进行,包括颜色。必须提供x
美学,但如果您设置xlim
,则无关紧要。
curves <- coefs %>%
mutate(curve = letters[row_number()]) %>%
pmap(function(...){
dots <- data_frame(...)
stat_function(data = dots, aes(0, color = curve),
fun = function(x) TWOPL(x, dots$a1, dots$d),
xlim = c(-5, 5))
})
ggplot() + curves