将三阶多项式及其方程加到r中的ggplot中

Eli*_*eth 28 r ggplot2

我绘制了以下数据并添加了黄土更平滑.我想在图中添加一个三阶多项式及其方程(包括残差).有什么建议?

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何添加三阶多项式?我试过了:

p<- p + geom_smooth(method="lm", se=TRUE, fill=NA,formula=lm(y ~ poly(x, 3, raw=TRUE)),colour="red")
Run Code Online (Sandbox Code Playgroud)

最后,如何将三阶多项式方程和残差加到图中?我试过了:

 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)
Run Code Online (Sandbox Code Playgroud)

And*_*rie 42

第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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


第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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • `lm_eqn` 函数用于线性回归,不适用于三次多项式 (2认同)
  • 让我困惑的一件事 - `formula` 需要引用 `y` 和 `x` 而不是 data.frame 中的变量名称。令人困惑的是,OP 示例中的变量名称恰好是“x”和“y”。 (2认同)

Ped*_*alo 9

答案1,是一个良好的开端,但它不是所要求的三次多项式,并且不能正确处理参数估计的负值.最简单的是使用包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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最后一点:方差随着均值的增加而增加,因此使用lm()和三次多项式模型可能不是分析这些数据的最佳方法.