В биологии мы часто хотим построить кривые зависимости от дозы. Пакет R «drc» действительно полезен, и базовая графика может легко обрабатывать «модели drm». Однако я хотел бы добавить свои кривые drm в файл ggplot2.
Мой набор данных:
library("drc")
library("reshape2")
library("ggplot2")
demo=structure(list(X = c(0, 1e-08, 3e-08, 1e-07, 3e-07, 1e-06, 3e-06,
1e-05, 3e-05, 1e-04, 3e-04), Y1 = c(0, 1, 12, 19, 28, 32, 35,
39, NA, 39, NA), Y2 = c(0, 0, 10, 18, 30, 35, 41, 43, NA, 43,
NA), Y3 = c(0, 4, 15, 22, 28, 35, 38, 44, NA, 44, NA)), .Names = c("X",
"Y1", "Y2", "Y3"), class = "data.frame", row.names = c(NA, -11L
))
Использование базовой графики:
plot(drm(data = reshape2::melt(demo,id.vars = "X"),value~X,fct=LL.4(),na.action = na.omit),type="bars")
дает хороший график зависимости реакции от дозы с 4 параметрами.
Пытаясь построить тот же сюжет в ggplot2, я наткнулся на 2 проблемы.
Невозможно напрямую добавить кривую модели DRM. Мне нужно переписать 4-PL как функцию и добавить ее в виде stat_function, что, мягко говоря, громоздко.
ggplot(reshape2::melt(demo,id.vars = "X"),aes(X,value)) + geom_point() + stat_function(fun = function(x){ drm_y=function(x, drm){ coef(drm)[2]+((coef(drm)[3]-coef(drm)[2])/(1+exp((coef(drm)[1]*(log(x)-log(coef(drm)[4])))))) } + drm_y(x,drm = drm(data = reshape2::melt(demo,id.vars = "X"), value~X, fct=LL.4(), na.action = na.omit)) })
Если этого было недостаточно, он работает, только если scale_x непрерывно. Если я хочу добавить
scale_x_log10()
, я получаю:Warning message: In log(x): NaNs produced
.
Я понимаю, что log10(0) = -Inf
, но есть способы справиться с этим. Либо (как и в случае с plot.drc) значение x = 0 отображается на оси x по существу как 1/100 от самого низкого значения x. (demo$X[which.min(demo$X)+1]/100
) или, как в GraphPad Prism, нули полностью опускаются на кривой зависимости реакции от дозы.
Мои вопросы:
Есть ли способ построить модели DRM напрямую в ggplot2?
Как я могу связать набор данных с его соответствующей кривой 4-PL, чтобы они отображались в одном цвете?