英文:
residual vs fitted graph in R
问题
我想在R中绘制残差与拟合图,以展示我的数据的线性关系。我正在使用tslm()函数。以下是我的操作:
# 使用plot()函数
> plot(ts_model)
错误信息: 在 `[.default`(X, , piv, drop = FALSE) 中:维度数量不正确
我无法使用plot()函数。我尝试了另一种方法来绘制残差与拟合图:
> #获取残差列表
> res <- resid(ts_model)
>
> #线性关系
> plot(fitted(ts_model),res)
> abline(0,0)
然而,红线没有显示出来。我想要在图中包括红线以展示线性关系。
[![使用lm函数绘制的残差与拟合图][1]][1]
我想要类似上图的效果。这个图是使用lm函数绘制的,但我想使用tslm()函数绘制。
[![使用tslm()函数绘制的残差与拟合图][2]][2]
[![dput(ts_model)][3]][3]
[1]: https://i.stack.imgur.com/wWPN1.png
[2]: https://i.stack.imgur.com/oDUEY.png
[3]: https://i.stack.imgur.com/6uci1.png
英文:
I want to plot residual vs fitted plot in R to show linearity of my data. I am using tslm() function. This is what I did.
> plot(ts_model)
Error in `[.default`(X, , piv, drop = FALSE) :
incorrect number of dimensions
I am unable to use plot() function. I tried another way to plot the residual vs fitted pot.
> #Get list of residuals
> res <- resid(ts_model)
>
> #Linearity
> plot(fitted(ts_model),res)
> abline(0,0)
However, the red line is not showing. I want to include the red line to show the linearity.
I want something like the above. This plot is using lm function but I want to plot this using tslm() fucntion.
答案1
得分: 0
根据plot.lm()
的文档,plot.lm()
函数的红线是通过设置参数add.smooth=TRUE
获得的。反过来,这个参数使用panel.smooth()
来生成与绘制点相适应的平滑曲线。最后,panel.smooth()
的文档告诉我们执行平滑拟合的函数是lowess()
。
因此,只需绘制对lowess()
的调用结果即可生成您想要的红线。以下代码示例(使用forecast
包中help(tslm)
中提供的示例数据进行演示):
# 使生成的图可复制
set.seed(1313)
# 生成示例数据
y <- ts(rnorm(120,0,3) + 1:120 + 20*sin(2*pi*(1:120)/12), frequency=12)
# 拟合tslm模型
fit <- tslm(y ~ trend + season)
# 绘制残差 vs. 拟合图
# (注意使用as.numeric(),否则点之间会被线连接)
plot(as.numeric(fitted(fit)), as.numeric(residuals(fit)), type="p")
# 添加一个平滑趋势线,调用lowess(),与plot.lm()函数一样
lines(lowess(fitted(fit), residuals(fit)), col="red")
这是生成的图表:
英文:
According to the documentation of plot.lm()
, the red line of the plot.lm()
function is obtained when parameter add.smooth=TRUE
. In turn, this parameter uses panel.smooth()
to generate a smoothed curve that fits the plotted points. Finally, the documentation of panel.smooth()
tells us that the function responsible for doing the smooth fit is lowess()
.
Therefore, a line that plots the result of the call to lowess()
should suffice to generate the red line that you are after. The following code illustrates (showcased with the sample data given in help(tslm)
of the forecast
package):
# Make generated plot reproducible
set.seed(1313)
# Generate the sample data
y <- ts(rnorm(120,0,3) + 1:120 + 20*sin(2*pi*(1:120)/12), frequency=12)
# Fit the tslm model
fit <- tslm(y ~ trend + season)
# Plot the residuals vs. fitted graph
# (note the use of as.numeric(), o.w. the points are connected by lines)
plot(as.numeric(fitted(fit)), as.numeric(residuals(fit)), type="p")
# Add a smooth trend line calling lowess(), as used by the plot.lm() function
lines(lowess(fitted(fit), residuals(fit)), col="red")
This is the resulting plot:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论