Guest User

Untitled

a guest
Dec 17th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.77 KB | None | 0 0
  1. Option Explicit
  2. Option Base 1
  3.  
  4. Public Sub autocorr()
  5. Dim Rng As Range, Lags As Integer, TimeSeries() As Double, i As Long, Diff As Boolean, DiffTimeSeries() As Double
  6. Dim Aver As Double, MeanTimeSeries() As Double, ACF() As Double, PACF() As Double, ACFMatrix() As Double
  7. Dim j As Integer, k As Integer, Count As Integer, Top() As Double, Bottom() As Double
  8. Dim Squares() As Double, SumOfSquares As Double
  9. Dim ACFSource As Object, PACFSource As Object, wb As Workbook, StErrMethod As Boolean
  10. Set Rng = Application.InputBox("Choose Baseline Range", "Autocorrelation", "$A$1:$A$69", , , , , 8)
  11. If Rng Is Nothing Then Exit Sub
  12. ReDim TimeSeries(Rng.Rows.Count, 1)
  13. For i = LBound(TimeSeries) To UBound(TimeSeries)
  14. TimeSeries(i, 1) = Rng.Offset(i - 1, 0).Resize(1, 1)
  15. Next
  16. Lags = Application.InputBox("Choose Lags Count. Default: 20", "Autocorrelation", 20, , , , , 1)
  17. If Lags < 1 Or Lags >= UBound(TimeSeries) Then Exit Sub
  18. Diff = Application.InputBox("Make First Non-Season Differencing? 0 - No; 1 - Yes", "Autocorrelation", False, , , , , 4)
  19.  
  20. If TypeName(Diff) <> "Boolean" Then Exit Sub
  21. If Diff = True Then
  22. ReDim DiffTimeSeries(UBound(TimeSeries) - 1, 1)
  23. For i = LBound(TimeSeries) To UBound(TimeSeries) - 1
  24. DiffTimeSeries(i, 1) = TimeSeries(i + 1, 1) - TimeSeries(i, 1)
  25. Next
  26. ReDim TimeSeries(UBound(DiffTimeSeries), 1)
  27. For i = LBound(DiffTimeSeries) To UBound(DiffTimeSeries)
  28. TimeSeries(i, 1) = DiffTimeSeries(i, 1)
  29. Next i
  30. End If
  31. StErrMethod = Application.InputBox("Standard Error Method: 0 - 'Bartlett's approximation; 1 - Independence Method", "Autocorrelation", False, , , , , 4)
  32. If TypeName(StErrMethod) <> "Boolean" Then Exit Sub
  33.  
  34. ' Calculating ACF and PACF
  35. ReDim MeanTimeSeries(UBound(TimeSeries))
  36. ReDim ACFMatrix(Lags, Lags)
  37. ReDim ACF(Lags, 4)
  38. ReDim PACF(Lags, 4)
  39.  
  40. Aver = Application.WorksheetFunction.Average(TimeSeries)
  41.  
  42. For i = LBound(TimeSeries) To UBound(TimeSeries)
  43. MeanTimeSeries(i) = TimeSeries(i, 1) - Aver
  44. Next
  45.  
  46. Aver = (Application.WorksheetFunction.SumSq(MeanTimeSeries) / UBound(TimeSeries)) * UBound(TimeSeries)
  47.  
  48. For i = 1 To Lags
  49. For j = 1 To UBound(TimeSeries) - i
  50. ACF(i, 1) = ACF(i, 1) + MeanTimeSeries(j) * MeanTimeSeries(j + i)
  51. Next
  52. ACF(i, 1) = ACF(i, 1) / Aver
  53. Next
  54.  
  55. For i = 1 To Lags
  56. Count = 1
  57. For j = i To Lags
  58. If j = i Then
  59. ACFMatrix(i, j) = 1
  60. Else
  61. ACFMatrix(i, j) = ACF(Count, 1)
  62. ACFMatrix(j, i) = ACF(Count, 1)
  63. Count = Count + 1
  64. End If
  65. Next
  66. Next
  67.  
  68. PACF(1, 1) = ACF(1, 1)
  69.  
  70. For k = 2 To Lags
  71. ReDim Top(k, k)
  72. ReDim Bottom(k, k)
  73. For i = 1 To k
  74. For j = 1 To k
  75. Top(i, j) = ACFMatrix(i, j)
  76. Bottom(i, j) = ACFMatrix(i, j)
  77. Next
  78. Next
  79. For i = 1 To k
  80. Top(i, k) = ACF(i, 1)
  81. Next
  82. PACF(k, 1) = Application.WorksheetFunction.MDeterm(Top) / Application.MDeterm(Bottom)
  83. Next
  84.  
  85. ' Calculating standard errors
  86.  
  87. ' Bartlett's approximation
  88.  
  89. If StErrMethod = False Then
  90. ReDim Squares(0 To Lags)
  91.  
  92. Squares(0) = 0
  93.  
  94. For i = 1 To Lags
  95. Squares(i) = ACF(i, 1) ^ 2
  96. Next
  97.  
  98. For i = 1 To Lags
  99. SumOfSquares = 0
  100. For j = 0 To i - 1
  101. SumOfSquares = SumOfSquares + Squares(j)
  102. Next
  103. ACF(i, 2) = Sqr(1 / UBound(TimeSeries) * (1 + 2 * SumOfSquares))
  104. ACF(i, 3) = 2 * ACF(i, 2)
  105. ACF(i, 4) = -1 * ACF(i, 3)
  106. Next
  107. Else
  108.  
  109. ' Independence Method
  110. For i = 1 To Lags
  111. ACF(i, 2) = Sqr(1 / UBound(TimeSeries) * (UBound(TimeSeries) - i) / (UBound(TimeSeries) + 2))
  112. ACF(i, 3) = 2 * ACF(i, 2)
  113. ACF(i, 4) = -1 * ACF(i, 3)
  114. Next
  115. End If
  116.  
  117. ' PACF Standard Errors
  118. For i = 1 To Lags
  119. PACF(i, 2) = (1 / Sqr(UBound(TimeSeries)))
  120. PACF(i, 3) = 2 * PACF(i, 2)
  121. PACF(i, 4) = -1 * PACF(i, 3)
  122. Next
  123.  
  124. ' Creating a new workbook
  125. Set wb = Workbooks.Add()
  126. wb.SaveAs Filename:=ThisWorkbook.Path & "\Correlograms.xlsx"
  127. wb.Sheets(1).Name = "Data"
  128. Cells(1, 1) = "Autocorrelation"
  129. Cells(1, 2) = "ACF Standard Error. Method: " & Str(Val(StErrMethod))
  130. Cells(1, 3) = "ACF Upper Confidence Limit"
  131. Cells(1, 4) = "ACF Lower Confidence Limit"
  132. Cells(1, 5) = "Partial Autocorrelation"
  133. Cells(1, 6) = "PACF Standard Error"
  134. Cells(1, 7) = "PACF Upper Confidence Limit"
  135. Cells(1, 8) = "PACF Lower Confidence Limit"
  136. For i = 2 To Lags + 1
  137. Cells(i, 1) = ACF(i - 1, 1)
  138. Cells(i, 2) = ACF(i - 1, 2)
  139. Cells(i, 3) = ACF(i - 1, 3)
  140. Cells(i, 4) = ACF(i - 1, 4)
  141. Cells(i, 5) = PACF(i - 1, 1)
  142. Cells(i, 6) = PACF(i - 1, 2)
  143. Cells(i, 7) = PACF(i - 1, 3)
  144. Cells(i, 8) = PACF(i - 1, 4)
  145. Next
  146.  
  147. ' Drawing correlograms
  148.  
  149. With Sheets("Data")
  150. Set ACFSource = Application.Union(.Range(Cells(2, 1), Cells(Lags + 1, 1)), .Range(Cells(2, 3), Cells(Lags + 1, 4)))
  151. Set PACFSource = Application.Union(.Range(Cells(2, 5), Cells(Lags + 1, 5)), .Range(Cells(2, 7), Cells(Lags + 1, 8)))
  152. End With
  153. Charts.Add
  154. ActiveSheet.Name = "ACF"
  155. ActiveChart.ChartWizard Source:=ACFSource, _
  156. Gallery:=xlColumn, Format:=1, PlotBy:=xlColumns, _
  157. CategoryLabels:=0, SeriesLabels:=0, HasLegend:=2, Title:= _
  158. "ACF", CategoryTitle:="", ValueTitle:="", ExtraTitle:=""
  159. FormatGraph
  160. Charts.Add
  161. ActiveSheet.Name = "PACF"
  162. ActiveChart.ChartWizard Source:=PACFSource, _
  163. Gallery:=xlColumn, Format:=1, PlotBy:=xlColumns, _
  164. CategoryLabels:=0, SeriesLabels:=0, HasLegend:=2, Title:= _
  165. "PACF", CategoryTitle:="", ValueTitle:="", ExtraTitle:=""
  166. FormatGraph
  167. Sheets("ACF").Activate
  168. End Sub
  169.  
  170. Private Sub FormatGraph()
  171. With ActiveChart
  172. .SeriesCollection(2).Select
  173. Selection.Type = xlLine
  174. .SeriesCollection(2).Select
  175. With Selection.Border
  176. .Weight = xlThin
  177. .LineStyle = xlNone
  178. End With
  179. With Selection
  180. .MarkerBackgroundColorIndex = 1
  181. .MarkerForegroundColorIndex = 1
  182. .MarkerStyle = xlDash
  183. .Smooth = False
  184. End With
  185. .SeriesCollection(3).Select
  186. Selection.Type = xlLine
  187. .SeriesCollection(3).Select
  188. With Selection.Border
  189. .Weight = xlThin
  190. .LineStyle = xlNone
  191. End With
  192. With Selection
  193. .MarkerBackgroundColorIndex = 1
  194. .MarkerForegroundColorIndex = 1
  195. .MarkerStyle = xlDash
  196. .Smooth = False
  197. End With
  198. .Deselect
  199. End With
  200. End Sub
Add Comment
Please, Sign In to add comment