Forecasting

The Logit Function: A Tool for New Things

August 19, 2020

With emerging technologies such as electric vehicles and photovoltaics, developing a forecast is challenging due to the lack of history. For many, using a Bass Diffusion Model is the solution. While this model is widely used for forecasting new product sales, it is rarely seen in the electric industry due to the infrequency of new technologies.

The Bass Diffusion Model is shown below:



Where:
  • “q” is the Coefficient of Imitation. The Coefficient of Imitation is the likelihood that someone will start using the product because of internal influence such as “word-of-mouth.”
  • “P” is the Coefficient of Innovation. The Coefficient of Innovation is the likelihood that someone will start using the product because of external influences such as media coverage.
  • “m” is the Market Potential. The Market Potential is the theoretical total number who will use the product.

While the formula may be intimidating, the result is simple. The equation creates an S-shaped forecast with the parameterization controlling the speed of adoption and technology saturation.



While MetrixND doesn’t have a function called “Bass Diffusion,” that doesn’t mean that you can’t create it in a transformation variable. The picture above was created using the following parameters from a microwave oven adoption model (http://www.bus.iastate.edu/zjiang/research/vbm_ijrm.pdf).
  • p = 0.00071
  • q = 0.3444
  • m = 1

However, MetrixND provides a similar result in using the “Logit” function. This function creates an S-shaped curved through two data points using the syntax below.

LOGIT (Year1, Period1, Value1, Year2, Period2, Value2)

In this function, the S-shaped curve goes through Value1 in Year1, Period1 and Value2 in Year2, Period2 where the numerical values for Value1 and Value2 are greater than 0.0 and less than 1.0. The logit function is defined by the equation below.



Once again, if the formula is too intimidating, just look at the results. Using the following parameterization, the result is almost identical to the Bass Diffusion Model shown above.



Using a Bass Diffusion Model or Logit function creates S-shaped curves that replicate real-world technology adoption patterns.

Either of these curves may be used in a regression model to calibrate the shape to historical adoption patterns. By exploring different curve parameterizations, a regression model can be created that fits the historic technology adoption and projects the future adoption along a classic adoption curve.

Below are the Bass and Logit curves applied to historic photovoltaic adoption from 2008 through 2016 for one service territory. Both trends fit the historic data and present an adoption patterns that accelerates in the future. The slight difference in the forecast results from the variation in the mathematical equations.



The next time you forecast a new technology such as electric vehicles or photovoltaics, consider using the Logit function.

Wystąpił błąd podczas przetwarzania szablonu.
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>