如何在R中的散点图中添加非线性趋势线?[关闭]


Answers:


34

让我们创建一些数据。

n <-100
x <-seq(n)
y <-rnorm(n,50 + 30 * x ^(-0.2),1)
数据<-data.frame(x,y)

下面显示了如何拟合黄土线或非线性回归的拟合。

情节(y〜x,数据)

#适合黄土线
loess_fit <-黄土(y〜x,数据)
行(Data $ x,predict(loess_fit),col =“ blue”)

#拟合非线性回归
nls_fit <-nls(y〜a + b * x ^(-c),Data,start = list(a = 80,b = 20, 
    c = 0.2))
行(数据$ x,预测(nls_fit),col =“红色”)

块export_plot的图


1
关于绘图,对于那些遇到订单问题的人,此建议非常有用
tflutre 2014年

23

如果您使用ggplot2(第三个绘图系统,在R中,在基本R和晶格之后),则变为:

library(ggplot2)
ggplot(Data, aes(x,y)) + geom_point() + geom_smooth()

情节

您可以选择平滑数据的方式:?stat_smooth有关详细信息和示例,请参阅。


漂亮的图表和解释!但是阴影区是什么意思呢?
达尔文PC

3
阴影区域是平滑线周围的置信区间。您可以stat_smooth通过输入R的帮助文件(?stat_smooth如Vincent所述)来找到R的帮助文件。:-)
我想

9

无需完全知道您要寻找的是什么,使用该lattice软件包即可轻松添加带有的黄土曲线type="smooth"。例如,

> library(lattice)
> x <- rnorm(100)
> y <- rnorm(100)
> xyplot(y ~ x, type=c("smooth", "p"))

请参阅参考资料,help("panel.loess")以获取可传递给黄土拟合例程以更改(例如)要使用的多项式的次数的参数。

在此处输入图片说明

更新资料

要更改黄土曲线的颜色,您可以编写一个小函数并将其作为panel参数传递给xyplot

x <- rnorm(100)
y <- rnorm(100)

panel_fn <- function(x, y, ...)
{
    panel.xyplot(x, y, ...)
    panel.xyplot(x, y, type="smooth", col="red", ...)
}

xyplot(y ~ x, panel=panel_fn)

在此处输入图片说明


您如何使线条具有不同的颜色?
EngrStudent-恢复莫妮卡2015年

1
@EngrStudent我更新了答案。
杰森·摩根

8

您的问题有点含糊,所以我将对您的问题做出一些假设。如果您可以建立一个散点图并稍微描述一下数据,将会很有帮助。请,如果我做出错误的假设,请忽略我的答案。

首先,您的数据可能描述了您合理地认为是非线性的某个过程。例如,如果您要对突然刹车时汽车停止行驶的距离与汽车速度进行回归分析,物理学告诉我们,汽车的能量与速度的平方成正比,而不是与速度的平方成正比本身。因此,在这种情况下,您可能想尝试多项式回归,并且(在R中)您可以执行类似的操作model <- lm(d ~ poly(v,2),data=dataset)。关于如何将各种非线性纳入回归模型,有很多文档。

另一方面,如果您的行“颤抖”并且不知道为什么颤抖,那么一个好的起点可能是局部加权回归或loess以R表示。这会在较小的范围内进行线性回归区域,而不是整个数据集。想象一个“ k最近邻居”版本是最容易的,在该版本中,可以在任何点计算曲线的值,找到最靠近兴趣点的k个点,然后取平均值。黄土就是这样,但是使用回归而不是直线平均。为此,请使用model <- loess(y ~ x, data=dataset, span=...),其中span变量控制平滑程度。

第三方面(精疲力尽)-您是在谈论趋势吗?这是暂时的问题吗?如果是这样,请谨慎对待趋势线及其统计意义。时间序列的趋势可能会出现在“自回归”过程中,对于这些过程,过程的随机性有时可能会由于随机噪声而构造出趋势,而错误的统计显着性检验会告诉您,在没有噪声的情况下,这是很重要的!


6

将散点图样本点和平滑曲线放在同一图形上:

  library(graphics)
  ## Create some x,y sample points falling on hyperbola, but with error:
  xSample = seq(0.1, 1.0, 0.1)
  ySample = 1.0 / xSample
  numPts <- length(xSample)
  ySample <- ySample + 0.5 * rnorm(numPts) ## Add some noise

  ## Create x,y points for smooth hyperbola:
  xCurve <- seq(0.1, 1.0, 0.001)
  yCurve <- 1.0 / xCurve

  plot(xSample, ySample, ylim = c(0.0, 12.0))   ## Plot the sample points
  lines(xCurve, yCurve, col = 'green', lty = 1) ## Plot the curve

曲线平滑的散点图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.