我策划了以下数据,并增加了黄土顺畅。 我想补充一个3阶多项式和方程(包括残差)的情节。 有什么建议?
set.seed(1410)
dsmall<-diamonds[sample(nrow(diamonds), 100), ]
df<-data.frame("x"=dsmall$carat, "y"=dsmall$price)
p <-ggplot(df, aes(x, y))
p <- p + geom_point(alpha=2/10, shape=21, fill="blue", colour="black", size=5)
#Add a loess smoother
p<- p + geom_smooth(method="loess",se=TRUE)
我如何添加一个3阶多项式? 我试过了:
p<- p + geom_smooth(method="lm", se=TRUE, fill=NA,formula=lm(y ~ poly(x, 3, raw=TRUE)),colour="red")
最后,我怎么可以添加3阶多项式方程和残差图? 我试过了:
lm_eqn = function(df){
m=lm(y ~ poly(x, 3, df))#3rd degree polynomial
eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
list(a = format(coef(m)[1], digits = 2),
b = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq))
}
data.label <- data.frame(x = 1.5,y = 10000,label = c(lm_eqn(df)))
p<- p + geom_text(data=data.label,aes(x = x, y = y,label =label), size=8,family="Times",face="italic",parse = TRUE)
第1部分:以适应多项式,使用参数:
-
method=lm
-你正确地这样做 -
formula=y ~ poly(x, 3, raw=TRUE)
-即不以呼叫包裹这lm
代码:
p + stat_smooth(method="lm", se=TRUE, fill=NA,
formula=y ~ poly(x, 3, raw=TRUE),colour="red")
第2部分:添加方程式:
- 修改你的函数
lm_eqn()
正确指定数据源lm
-你在错误的地方有一个右括号 - 使用
annotate()
来定位标签,而不是geom_text
代码:
lm_eqn = function(df){
m=lm(y ~ poly(x, 3), df)#3rd degree polynomial
eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
list(a = format(coef(m)[1], digits = 2),
b = format(coef(m)[2], digits = 2),
r2 = format(summary(m)$r.squared, digits = 3)))
as.character(as.expression(eq))
}
p + annotate("text", x=0.5, y=15000, label=lm_eqn(df), hjust=0, size=8,
family="Times", face="italic", parse=TRUE)
答案1,是一个良好的开端,但它不是一个3阶多项式为要求,并能妥善处理不能与参数估计负值。 最简单的就是使用的软件包polynom
。 我将展示一个版本没有定义一个函数,因为真正应该使用一个ggplot stat_
在这样的情况下。
下面我将展示如何生成的文本被用作任何程度的多项式解析标签。 我用signif()
而不是format()
因为这是参数估计值更加有用。 还要注意的是face
不再需要。 使用family = "Times"
是不可移植的,并且同样的效果可以达到"serif"
。 所有的辛勤工作是做as.character.polynomial()
library(polynom)
library(ggplot2)
set.seed(1410)
dsmall <- diamonds[sample(nrow(diamonds), 100), ]
df <- data.frame("x"=dsmall$carat, "y"=dsmall$price)
my.formula <- y ~ poly(x, 3, raw = TRUE)
p <- ggplot(df, aes(x, y))
p <- p + geom_point(alpha=2/10, shape=21, fill="blue", colour="black", size=5)
p <- p + geom_smooth(method = "lm", se = FALSE,
formula = my.formula,
colour = "red")
m <- lm(my.formula, df)
my.eq <- as.character(signif(as.polynomial(coef(m)), 3))
label.text <- paste(gsub("x", "~italic(x)", my.eq, fixed = TRUE),
paste("italic(R)^2",
format(summary(m)$r.squared, digits = 2),
sep = "~`=`~"),
sep = "~~~~")
p + annotate(geom = "text", x = 0.2, y = 15000, label = label.text,
family = "serif", hjust = 0, parse = TRUE, size = 4)
最后要注意的:方差与均值增加,因此,使用lm()
和第3次多项式模型可能不是这些数据的分析,最好的办法。