添加趋势线方程和R2值

问题描述 投票:0回答:1

我绘制了特定化学品的浓度随时间的变化。我需要显示数据的指数趋势线。数据是从更大的数据集中过滤出来的。我使用下面的代码来获取趋势线,但我无法添加方程和 r2 值。任何帮助将不胜感激。

dinotefuran <- filter(correlation_analysis,
                      chemical == "Dinotefuran")

dosage <- c("Single","Single","Single","Single","Single","Single","Single","Single","Single",
            "Double","Double","Double","Double","Double","Double","Double","Double","Double",
            "Single","Single","Single","Single","Single","Single",
            "Double","Double","Double","Double","Double","Double",
            "Single","Single","Single","Single","Single","Single","Single","Single","Single",
            "Double","Double","Double","Double","Double","Double","Double","Double","Double")

dinotefuran <- data.frame(dinotefuran, dosage)

绘制呋虫胺在不同基质中的浓度变化

ggplot(data = dinotefuran) +
  geom_point(mapping = aes(x = time_das, y = concentration_mg_by_kg, color = dosage)) +
  geom_smooth(mapping = aes(x = time_das, y = concentration_mg_by_kg, color = dosage, group = dosage),
              method = "nlsLM",
              formula = y ~ a * exp(b * x),
              se = FALSE,
              linetype = 2,
              method.args = list(start = c(a = 0.5, b = 0.2), control = nls.lm.control(maxiter = 100))) +
  facet_wrap(~ plant_part, scales = "free") +
  labs(title = "Dinotefuran Variation in Plant parts",
       x = "Time (d)",
       y = "Concentration (mg/kg)") +
  design

这是我当前得到的输出 我尝试了 nls 方法,但它没有给我趋势线。我还想显示置信区间,但是当我更改 se=TRUE 时,不会显示趋势线。对于方程,我尝试使用 geom_text 和 stat_poly_eq 但不幸的是这些都不起作用。

数据是

结构(列表(化学 = c(“呋虫胺”,“呋虫胺”,“呋虫胺”, “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、 “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、 “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、 “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、 “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、 “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、 “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、 “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、 “呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺”、“呋虫胺” ), Crop = c("辣椒", "辣椒", "辣椒", “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, “辣椒”,“辣椒”,“辣椒”,“辣椒”, "辣椒"), plant_part = c("水果", "水果", "水果", "水果", “水果”,“水果”,“水果”,“水果”,“水果”,“水果”,“水果”, “水果”,“水果”,“水果”,“水果”,“水果”,“水果”,“水果”, “土壤”,“土壤”,“土壤”,“土壤”,“土壤”,“土壤”,“土壤”,“土壤”, “土壤”,“土壤”,“土壤”,“土壤”,“水果(干)”,“水果(干)”, “水果(干)”,“水果(干)”,“水果(干)”,“水果(干)”, “水果(干)”,“水果(干)”,“水果(干)”,“水果(干)”, “水果(干)”,“水果(干)”,“水果(干)”,“水果(干)”, “水果(干)”,“水果(干)”,“水果(干)”,“水果(干)” ), time_das = c(0, 1, 3, 5, 7, 10, 15, 21, 25, 0, 1, 3, 5, 7, 10, 15, 21, 25, 0, 1, 3, 5, 7, 10, 0, 1, 3, 5, 7, 10, 0, 1, 3, 5, 7, 10, 15, 21, 25, 0, 1, 3, 5, 7, 10, 15, 21, 25), 浓度_mg_by_kg = c(0.605, 0.547、0.396、0.176、0.062、0.029、0.01、0.01、0.01、1.148、 1.503、0.765、0.342、0.096、0.061、0.015、0.01、0.01、0.529、 0.407、0.229、0.094、0.041、0.01、0.818、0.592、0.232、0.089、 0.029、0.01、1.628、1.519、1.113、0.517、0.185、0.096、0.027、 0.01、0.01、2.32、2.163、1.624、0.946、0.356、0.198、0.058、 0.019, 0.01), type_of_obs = c("平均值", “平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”, “平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”, “平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”, “平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”, “平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”,“平均”, “平均值”,“平均值”,“平均值”,“平均值”,“平均值”,“平均值”,“平均值”),剂量 = c(“单次”,“单次”, “单身”、“单身”、“单身”、“单身”、“单身”、“单身”、 “单人”、“双人”、“双人”、“双人”、“双人”、“双人”、 “双”、“双”、“双”、“双”、“单”、“单”、 “单人”、“单人”、“单人”、“单人”、“双人”、“双人”、 “双”、“双”、“双”、“双”、“单”、“单”、 “单身”、“单身”、“单身”、“单身”、“单身”、“单身”、 “单人”、“双人”、“双人”、“双人”、“双人”、“双人”、 "双", "双", "双", "双")), class = "data.frame", row.names = c(NA, -48L))

r ggplot2 trendline
1个回答
0
投票

一个可能的选择是在

ggplot
之外拟合模型,捕获各个部分(例如拟合值、R2),然后绘制:

如果这种方法适合您,我只需要添加方程?

library(tidyverse)
library(minpack.lm)

correlation_analysis <- structure(list(
  chemical = c("Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran", "Dinotefuran"),
  crop = c("Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper", "Chilli pepper"),
  plant_part = c("Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Soil", "Soil", "Soil", "Soil", "Soil", "Soil", "Soil", "Soil", "Soil", "Soil", "Soil", "Soil", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)", "Fruit (dried)"),
  time_das = c(0, 1, 3, 5, 7, 10, 15, 21, 25, 0, 1, 3, 5, 7, 10, 15, 21, 25, 0, 1, 3, 5, 7, 10, 0, 1, 3, 5, 7, 10, 0, 1, 3, 5, 7, 10, 15, 21, 25, 0, 1, 3, 5, 7, 10, 15, 21, 25),
  concentration_mg_by_kg = c(0.605, 0.547, 0.396, 0.176, 0.062, 0.029, 0.01, 0.01, 0.01, 1.148, 1.503, 0.765, 0.342, 0.096, 0.061, 0.015, 0.01, 0.01, 0.529, 0.407, 0.229, 0.094, 0.041, 0.01, 0.818, 0.592, 0.232, 0.089, 0.029, 0.01, 1.628, 1.519, 1.113, 0.517, 0.185, 0.096, 0.027, 0.01, 0.01, 2.32, 2.163, 1.624, 0.946, 0.356, 0.198, 0.058, 0.019, 0.01),
  type_of_obs = c("Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean", "Mean"),
  dosage = c("Single", "Single", "Single", "Single", "Single", "Single", "Single", "Single", "Single", "Double", "Double", "Double", "Double", "Double", "Double", "Double", "Double", "Double", "Single", "Single", "Single", "Single", "Single", "Single", "Double", "Double", "Double", "Double", "Double", "Double", "Single", "Single", "Single", "Single", "Single", "Single", "Single", "Single", "Single", "Double", "Double", "Double", "Double", "Double", "Double", "Double", "Double", "Double")
), class = "data.frame", row.names = c(NA, -48L))

dinotefuran <- filter(correlation_analysis,
                      chemical == "Dinotefuran")

dosage <- c("Single","Single","Single","Single","Single","Single","Single","Single","Single",
            "Double","Double","Double","Double","Double","Double","Double","Double","Double",
            "Single","Single","Single","Single","Single","Single",
            "Double","Double","Double","Double","Double","Double",
            "Single","Single","Single","Single","Single","Single","Single","Single","Single",
            "Double","Double","Double","Double","Double","Double","Double","Double","Double")

dinotefuran <- data.frame(dinotefuran, dosage)

# Create model function
mod_nlslm <- \(data) nlsLM(
  formula = concentration_mg_by_kg ~ a * exp(b * time_das),
  start = list(a = 0.12345, b = 0.54321), data = data,
  algorithm = "LM", control = nls.lm.control(maxiter = 100)
)

# Model outside of ggplot augmenting data with R2 and fitted points
modelled_df <- dinotefuran |> 
  nest(data = -c(plant_part, dosage)) |> 
  mutate(
    model = map(data, mod_nlslm),
    r2 = map2_dbl(model, data, modelr::rsquare),
    fitted = map(model, fitted)
    ) |> 
  unnest(c(data, fitted))

# Summarise R2
label_df <- modelled_df |> 
  summarise(r2 = paste("R2=", round(first(r2), 2)), 
            x = mean(time_das),
            y = max(concentration_mg_by_kg),
            .by = c(plant_part, dosage))

# Plot R2 and fitted lines with original data
modelled_df |>
  ggplot(aes(time_das, concentration_mg_by_kg, color = dosage, group = dosage)) +
  geom_point() +
  geom_line(aes(y = fitted), linetype = "dashed") +
  geom_text(aes(x, y, label = r2), data = label_df) +
  facet_wrap(~plant_part, scales = "free") +
  labs(
    title = "Dinotefuran Variation in Plant parts",
    x = "Time (d)",
    y = "Concentration (mg/kg)"
  )

创建于 2024-05-07,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.