在图中使用几种回归方法 [包含数据]

Purrring several regression methods in a plot [data included]

TL;DR [

x 我正在为 tibble 中的每个物种绘制一个散点图,其中叠加了两种类型的回归。显示由树的直径预测的高度。

x nls 找到多个可能的 data 并且无法计算 geom_smooth - 一个 tidyeval 错误?

x 我不确定如何使用 'map2' 的用户定义函数。

]

我的数据帧示例 train.data 作为 dput 输出附加在消息末尾。

我已将数据分成测试集 (20%) 和训练集 (80%)。我之前已经计算了线性和非线性模型的摘要,并绘制了预测值与估计值的关系图。但我想要一个带有估计模型(线性和非线性)曲线的图表,如果我理解正确,ggplot2 应该得出与 nlslm?在 tibble 中而不是在 data.frame 中包含偏移量(所有观察结果相同)的 tidyverse 方法将非常受欢迎。

首先,创建绘图函数来绘制地图。 NLS是红色,LM是蓝色。

double_mapper <- function(x, colname) {
  ggplot(data = x, aes(x=dia, y=Height)) + 
  geom_point(shape=1) + 
  ggtitle(label = colname)+
  theme_bw() +
  theme(legend.title=element_blank(), axis.title = element_blank())+
  geom_smooth(method="nls",
              formula= Height ~ -1 +I(dia^2)/I((a+b*dia)^2),
              method.args = list(offset=offset, 
                                 start = list(a=10, b=0.2), #Earlier study solution
                                 se=F),
              color="red")+
  geom_smooth(method="lm",
              formula= Height ~ -1 + dia,
              method.args= list(offset=offset),
              color="blue"
  )
}

用嵌套物种创建一个 tibble 并为每个物种创建一个图表。

mixed_df_test <- train.data %>%
  group_by(SPP) %>%
  nest() %>% 
  mutate(graphs=map2(.x = data,.y = SPP, partial(double_mapper,
                                                 x= .x,
                                                 colname=.y)))

plots_model_mixed <- ggpubr::ggarrange(plotlist = mixed_df_test$graphs, common.legend=TRUE,legend = "top",ncol = 2,nrow = 4)

错误信息:

来自 map2

Error in (function (x, colname)  : unused arguments (.x[[1]], .y[[1]])

来自 nls

Warning messages:
1: Computation failed in `stat_smooth()`:
parameters without starting value in 'data': Height, dia

dput of train.data:

structure(list(SPP = c("Abies sibirica", "Abies sibirica", "Abies sibirica", 
"Abies sibirica", "Abies sibirica", "Pinus sylvestris", "Pinus sylvestris", 
"Pinus sylvestris", "Pinus sylvestris", "Pinus sylvestris"), 
    Height = c(6, 7.6, 9.9, 6.2, 8.1, 8.3, 7.7, 8.2, 7.8, 9.6
    ), dia = c(74.4580418759451, 96.2808392152873, 115.995689575087, 
    84.4985206971104, 104.498803820905, 141.492049246592, 151.459565561241, 
    177.997190989072, 190.499343830891, 152), offset = c(1.3, 
    1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3)), row.names = c(NA, 
-10L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), groups = structure(list(
    SPP = c("Abies sibirica", "Pinus sylvestris"), .rows = list(
        1:5, 6:10)), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE))

原始代码中存在一些问题。

1) 在 partial 之前你需要一个 ~。实际上,在此示例中您不需要部分。

2) geom_smooth 中的公式中必须使用 xy 而不是原始变量的名称。

3) 你需要告诉 ggplot 在哪里可以找到 offset

4) segeom_smooth 的参数而不是 method.args

之一
double_mapper <- function(x, colname) {
  ggplot(data = x, aes(x=dia, y=Height)) + 
    geom_point(shape=1) + 
    ggtitle(label = colname)+
    theme_bw() +
    theme(legend.title=element_blank(), axis.title = element_blank())+
     geom_smooth(method="nls",
                 formula = y ~ -1 +I(x^2)/I((a+b*x)^2),
                 method.args = list(offset=x$offset, 
                                    start = list(a=10, b=0.2)), #Earlier study solution
                se = FALSE,
                color="red") +
    geom_smooth(method="lm",
                formula= y ~ -1 + x,
                method.args= list(offset=x$offset),
                color="blue"
    )
}


mixed_df_test <- train.data %>%
  group_by(SPP) %>%
  nest() %>% 
  mutate(graphs=map2(.x = data,.y = SPP, ~double_mapper(
                                                 x= .x,
                                                 colname=.y)))

plots_model_mixed <- ggpubr::ggarrange(plotlist = mixed_df_test$graphs, common.legend=TRUE,legend = "top",ncol = 2,nrow = 4)
plots_model_mixed

我相当确定您可以使用分面而不是多图 - 这会使代码简单得多。我不确定如何指定偏移量(最好在图外拟合模型并在 data.frame.

中提供拟合值

如果 facets 不起作用,请查看 patchwork 包以了解组合图的简单方法。