【问题标题】:How to fit custom curves for each level of facet_wrap in ggplot2 R?如何在ggplot2 R中为每个级别的facet_wrap拟合自定义曲线?
【发布时间】:2020-12-03 14:14:37
【问题描述】:

我有一个散点图,其中 x = xaxis 和 y = yaxis 以及两个级别,我需要分别拆分和分析数据。对于每组数据,我需要绘制y ~ (A*((B*x/C)-1) - 1)*log(x)) 形式的自定义函数。对于每个级别,我需要指定 A、B 和 C。如何在 ggplot2 中执行此操作?

ggplot2 的示例代码。我已经生成了随机数据,因此平滑函数可能对这些数据没有意义(但对我的原始数据有意义)

xaxis = c(1:100)
yaxis = rnorm(100,2,0.1)
level = rep(c("A","B"), 50)

    
df <- data.frame(xaxis, yaxis, level)
ggplot(df,aes(x= xaxis, y = yaxis, col = level)) + geom_point() +facet_wrap(.~level, scales="free")+ geom_smooth(method="lm", formula = y ~ (A*((B*x/C)-1) - 1)*log(x))

【问题讨论】:

  • ggplot 的目的是可视化。它具有标准模型的一些功能,但是当建模变得复杂时,通常更容易将建模与可视化分开进行。我建议使用nls(或您喜欢的任何功能)来拟合您的模型,然后绘制结果,而不是花费大量精力使两者同时发生..
  • level 是什么?它没有定义,并且它不存在于数据框中
  • @GregorThomas 我一直都在说同样的观点,尽管在这种情况下,在geom_smooth 中运行nls 会很容易。这里更大的问题是我不认为指定的这个模型会收敛。它包含一个 B 和 C,它们实际上只是形成一个比率。它们的个体值无法通过回归确定。
  • @Mouad_Seridi 哎呀我现在添加了它
  • @Biotechgeek 您只是想在指定 A、B 和 C 的地方画线 y ~ (A*((B*x/C)-1) - 1)*log(x),还是要找到 A、B 和 C?

标签: r function ggplot2 curve-fitting


【解决方案1】:

如果试图拟合模型以使用您的公式找到 A、B 和 C 的值,您不能这样做,原因很简单,因为 B 和 C 在您的公式中仅显示为比率。因此,如果“B”的真实值为 4,“C”的真实值为 2,那么这与“B”为 12 和“C”为 6 是无法区分的。两个可以通过回归来估计。

如果您只想绘制公式指定的线,并在其中预先指定A、B 和C,那么 可能的。例如:

my_func <- function(x, A, B, C) (A*((B*x/C)-1) - 1)*log(x)

ggplot(df,aes(x= xaxis, y = yaxis, col = level)) + 
  geom_point() +
  facet_wrap(.~level, scales = "free")+ 
  geom_function(data = data.frame(xaxis = 0, yaxis = 0, level = "A"),
                fun = my_func,
                args = list(A = 0.05, B = 2, C = 5)) +
  geom_function(data = data.frame(xaxis = 0, yaxis = 0, level = "B"),
                fun = my_func,
                args = list(A = 0.1, B = -0.0005, C = 1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多