使用R plotly的二次回归线

时间:2018-03-26 11:56:05

标签: r regression plotly quadratic r-plotly

我对R很新,在plotly中真的很新。

我试图绘制二次(即二次多项式)回归线。 一旦某些价格与年份相比,并且一旦相同的价格与某些整数的列表(可以是相同的)相同,我们就说得分。 此示例中的数据是

price = c(995, 675, 690, 600, 612, 700, 589, 532, 448, 512, 537, 560)
score = c(89, 91, 88, 89, 91, 91, 89, 93, 83, 91, 91, 90)
year = c(2005:2016)

第一个适合编码

enter code here
qfit1 <- lm(price ~ poly (year,2))

然后用

绘图
add_trace(x=year, y=fitted(qfit1), type="scatter", 
          mode="lines", line=list(shape="spline"),)

制作这个情节:

enter image description here

然而,第二次适合不起作用:

qfit2 <- lm(price ~ poly (score,2))
p <- plot_ly() %>% ...
  add_trace(x=score, y=fitted(qfit2), type="scatter", mode="lines", 
  line=list(shape="spline", smoothing=1.3))*

给了我:

enter image description here

通过曲线连接我的12个数据值。 然后我对数据进行了排序,以便链接12个值的行将是

连续的
add_trace(x=sort(score), y=fitted(qfit2)[order(score)], 
          type="scatter", mode="lines", 
          line=list(shape="spline", smoothing=1.3))*

但结果不是我想要的结果:

enter image description here

生成的线条根本不平滑,它基本上将12个值与曲线连接起来,而我注意到的(当然我用不同的数据生成了更多类似的图形)是当某个得分(x时)总会出现问题-axis)有各种价格。但是,我无法理解如何解决这个问题。 有什么想法吗? 或者也许有人知道使用R和曲线生成二次拟合线的不同方法? (我也尝试使用add_lines而不是add_trace,但这给了我更糟糕的结果)

非常感谢你。

2 个答案:

答案 0 :(得分:1)

以下是绘制拟合模型的工作代码:

  library(plotly)
  library(dplyr)
  data(cars, package = "datasets")

 qfit1 <- lm(dist ~ poly(speed,2), data = cars)

  cars %>%     
  plot_ly() %>%  
  add_lines(x = ~speed, y = fitted(qfit1)) %>%
  add_trace(x=~speed, y=~dist)

enter image description here

由于安装点很少,因此线条不是那么平滑。要创建更平滑的行,请创建新数据:

  dat <- data.frame(speed = (1:300)/10,
                    dist = predict(qfit1, data.frame(speed = (1:300)/10)))
  plot_ly() %>% 
      add_trace(x=~speed, y=~dist, type="scatter", mode="lines", data = dat) %>%
      add_trace(x=~speed, y=~dist, type="scatter", data = cars)

enter image description here

使用评论中的数据:

 dat1 = data.frame(
       price = c(995, 675, 690, 600, 612, 700, 589, 532, 448, 512, 537, 560),
       score = c(89, 91, 88, 89, 91, 91, 89, 93, 83, 91, 91, 90))

qfit2 <- lm(price ~ poly (score,2), data = dat1)

  dat3 <- data.frame(score = (800:950)/10,
                    price = predict(qfit2, data.frame(score = (800:950)/10)))

plot_ly() %>% 
   add_trace(x=~score, y=~price, type="scatter", mode="lines", data = dat3) %>%
   add_trace(x=~score, y=~price, type="scatter", data = dat1)

enter image description here

问题是您的拟合值是稀疏且不均匀的,因此您需要预测均匀间隔的新数据以获得漂亮的曲线。

答案 1 :(得分:0)

您还可以使用ggplot2ggplotly来获得所需内容。试试这个:

library(plotly)
library(ggplot2)
data_df <- data.frame(price, score, year)
p <- ggplot(data_df, aes(x=score, y=price)) + 
  geom_point() + 
  geom_smooth(method="lm", se=FALSE, fill=NA, formula=y ~ poly(x, 2, raw=TRUE),colour="blue") + 
  theme_bw() 
ggplotly(p)