我有一个散点图。如何添加非线性趋势线?
如何将非线性趋势线添加到R中的散点图中?
让我们创建一些数据。
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 =“红色”)
如果您使用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
变量控制平滑程度。
在第三手(手用完) - 你在谈论趋势?这是一个时间问题吗?如果是这样,请小心过度解释趋势线和统计意义。时间序列中的趋势可以出现在“自回归”过程中,对于这些过程,过程的随机性偶尔会从随机噪声中构建趋势,错误的统计显着性检验可以告诉你它很重要,而实际上并不重要!