在ggplot2

时间:2017-09-29 07:27:45

标签: r ggplot2 time-series linear-regression

我的问题是关于tslmggplot2的时间序列分析的表示。

我使用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

中提供

2 个答案:

答案 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()