简体   繁体   English

绘制相同数据的GLM和LM

[英]Plotting both a GLM and LM of same data

I would like to plot both a linear model (LM) and non-linear (GLM) model of the same data. 我想绘制同一数据的线性模型(LM)和非线性模型(GLM)。

The range between 16% - 84% should line up between a LM and GLM, Citation: section 3.5 LM和GLM之间的范围应介于16%-84%之间, 引文:第3.5节

I have included a more complete chunk of the code because I am not sure at which point I should try to cut the linear model. 我包含了更完整的代码块,因为我不确定在那一点上应该尝试削减线性模型。 or at which point I have messed up - I think with the linear model . 或在那一点上我搞砸了-我认为是线性模型

The code below results in the following image: 下面的代码产生以下图像: 下面代码的输出

My Objective (taken from previous citation-link). 我的目标 (摘自先前的引用链接)。

通缉

Here is my data: 这是我的数据:

mydata3 <- structure(list(
               dose = c(0, 0, 0, 3, 3, 3, 7.5, 7.5, 7.5, 10,     10, 10, 25, 25, 25, 50, 50, 50), 
               total = c(25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L), 
               affected = c(1, 0, 1.2, 2.8, 4.8, 9, 2.8, 12.8, 8.6, 4.8, 4.4, 10.2, 6, 20, 14, 12.8, 23.4, 21.6), 
               probability = c(0.04, 0, 0.048, 0.112, 0.192, 0.36, 0.112, 0.512, 0.344, 0.192, 0.176, 0.408, 0.24, 0.8, 0.56, 0.512, 0.936, 0.864)), 
               .Names = c("dose", "total", "affected", "probability"), 
               row.names = c(NA, -18L), 
               class = "data.frame")

My script: 我的剧本:

#load libraries

library(ggplot2)
library(drc)  # glm model
library(plyr) # rename function
library(scales) #log plot scale

#Creating linear model
mod_linear <- lm(probability ~ (dose), weights = total, data = mydata3)

#Creating data.frame: note values 3 and 120 refer to 16% and 84% response in sigmoidal plot
line_df <-expand.grid(dose=exp(seq(log(3),log(120),length=200)))

#Extracting values from linear model
p_line_df <- as.data.frame(cbind(dose = line_df,
                               predict(mod_linear, newdata=data.frame(dose = line_df),
                                       interval="confidence",level=0.95)))

#Renaming linear df columns
p_line_df <-rename(p_line_df, c("fit"="probability"))
p_line_df <-rename(p_line_df, c("lwr"="Lower"))
p_line_df <-rename(p_line_df, c("upr"="Upper"))
p_line_df$model <-"Linear"


#Create sigmoidal dose-response curve using drc package
    mod3 <- drm(probability ~ (dose), weights = total, data = mydata3, type ="binomial", fct=LL.2(names=c("Slope:b","ED50:e")))

    #data frame for ggplot2 
    base_DF_3 <-expand.grid(dose=exp(seq(log(1.0000001),log(10000),length=200)))

    #extract data from model
    p_df3 <- as.data.frame(cbind(dose = base_DF_3,
                                 predict(mod3, newdata=data.frame(dose = base_DF_3),
                                         interval="confidence", level=.95)))

#renaming columns
p_df3 <-rename(p_df3, c("Prediction"="probability"))
p_df3$model <-"Sigmoidal" 

#combining Both DataFames
 p_df_all <- rbind(p_df3, p_line_df)

#plotting
ggplot(p_df_all, aes(x=dose,y=probability, group=model))+
    geom_line(aes(x=dose,y=probability,group=model,linetype=model),show.legend = TRUE)+
  scale_x_log10(breaks = c(0.000001, 10^(0:10)),labels = c(0, math_format()(0:10)))

Looking at the reference you provided, what the authors describe is the use of a linear model to approximate the central portion of a (sigmoidal) logistic function. 查看您提供的参考资料,作者描述的是使用线性模型来近似(S型)逻辑函数的中心部分。 The linear model that achieves this is a straight line that passes through the inflection point of the logistic curve, and has the same slope as the logistic function at that inflection point. 实现此目的的线性模型是一条通过逻辑曲线拐点的直线,并且与该拐点处的逻辑函数具有相同的斜率。 We can use some basic algebra and calculus to solve this problem. 我们可以使用一些基本的代数和微积分来解决这个问题。

From ?LL.2 , we see that the form of the logistic function being fitted by drm is ?LL.2可以看出, drm拟合的逻辑函数的形式为

f(x) = 1 / {1 + exp(b(log(x) - log(e)))} f(x)= 1 / {1 + exp(b(log(x)-log(e)))}

We can get the values of the coefficient in this equation by 我们可以通过以下公式获得该方程式中系数的值:

b = mod3$coefficients[1]
e = mod3$coefficients[2]

Now, by differentiation, the slope of the logistic function is given by 现在,通过微分,逻辑函数的斜率由下式给出:

dy/dx = -(b * exp((log(x)-log(e))*b)) / (1+exp((log(x)-log(e))*b))^2 dy / dx =-(b * exp((log(x)-log(e))* b))/(1 + exp((log(x)-log(e))* b))^ 2

At the inflection point, the dose (x) is equal to the coefficient e, thus the slope at the inflection point simplifies (greatly) to 在拐点处,剂量(x)等于系数e,因此拐点处的斜率简化为(极大)为

sl50 = -b/4

Since we also know that the inflection point occurs at the point where probability = 0.5 and dose = e , we can construct the straight line (in log-transformed coordinates) like this: 因为我们也知道拐点发生在probability = 0.5dose = e ,所以我们可以这样构造直线(在对数转换的坐标中):

linear_probability = sl50 * (log(p_df3$dose) - log(e)) + 0.5

Now, to plot the logistic and linear functions together: 现在,将逻辑函数和线性函数一起绘制:

p_df3_lin = p_df3
p_df3_lin$model = 'linear'
p_df3_lin$probability = linear_probability

p_df_all <- rbind(p_df3, p_df3_lin)

ggplot(p_df_all, aes(x=dose,y=probability, group=model))+
  geom_line(aes(x=dose,y=probability,group=model,linetype=model),show.legend = TRUE)+
  scale_x_log10(breaks = c(0.000001, 10^(0:10)),labels = c(0, math_format()(0:10))) +
  scale_y_continuous(limits = c(0,1))

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM