ggplot2 - 在同一个图中绘制多个模型

4
我有一些线性和非线性模型,这些模型是从不同的数据集中得出来的,这些数据集测量了相同的两个变量x和y。我想使用stat_smooth将它们放在同一个图表上,以便可以轻松比较跨数据集的x和y之间的关系形状。
我正在尝试找到最有效的方法来做到这一点。现在我正在考虑创建一个空的ggplot对象,然后使用某种循环或lapply逐个添加到该对象中,但这比我想象的更困难。当然,最简单的方法是直接向ggplot提供模型,但据我所知,这是不可能的。您有什么想法吗?
这里有一个简单的示例数据集,只使用了两个模型,一个是线性的,一个是指数的:
df1=data.frame(x=rnorm(10),y=rnorm(10))
df2=data.frame(x=rnorm(15),y=rnorm(15))

df.list=list(lm(y~x,df1),nls(y~exp(a+b*x),start=list(a=1,b=1),df2))

以下是两个不同的示例图:

ggplot(df1,aes(x,y))+stat_smooth(method=lm,se=F)
ggplot(df2,aes(x,y))+stat_smooth(method=nls,formula=y~exp(a+b*x),start=list(a=1,b=1),se=F)
2个回答

9

编辑:请注意,问题在本回答发布后已被提问者更改

将数据合并成一个数据框,并添加一个新的列来指示模型类型,然后使用 ggplot 区分模型:

df1=data.frame(x=rnorm(10),y=rnorm(10))
df2=data.frame(x=rnorm(10),y=rnorm(10))

df1$model <- "A"
df2$model <- "B"

dfc <- rbind(df1, df2)

library(ggplot2)
ggplot(dfc, aes(x, y, group=model)) + geom_point() + stat_smooth(aes(col=model))

这将产生以下结果:

在此输入图像描述


啊,看来我的简单示例太简单了。我已经改变了它,包括数据集之间长度不同的x和y以及两种不同类型的模型(线性和指数)。我不确定你的解决方案——对于我提供的样本来说,在技术上是正确的,这是我的错——是否适用于这种情况。有什么想法吗? - jslefche
听起来你应该接受这个答案来解决你提出的问题。你可以看看它是否适用于你的情况。如果不行,就创建一个可重现的例子并提出更具体的问题。 - Gregor Thomas
但你也可能会感到惊讶,我认为不同行数不应该是一个问题。 - Gregor Thomas

3
我认为这里的答案是先确定您要运行此操作的X和Y的公共范围,然后从那里开始。您可以使用predict从每个模型中提取出一条曲线,并使用l_ply将图层添加到ggplot中。
f1=data.frame(x=rnorm(10),y=rnorm(10))
df2=data.frame(x=rnorm(15),y=rnorm(15))

df.list=list(lm(y~x,df1),nls(y~exp(a+b*x),start=list(a=1,b=1),df2))


a<-ggplot()


#get the range of x you want to look at
x<-seq(min(c(df1$x, df2$x)), max(c(df1$x, df2$x)), .01)

#use l_ply to keep adding layers
l_ply(df.list, function(amod){

  #a data frame for predictors and response
  ndf <- data.frame(x=x)

  #get the response using predict - you can even get a CI here
  ndf$y <- predict(amod, ndf)

  #now add this new layer to the plot
  a<<- a+geom_line(ndf, mapping=(aes(x=x, y=y)))

} )

a

或者,如果您想要一个带有型号或其他信息的漂亮颜色键:

names(df.list) <- 1:length(df.list)
modFits <- ldply(df.list, function(amod){
  ndf <- data.frame(x=x)

  #get the response using predict - you can even get a CI here
  ndf$y <- predict(amod, ndf)

  ndf

  })


qplot(x, y, geom="line", colour=.id, data=modFits)

Jarrett因为提供了一种方便适应不同类型模型的方法而获得了积分。我曾考虑从模型中提取拟合值,但我喜欢将它们存储在列表中的想法。 - jslefche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接