我的问题是关于tslm
与ggplot2
的时间序列分析的表示。
我使用forecast
包在趋势,季节和余数组件中分解地中海的SST时间序列。然后我查找了tslm
趋势分量的线性回归的斜率(趋势)。但我无法弄清楚如何使用ggplot2绘制tslm
。我应该用geom_smooth(model=lm)
ggplot SST趋势组件吗? lm
会提供与tslm
相同的结果(斜率)吗?
这是用于构建和分解SST时间序列的代码
library(forecast)
# Loop to calculate trend for any grid point/column
for (i in 2:length(data)){
# read variable/column to analyse
var<-paste("V",i,sep="")
ff<-data$fecha
valor<-data[,i]
datos2<-as.data.frame(cbind(data$fecha,valor))
#Build time series
datos.ts<-ts(datos2$valor, frequency = 365)
datos.stl <- stl(datos.ts,s.window = 365)
# tslm: Save trend component
datos.tslm<-tslm(datos.ts ~ trend)
output[,i-1]<-datos.stl$time.series[,2]
}
# Summarize trends for the whole Mediterranean (mean value to be plotted)
trend<-as.data.frame(rowMeans(output[,1:length(output)]))
用geom_smooth绘制代码
trend.plot<-ggplot(data=trend, aes(x=fecha, y=trend)) + geom_point(size=0.1) +
geom_smooth(method='lm', data = trend[1:12784,])
编辑1
由于SST数据由一堆文件组成,我已将趋势数据上传到Dropbox并在此csv file
中提供答案 0 :(得分:0)
我试图理解你的问题,作为第一次尝试,我修改了你的代码如下(附加的数据只包含2列,所以我删除了for loop
,但概括不应该很难)< / p>
library(forecast)
library(ggplot2)
library(zoo)
data <- read.csv('../Downloads/trend_data.csv', header=TRUE)
data$fecha <- as.Date(data$fecha)
i <- 2
# read variable/column to analyse
var<-paste("V",i,sep="")
ff<-data$fecha
valor<-data[,i]
datos2<-as.data.frame(cbind(data$fecha,valor))
#Build time series
datos.ts<-ts(datos2$valor, frequency = 365)
datos.stl <- stl(datos.ts,s.window = 365)
# tslm: Save trend component
datos.tslm<-tslm(datos.ts ~ trend)
output <-datos.stl$time.series[,2]
# Summarize trends for the whole Mediterranean (mean value to be plotted)
# trend<-as.data.frame(rowMeans(output[,1:length(output)]))
ggplot(data=data, aes(x=fecha, y=trend)) + geom_point(size=0.1) +
geom_smooth(method='lm', data = data.frame(fecha=data$fecha, trend=output), aes(x=fecha, y=output))
如果我在这里误解你的意图,请告诉我。
更新:我觉得你想要的可能只是tslm
输出趋势的线图?
ggplot(data=data, aes(x=fecha, y=trend)) + geom_point(size=0.1) +
geom_line(data = data.frame(fecha=data$fecha, trend=output), aes(x=fecha, y=output))
如果您想要趋势的平滑版本,
ggplot(data=data, aes(x=fecha, y=trend)) + geom_point(size=0.1, col="red") +
geom_smooth(data = data.frame(fecha=data$fecha, trend=output), aes(x=fecha, y=output),col="blue",size=0.1)
答案 1 :(得分:0)
您提供的数据,以每天一个点的线图绘制。这会解决您的问题吗?
library(dplyr)
library(ggplot2)
trend_data <- read.csv2("../trend_data.csv",
sep = ",",stringsAsFactors = FALSE)
df <- trend_data %>% mutate(fecha = as.Date(fecha), trend = as.numeric(trend))
ggplot(df, aes(x = fecha, y = trend)) +
geom_line() +
geom_point()