Forecasting

Why the Standard 65 Degree Day Base May Not be the Best Choice

June 24, 2020

The National Oceanic and Atmospheric Administration (NOAA) often defines heating and cooling degree days using a 65-degree base. A simple explanation of how degree days are calculated to ensure everyone understands what this means is: if the average temperature for the day is 55 degrees, there are 10 heating degrees and zero cooling degrees. Degree day base 65 formulas are:

Heating Degree Day (base 65) =max ⁡(65 - Temperature,0) Cooling Degree Day (base 65)=max⁡ (Temperature - 65,0)

But if heating degree days are calculated using 55 as a base, there are no heating degree days. So, how you define degree days matters.

The need to use degree days in the context of energy forecasting is due to the non-linear relationship between weather and energy. Above a certain temperature, energy usage increases as temperature increases, and below a certain temperature, energy usage increases as temperature decrease. Defining heating and cooling degree days in base 65 assumes 65 degrees is the temperature at which the switch from heating to cooling occurs.

The relationship between energy usage and weather can best be seen using a scatter plot – the Y-axis is monthly energy per day and the X-axis is monthly average temperature. The data illustrated is based on total system loads for a service area in the Northern U.S. Examining the graph, it becomes apparent that heating does not occur at 65 or even 60 degrees. The heating does not begin until average temperatures reach 55 degrees. Cooling, on the other hand, begins when temps are as low as 60 degrees. The slope on the heating and cooling side changes with temperatures, implying that the impact of a CDD or HDD differs depending on how hot or cold the day is. The impact on energy by an additional degree of temperature is greater when the average temperature is 75 degrees compared to 65 degrees.



A simple modeling exercise can prove the benefits of using customized degree day breakpoints. Using the same dataset from the scatter plot, a monthly regression model is estimated using 10 years of data. The initial specification uses a constant – heating degree days base 65 and cooling degree days base 65 – and a trend variable to account for overall system growth. The model is able to explain 93% (Adj. R2) of the monthly variation in energy per day with just these four variables. This model has a Mean Absolute Percent Error (MAPE) of 2.08%, strong model statistics.

Based on the scatter plot, we can easily see that a 65 base is not the best choice for this service area. In the second specification, the weather variables are changed to HDD base 55 and CDD base 60. This small change increases the adj. R2 to 0.967 and decreases the MAPE to 1.46%. The final specification uses multiple degree day spines – CDD base 60 and CDD base 70 for cooling and HDD base 45 and CDD base 55 for heating. All variables are statistically significant. This results in an adj. R2 of 0.971 and a MAPE of 1.37%. Model stats are listed in the table below:



When multiple splines are required, the coefficients can be used to create a single weighted heating or cooling degree day variable for use in forecasting models. In this simple example, only monthly energy and weather was used. Daily data would provide an even greater resolution of the relationship.

Kesalahan terjadi ketika Memproses Template.
The following has evaluated to null or missing:
==> authorContent.contentFields  [in template "44616#44647#114455" at line 9, column 17]

----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: contentFields = authorContent.content...  [in template "44616#44647#114455" at line 9, column 1]
----
1<#assign 
2	webContentData = jsonFactoryUtil.createJSONObject(author.getData()) 
3	classPK = webContentData.classPK 
4/> 
5 
6<#assign 
7authorContent = restClient.get("/headless-delivery/v1.0/structured-contents/" + classPK + "?fields=contentFields%2CfriendlyUrlPath%2CtaxonomyCategoryBriefs") 
8contentFields = authorContent.contentFields 
9categories=authorContent.taxonomyCategoryBriefs 
10authorContentData = jsonFactoryUtil.createJSONObject(authorContent) 
11friendlyURL = authorContentData.friendlyUrlPath 
12authorCategoryId = "0" 
13/> 
14 
15<#list contentFields as contentField > 
16   <#assign  
17	 contentFieldData = jsonFactoryUtil.createJSONObject(contentField)  
18	 name = contentField.name 
19	 /> 
20	 <#if name == 'authorImage'> 
21	    <#if (contentField.contentFieldValue.image)??> 
22	        <#assign authorImageURL = contentField.contentFieldValue.image.contentUrl />	 
23			</#if> 
24	 </#if> 
25	 <#if name == 'authorName'> 
26	    <#assign authorName = contentField.contentFieldValue.data /> 
27			<#list categories as category > 
28         <#if authorName == category.taxonomyCategoryName> 
29				     <#assign authorCategoryId = category.taxonomyCategoryId /> 
30				 </#if> 
31      </#list> 
32	 </#if> 
33	 <#if name == 'authorDescription'> 
34	    <#assign authorDescription = contentField.contentFieldValue.data /> 
35			 
36	 </#if> 
37	  
38	 <#if name == 'authorJobTitle'> 
39	    <#assign authorJobTitle = contentField.contentFieldValue.data /> 
40			 
41	 </#if> 
42 
43</#list> 
44 
45<div class="blog-author-info"> 
46	<#if authorImageURL??> 
47		<img class="blog-author-img" id="author-image" src="${authorImageURL}" alt="" /> 
48	</#if> 
49	<#if authorName??> 
50		<#if authorName != ""> 
51			<p class="blog-author-name">By <a id="author-detail-page" href="/w/${friendlyURL}?filter_category_552298=${authorCategoryId}"><span id="author-full-name">${authorName}</span></a></p> 
52			<hr /> 
53		</#if> 
54	</#if> 
55	<#if authorJobTitle??> 
56		<#if authorJobTitle != ""> 
57			<p class="blog-author-title" id="author-job-title" >${authorJobTitle}</p> 
58			<hr /> 
59		</#if> 
60	</#if> 
61	<#if authorDescription??> 
62		<#if authorDescription != "" && authorDescription != "null" > 
63			<p class="blog-author-desc" id="author-job-desc">${authorDescription}</p> 
64			<hr /> 
65		</#if> 
66	</#if> 
67</div>