如何基于R包Growthrates的非线性回归在ggplot中再现图?

我正在使用Growthrates软件包为我的数据生成增长率曲线的参数估计。我进行了回归并查看了生成的图,我对数据感到满意,但是我想在ggplot2中重现以下图。

图1:Multiplot of a regression for each group:treatment combo

我想对每组:治疗组合使用多条回归线,但要对它进行所有回归((例如,逻辑,gompertz,gompertz2等。)。到目前为止,我有:>

library(growthrates)

####Using logistic regression to fit the data across mutliple groups
p     <- c(y0 = 1,mumax = 0.5,K = 200)
lower <- c(y0 = 0,mumax = 0,K = 20)
upper <- c(y0 = 100,mumax = 5,K = 400)

many_logistics <- all_growthmodels(y_data ~ 
                                     grow_logistic(total_time_days,parms) | sample + treatment,data = Alldata,p = p,lower = lower,upper = upper,log = "y")
pp   <- coef(many_logistics)

par(mfrow = c(5,3))
par(mar = c(2.5,4,2,1))
plot(many_logistics)

many_logistics_results <- results(many_logistics)
xyplot(mumax ~ treatment | sample,data = many_logistics_results,layout = c(3,1))
xyplot(r2 ~ treatment | sample,1))
xyplot(K ~ treatment | sample,1))

curve_logistics <- predict(many_logistics) #Prediction for given data (data for curve)
est_logistics <- predict(many_logistics,newdata=data.frame(time=seq(0,1,0.1))) #Extrapolation/Interpolation from curve


####Using Gompertz regression to fit the data across mutliple groups
p     <- c(y0 = 1,K = 400)

many_gompertz <- all_growthmodels(y_datay_data ~ 
                                    grow_gompertz(total_time_days,upper = upper)
pp   <- coef(many_gompertz)

par(mfrow = c(5,1))
plot(many_gompertz)

many_gompertz_results <- results(many_gompertz)
xyplot(mumax ~ treatment | sample,data = many_gompertz_results,1))

curve_gompertz <- predict(many_gompertz) #Prediction for given data (data for curve)
est_gompertz <- predict(many_gompertz,0.1))) #Extrapolation/Interpolation from curve

#Prepare the data frames

curve_logistics2 <- curve_logistics %>% 
  map_df(as_tibble,.id = "src") %>%
  separate(src,c("sample","treatment"),":") %>%
  mutate(regression = "logistic")

curve_gompertz2 <- curve_gompertz %>% 
  map_df(as_tibble,":") %>%
  mutate(regression = "gompertz")

alldata2<- Alldata %>%
  select("sample","treatment","total_time_days","y_data") %>%
  rename(time = "total_time_days") %>%
  rename(y = "y_data") %>%
  mutate(regression = "none") 

comp_reg <- bind_rows(curve_logistics2,curve_gompertz2,alldata2)

#define the function to automatically generate plots#define the function to automatically generate plots

REGRESSION_LINE_PLOT <-function(x) {ggplot(data = x,aes(x=time,y=y,colour = regression,linetype = regression)) + 
    geom_point(size = 2.5,data = subset(x,regression %in% c("none"))) +
    stat_smooth(data = subset(x,regression %in% c("gompertz","logistic"))) +
    theme_bw() + 
    theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank(),panel.spacing = unit(0,"cm"),axis.line=element_line(colour="black"),# axis.title.x = element_text(size=14,colour = "black"),axis.title.x = element_blank(),# axis.title.y = element_text(size=14,axis.title.y = element_blank(),# axis.text.y = element_text(size=14,# axis.text.x = element_text(size=14,strip.background = element_blank(),strip.text = element_text(size = 12,colour="black",face = "bold"),legend.text= element_text(size = 12,legend.title=element_blank(),text = element_text(size=12,family="Arial")) +
    # plot.margin=unit(c(0.1,0.1,0.1),"cm")) +
    #scale_colour_manual(values = cbbPalette) + ### here I tell R to use my custom colour palette
    #scale_x_continuous(limits = c(-1,14)) + # set time range from -1 to 70 since we started sampling on day -1
    #scale_y_continuous(limits = c(-1,350),breaks = seq(0,360,90)) + # For comparison purposes,i want all my panels to have the same y axis scale
    ylab("") + 
    xlab("")
}

comp_reg_nested<- comp_reg %>%
  group_by(sample,treatment) %>%
  nest() %>%
  mutate(plots=map(.x=data,~REGRESSION_LINE_PLOT(.x)))

fo_ad_line <- comp_reg_nested[[1,"plots"]]

但是,我认为ggplot22不能正确表示回归线。有更好的方法吗?

czq40034234 回答:如何基于R包Growthrates的非线性回归在ggplot中再现图?

我从包的内置数据创建了一个与您的数据结构大致相似的数据示例,并略微简化了代码,省略了默认的绘图功能。非常感谢您使用map_df构建数据框的方法,谢谢。然后,我添加了一个简单的ggplot,它当然可以扩展并适应您的需求。

library(growthrates)
library(dplyr)
library(purrr)
library(tidyr)
library(ggplot2)

## use subset of built-in example data of the package
## and adapt it to the existing part of the script
data(bactgrowth)
Alldata <- bactgrowth[(bactgrowth$conc < 1) & bactgrowth$replicate == 1,]
names(Alldata)    <- c("sample","replicate","treatment","total_time_days","y_data")
Alldata$y_data    <- Alldata$y_data * 1000
Alldata$treatment <- as.character(Alldata$treatment)

####Using logistic regression to fit the data across mutliple groups
p     <- c(y0 = 1,mumax = 0.5,K = 200)
lower <- c(y0 = 0,mumax = 0,K = 20)
upper <- c(y0 = 100,mumax = 5,K = 400)

many_logistics <- all_growthmodels(y_data ~
  grow_logistic(total_time_days,parms) | sample + treatment,data = Alldata,p = p,lower = lower,upper = upper)

many_logistics_results <- results(many_logistics)
curve_logistics <- predict(many_logistics)

####Using Gompertz regression to fit the data across mutliple groups
many_gompertz <- all_growthmodels(y_data ~
  grow_gompertz(total_time_days,upper = upper)

many_gompertz_results <- results(many_gompertz)
curve_gompertz <- predict(many_gompertz)

#Prepare the data frames
curve_logistics2 <- curve_logistics %>%
  map_df(as_tibble,.id = "src") %>%
  separate(src,c("sample","treatment"),":") %>%
  mutate(regression = "logistic")

curve_gompertz2 <- curve_gompertz %>%
  map_df(as_tibble,":") %>%
  mutate(regression = "gompertz")

alldata2<- Alldata %>%
  rename(time = "total_time_days",y = "y_data")

## combine the two curves to a joint data frame
comp_reg <- bind_rows(curve_logistics2,curve_gompertz2)

## plot it
ggplot(comp_reg,aes(time,y)) +
  geom_point(data = alldata2) +
  geom_line(aes(color = regression)) +
  facet_grid(treatment ~ sample)
本文链接:https://www.f2er.com/2705525.html

大家都在问