如何将非线性趋势线添加到R中的散点图中?

机器算法验证 r 数据可视化 非线性回归 趋势
2022-02-15 06:21:19

我有一个散点图。如何添加非线性趋势线?

4个回答

让我们创建一些数据。

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

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

情节(y〜x,数据)

# 拟合黄土线
loess_fit <- loess(y ~ x, 数据)
线(数据$x,预测(loess_fit),col =“蓝色”)

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

块 export_plot 的情节

如果您使用ggplot2(第三个绘图系统,在 R 中,在基础 R 和格子之后),这将变为:

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

阴谋

您可以选择如何平滑数据:请参阅?stat_smooth详细信息和示例。

在不确切知道您要查找的内容的情况下,使用该lattice软件包,您可以轻松添加黄土曲线type="smooth"例如,

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

参见help("panel.loess")可传递给 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)

在此处输入图像描述

你的问题有点模糊,所以我将对你的问题做一些假设。如果您可以绘制散点图并稍微描述一下数据,那将有很大帮助。请,如果我做出错误的假设,请忽略我的回答。

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

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

在第三手(手用完) - 你在谈论趋势?这是一个时间问题吗?如果是这样,请小心过度解释趋势线和统计意义。时间序列中的趋势可以出现在“自回归”过程中,对于这些过程,过程的随机性偶尔会从随机噪声中构建趋势,错误的统计显着性检验可以告诉你它很重要,而实际上并不重要!