rm(list=ls(all=T))
options(digits=4, scipen=40)



1. Logistic Distribution

1.1 Logistic vs Normal Distribution

\[f(x) = \frac{exp(-\frac{x-u}{s})}{s(1+exp(-\frac{x-u}{s}))^2} \quad ;\quad 1 - F(x) = \frac{1}{1+exp(\frac{x-u}{s})} \]

  • mean = \(u\)
  • scale = \(s\)
  • variance = \(s^2 \pi^2 / 3\)
# parameters
u=0; sd=1; s=sqrt(sd*3/(pi^2))   
# PDF
par(cex=0.8)
curve(dlogis(x, u, s), u-6*s, u+6*s, col='cyan', lwd=2,
      main="Logistic Dist. (blue) vs Normal Dist. (red)\nPDF")
curve(dnorm(x,u,sd), col='red', lty=2, add=T)

# 1 - CDF
par(cex=0.8)
curve(1-plogis(x, u, s), u-6*s, u+6*s, col='cyan', lwd=2,
      main="Logistic Dist. (blue) vs Normal Dist. (red)\n1 - CDF")
curve(1-pnorm(x,u,sd), col='red', lty=2, add=T)



2. Fitting the Price Response Function

# sample data
qty = c(461,493,469,339,60)
price = c(14,17,18,19,22)
plot(price, qty, pch=20, ylim=c(0,550), xlim=c(13,24))

We can observe: \(N \simeq 500\), \(u \simeq 20\), \(sd \simeq 6/6 = 1\)

mod = nls(qty ~ N/(1+exp((price - u)/s)), start=c(
  N=500, u=20, s=sqrt(1 * 3/(pi^2)))
  )
coef(mod)
       N        u        s 
490.6165  19.9344   0.8935 
N = coef(mod)[1]; u = coef(mod)[2]; s = coef(mod)[3]
par(cex=0.8)
plot(price, qty, pch=20, ylim=c(0,550), xlim=c(13,24), main=sprintf(
  "Logistic Price Response Function\nN=%.1f,  u=%.1f,  s=%.1f",
  N, u, s))
curve(N/(1+exp((x-u)/s)), col='orange', lwd=2, add=T)



3. Price Optimization

p = seq(13,24,0.1)
q = N * (1 - plogis(p, u, s))
r = p * q
i = which.max(r)
par(cex=0.8)
plot(p, p*q, type='l', main=sprintf(
  "Optimal Revenue $%.1f  at  $%.1f", r[i], p[i]))
abline(v=p[i], col='red')





LS0tDQp0aXRsZTogIlN0YXRpYyBQcmljZSBPcHRpbWl6YXRpb24iDQphdXRob3I6ICJ0b255Y2h1b0BtYWlsLm5zeXN1LmVkdS50dyINCmRhdGU6ICJgciBTeXMudGltZSgpYCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCjxicj4NCmBgYHtyIHNldC1vcHRpb25zLCBlY2hvPUZBTFNFLCBjYWNoZT1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQpvcHRpb25zKHdpZHRoPTEwMCkNCm9wdHNfY2h1bmskc2V0KGNvbW1lbnQgPSBOQSkNCmBgYA0KDQpgYGB7ciAgd2FybmluZz1GLCBtZXNzYWdlPUYsIGNhY2hlPUYsIGVycm9yPUZ9DQpybShsaXN0PWxzKGFsbD1UKSkNCm9wdGlvbnMoZGlnaXRzPTQsIHNjaXBlbj00MCkNCmBgYA0KPGJyPg0KDQotIC0gLQ0KDQojIyMgMS4gTG9naXN0aWMgRGlzdHJpYnV0aW9uDQoNCiMjIyMgMS4xICBMb2dpc3RpYyB2cyBOb3JtYWwgRGlzdHJpYnV0aW9uDQoNCiQkZih4KSA9IFxmcmFje2V4cCgtXGZyYWN7eC11fXtzfSl9e3MoMStleHAoLVxmcmFje3gtdX17c30pKV4yfSBccXVhZCA7XHF1YWQNCjEgLSBGKHgpID0gXGZyYWN7MX17MStleHAoXGZyYWN7eC11fXtzfSl9ICQkDQoNCisgbWVhbiA9ICR1JA0KKyBzY2FsZSA9ICRzJA0KKyB2YXJpYW5jZSA9ICRzXjIgXHBpXjIgLyAzJA0KDQpgYGB7cn0NCiMgcGFyYW1ldGVycw0KdT0wOyBzZD0xOyBzPXNxcnQoc2QqMy8ocGleMikpICAgDQpgYGANCg0KYGBge3J9DQojIFBERg0KcGFyKGNleD0wLjgpDQpjdXJ2ZShkbG9naXMoeCwgdSwgcyksIHUtNipzLCB1KzYqcywgY29sPSdjeWFuJywgbHdkPTIsDQogICAgICBtYWluPSJMb2dpc3RpYyBEaXN0LiAoYmx1ZSkgdnMgTm9ybWFsIERpc3QuIChyZWQpXG5QREYiKQ0KY3VydmUoZG5vcm0oeCx1LHNkKSwgY29sPSdyZWQnLCBsdHk9MiwgYWRkPVQpDQpgYGANCg0KYGBge3J9DQojIDEgLSBDREYNCnBhcihjZXg9MC44KQ0KY3VydmUoMS1wbG9naXMoeCwgdSwgcyksIHUtNipzLCB1KzYqcywgY29sPSdjeWFuJywgbHdkPTIsDQogICAgICBtYWluPSJMb2dpc3RpYyBEaXN0LiAoYmx1ZSkgdnMgTm9ybWFsIERpc3QuIChyZWQpXG4xIC0gQ0RGIikNCmN1cnZlKDEtcG5vcm0oeCx1LHNkKSwgY29sPSdyZWQnLCBsdHk9MiwgYWRkPVQpDQpgYGANCjxicj4NCg0KLSAtIC0NCg0KIyMjIDIuIEZpdHRpbmcgdGhlIFByaWNlIFJlc3BvbnNlIEZ1bmN0aW9uDQpgYGB7cn0NCiMgc2FtcGxlIGRhdGENCnF0eSA9IGMoNDYxLDQ5Myw0NjksMzM5LDYwKQ0KcHJpY2UgPSBjKDE0LDE3LDE4LDE5LDIyKQ0KcGxvdChwcmljZSwgcXR5LCBwY2g9MjAsIHlsaW09YygwLDU1MCksIHhsaW09YygxMywyNCkpDQpgYGANCg0KV2UgY2FuIG9ic2VydmU6ICROIFxzaW1lcSA1MDAkLCAkdSBcc2ltZXEgMjAkLCAkc2QgXHNpbWVxIDYvNiA9IDEkDQoNCmBgYHtyfQ0KbW9kID0gbmxzKHF0eSB+IE4vKDErZXhwKChwcmljZSAtIHUpL3MpKSwgc3RhcnQ9YygNCiAgTj01MDAsIHU9MjAsIHM9c3FydCgxICogMy8ocGleMikpKQ0KICApDQpjb2VmKG1vZCkNCmBgYA0KDQpgYGB7cn0NCk4gPSBjb2VmKG1vZClbMV07IHUgPSBjb2VmKG1vZClbMl07IHMgPSBjb2VmKG1vZClbM10NCnBhcihjZXg9MC44KQ0KcGxvdChwcmljZSwgcXR5LCBwY2g9MjAsIHlsaW09YygwLDU1MCksIHhsaW09YygxMywyNCksIG1haW49c3ByaW50ZigNCiAgIkxvZ2lzdGljIFByaWNlIFJlc3BvbnNlIEZ1bmN0aW9uXG5OPSUuMWYsICB1PSUuMWYsICBzPSUuMWYiLA0KICBOLCB1LCBzKSkNCmN1cnZlKE4vKDErZXhwKCh4LXUpL3MpKSwgY29sPSdvcmFuZ2UnLCBsd2Q9MiwgYWRkPVQpDQpgYGANCjxicj4NCg0KLSAtIC0NCg0KIyMjIDMuIFByaWNlIE9wdGltaXphdGlvbg0KYGBge3J9DQpwID0gc2VxKDEzLDI0LDAuMSkNCnEgPSBOICogKDEgLSBwbG9naXMocCwgdSwgcykpDQpyID0gcCAqIHENCmkgPSB3aGljaC5tYXgocikNCnBhcihjZXg9MC44KQ0KcGxvdChwLCBwKnEsIHR5cGU9J2wnLCBtYWluPXNwcmludGYoDQogICJPcHRpbWFsIFJldmVudWUgJCUuMWYgIGF0ICAkJS4xZiIsIHJbaV0sIHBbaV0pKQ0KYWJsaW5lKHY9cFtpXSwgY29sPSdyZWQnKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQo8YnI+PGJyPjxicj48YnI+DQoNCjxzdHlsZT4NCi5jYXB0aW9uIHsNCiAgY29sb3I6ICM3Nzc7DQogIG1hcmdpbi10b3A6IDEwcHg7DQp9DQpwIGNvZGUgew0KICB3aGl0ZS1zcGFjZTogaW5oZXJpdDsNCn0NCnByZSB7DQogIHdvcmQtYnJlYWs6IG5vcm1hbDsNCiAgd29yZC13cmFwOiBub3JtYWw7DQogIGxpbmUtaGVpZ2h0OiAxOw0KfQ0KcHJlIGNvZGUgew0KICB3aGl0ZS1zcGFjZTogaW5oZXJpdDsNCn0NCnAsbGkgew0KICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsNCn0NCg0KLnJ7DQogIGxpbmUtaGVpZ2h0OiAxLjI7DQp9DQoNCi5xaXogew0KICBsaW5lLWhlaWdodDogMS43NTsNCiAgYmFja2dyb3VuZDogI2YwZjBmMDsNCiAgYm9yZGVyLWxlZnQ6IDEycHggc29saWQgI2NjZmZjYzsNCiAgcGFkZGluZzogNHB4Ow0KICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQogIGNvbG9yOiAjMDA5OTAwOw0KfQ0KDQp0aXRsZXsNCiAgY29sb3I6ICNjYzAwMDA7DQogIGZvbnQtZmFtaWx5OiAiVHJlYnVjaGV0IE1TIiwgIuW+rui7n+ato+m7kemrlCIsICJNaWNyb3NvZnQgSmhlbmdIZWkiOw0KfQ0KDQpib2R5ew0KICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsNCn0NCg0KaDEsaDIsaDMsaDQsaDV7DQogIGNvbG9yOiAjMDA2NmZmOw0KICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsICLlvq7ou5/mraPpu5Hpq5QiLCAiTWljcm9zb2Z0IEpoZW5nSGVpIjsNCn0NCg0KDQpoM3sNCiAgY29sb3I6ICMwMDg4MDA7DQogIGJhY2tncm91bmQ6ICNlNmZmZTY7DQogIGxpbmUtaGVpZ2h0OiAyOw0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCg0KaDV7DQogIGNvbG9yOiAjMDA2MDAwOw0KICBiYWNrZ3JvdW5kOiAjZjhmOGY4Ow0KICBsaW5lLWhlaWdodDogMS41Ow0KICBmb250LXdlaWdodDogYm9sZDsNCn0NCjwvc3R5bGU+DQo=