Построение большого количества пользовательских функций в ggplot в R с использованием stat_function()

Основная проблема заключается в том, что я хотел бы выяснить, как добавить пользовательские функции большого количества (1000) на один и тот же показатель в ggplot, используя разные значения для коэффициентов функции. Я видел другие вопросы о том, как добавить две или три функции, но не 1000, и вопросы о добавлении в разные функциональные формы, но не в той же форме с несколькими значениями параметров...

Цель состоит в том, чтобы stat_function рисовала линии с использованием значений параметров, хранящихся в кадре данных, но без фактических данных для x.

[Общая цель здесь заключается в том, чтобы показать большую неопределенность в параметрах модели нелинейной регрессии из небольшого набора данных, что приводит к неопределенности, связанной с предсказаниями из этих данных (которые я пытаюсь убедить кого-то другого плохая идея). Я часто делаю это, построив много строк, построенных из неопределенности в параметрах модели (учебник по многоуровневой регрессии a la Andrew Gelman).]

В качестве примера, вот график в графике базы R.

#The data
p.gap <- c(50,45,57,43,32,30,14,36,51)
p.ag <- c(43,24,52,46,28,17,7,18,29)
data <- as.data.frame(cbind(p.ag, p.gap))

#The model (using non-linear least squares regression):
fit.1.nls <- nls(formula=p.gap~beta1*p.ag^(beta2), start=list(beta1=5.065, beta2=0.6168))
summary(fit.1.nls)

#From the summary, I find the means and s.e the two parameters, and develop their distributions:
beta1 <- rnorm(1000, 7.8945, 3.5689)
beta2 <- rnorm(1000, 0.4894, 0.1282)
coefs <- as.data.frame(cbind(beta1,beta2))

#This is the plot I want (using curve() and base R graphics):
plot(data$p.ag, data$p.gap, xlab="% agricultural land use",
     ylab="% of riparian buffer gap", xlim=c(0,130), ylim=c(0,130), pch=20, type="n")
for (i in 1:1000){curve(coefs[i,1]*x^(coefs[i,2]), add=T, col="grey")}
curve(coef(fit.1.nls)[[1]]*x^(coef(fit.1.nls)[[2]]), add=T, col="red")
points(data$p.ag, data$p.gap, pch=20)

Я могу построить среднюю модельную функцию с данными в ggplot:

fit.mean <- function(x){7.8945*x^(0.4894)}
ggplot(data, aes(x=p.ag, y=p.gap)) +
  scale_x_continuous(limits=c(0,100), "% ag land use") +
  scale_y_continuous(limits=c(0,100), "% riparian buffer gap") +
  stat_function(fun=fit.mean, color="red") +
  geom_point()

Но ничего не делает, рисует несколько строк в ggplot. Кажется, я не вижу никакой помощи в рисовании значений параметров из функций на веб-сайте ggplot или на этом сайте, которые обычно очень полезны. Означает ли это нарушение достаточно теории построения, что никто не осмеливается сделать это?

Любая помощь приветствуется. Спасибо!

Ответ 1

Можно собрать несколько геометрий или статистику (и даже другие элементы графика) в вектор или список и добавить этот вектор/список в график. Используя это, пакет plyr можно использовать для создания списка stat_function, по одному для каждой строки coefs

library("plyr")
coeflines <-
alply(as.matrix(coefs), 1, function(coef) {
  stat_function(fun=function(x){coef[1]*x^coef[2]}, colour="grey")
})

Затем просто добавьте это в график

ggplot(data, aes(x=p.ag, y=p.gap)) +
  scale_x_continuous(limits=c(0,100), "% ag land use") +
  scale_y_continuous(limits=c(0,100), "% riparian buffer gap") +
  coeflines +
  stat_function(fun=fit.mean, color="red") +
  geom_point()

enter image description here

Несколько примечаний:

  • Это медленно. Потребовалось несколько минут на моем компьютере, чтобы рисовать. ggplot не был разработан, чтобы быть очень эффективным при обработке около 1000 слоев.
  • Это просто добавляет 1000 строк. За комментарий @Roland, я не знаю, представляет ли это то, что вы хотите/ожидаете от него статистически.