我有一个线性和非线性模型列表,这些模型来自不同的数据集,测量相同的两个变量x
和y
我希望使用{{1}在同一个图上绘制}。这样就可以轻松地比较数据集中stat_smooth
和x
之间关系的形状。
我正在努力找出最有效的方法。现在我正在考虑创建一个空的ggplot对象,然后使用某种循环或y
顺序添加到该对象,但事实证明这比我想象的要困难。当然,简单地将模型提供给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))
答案 0 :(得分:8)
编辑:请注意,OP在此答案发布后更改了问题
将数据合并到一个数据框中,使用新列指示模型,然后使用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))
这会产生:
答案 1 :(得分:3)
我认为这里的答案是获得你希望运行它的X和Y的共同范围,并从那里开始。您可以使用预测从每个模型中拉出曲线,并使用l_ply将图层添加到ggplot。
d
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)