我有一个散点图。如何添加非线性趋势线?
我有一个散点图。如何添加非线性趋势线?
Answers:
让我们创建一些数据。
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 =“红色”)
无需完全知道您要寻找的是什么,使用该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)
您的问题有点含糊,所以我将对您的问题做出一些假设。如果您可以建立一个散点图并稍微描述一下数据,将会很有帮助。请,如果我做出错误的假设,请忽略我的答案。
首先,您的数据可能描述了您合理地认为是非线性的某个过程。例如,如果您要对突然刹车时汽车停止行驶的距离与汽车速度进行回归分析,物理学告诉我们,汽车的能量与速度的平方成正比,而不是与速度的平方成正比本身。因此,在这种情况下,您可能想尝试多项式回归,并且(在R中)您可以执行类似的操作model <- lm(d ~ poly(v,2),data=dataset)
。关于如何将各种非线性纳入回归模型,有很多文档。
另一方面,如果您的行“颤抖”并且不知道为什么颤抖,那么一个好的起点可能是局部加权回归或loess
以R表示。这会在较小的范围内进行线性回归区域,而不是整个数据集。想象一个“ k最近邻居”版本是最容易的,在该版本中,可以在任何点计算曲线的值,找到最靠近兴趣点的k个点,然后取平均值。黄土就是这样,但是使用回归而不是直线平均。为此,请使用model <- loess(y ~ x, data=dataset, span=...)
,其中span
变量控制平滑程度。
第三方面(精疲力尽)-您是在谈论趋势吗?这是暂时的问题吗?如果是这样,请谨慎对待趋势线及其统计意义。时间序列的趋势可能会出现在“自回归”过程中,对于这些过程,过程的随机性有时可能会由于随机噪声而构造出趋势,而错误的统计显着性检验会告诉您,在没有噪声的情况下,这是很重要的!
将散点图样本点和平滑曲线放在同一图形上:
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