{"title":"After the ad.","description":"Spend has a memory. Response has a ceiling. Explore two building blocks of marketing mix models before trusting a budget recommendation.","theme":"amber","kind":"Marketing mix modeling","cases":[{"id":"carryover","name":"Carryover · one spend pulse","title":"The campaign ends. The effect lingers.","unit":"Unnormalized adstock units","parameter":"Week after pulse","x":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"series":[{"label":"α = 0.0","values":[100.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]},{"label":"α = 0.4","values":[100.0,40.0,16.0,6.4,2.56,1.024,0.4096,0.16384,0.065536,0.0262144,0.0104858,0.0041943,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]},{"label":"α = 0.8","values":[100.0,80.0,64.0,51.2,40.96,32.768,26.2144,20.97152,16.777216,13.4217728,10.7374182,8.5899346,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]}],"context":"A single 100-unit spend pulse in week zero. All later spend is zero. Compare three memory rates with a 12-week truncation.","readout":"Adstock is the weighted sum of current and preceding spend, using α^lag. This implementation is not normalized: a larger α changes both persistence and total mass.","note":"The drop to zero at week 12 is the explicit truncation, not an estimated biological or customer-memory boundary."},{"id":"shape-1","name":"Diminishing returns · S = 1","title":"A bigger budget changes the best split.","unit":"Total synthetic incremental response ↑","parameter":"Total budget","x":[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100],"series":[{"label":"Best integer split","values":[0.0,1.1428571,2.0,2.75,3.4438503,4.0784314,4.6666667,5.2176387,5.7263158,6.2,6.6480836,7.0649351,7.4545455,7.826087,8.173913,8.5004255,8.8130612,9.1076923,9.3856209,9.6519916,9.9047619,10.1442006,10.3738657,10.5931034,10.8015309,11.0015865,11.1935484,11.3766234,11.5524476,11.7219251,11.8840085,12.0397516,12.1904762,12.3349829,12.4738986,12.6088193,12.7384615,12.8631579,12.9846154,13.1015746,13.2142857,13.3240418,13.4300925,13.5324675,13.6321353,13.7287356,13.8221344,13.9130435,14.0014029,14.0869565,14.1702128]},{"label":"Equal split","values":[0.0,1.0024814,1.8928571,2.6909091,3.4117647,4.0672269,4.6666667,5.2176387,5.7263158,6.1978022,6.6363636,7.0455992,7.4285714,7.787907,8.1258741,8.4444444,8.7453416,9.0300807,9.3,9.556287,9.8,10.0320856,10.2533937,10.46469,10.6666667,10.8599509,11.0451128,11.2226721,11.3931034,11.5568417,11.7142857,11.8658025,12.0117302,12.152381,12.2880435,12.4189853,12.5454545,12.667682,12.7858824,12.9002558,13.010989,13.1182567,13.2222222,13.3230386,13.4208494,13.5157895,13.6079855,13.6975567,13.7846154,13.8692675,13.9516129]}],"snapshots":[{"rows":[["Channel A",0,0.0,0.0,0.0],["Channel B",0,0.0,0.0,0.0]],"note":"The best integer split returns 0.000 synthetic response units. Equal split returns 0.000. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",2,1.1428571428570613,1.0,0.615384615384568],["Channel B",0,0.0,1.0,0.3870967741935359]],"note":"The best integer split returns 1.143 synthetic response units. Equal split returns 1.002. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",4,1.9999999999998752,2.0,1.1428571428570613],["Channel B",0,0.0,2.0,0.7499999999999765]],"note":"The best integer split returns 2.000 synthetic response units. Equal split returns 1.893. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",4,1.9999999999998752,3.0,1.5999999999998933],["Channel B",2,0.7499999999999765,3.0,1.0909090909090577]],"note":"The best integer split returns 2.750 synthetic response units. Equal split returns 2.691. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",5,2.35294117647045,4.0,1.9999999999998752],["Channel B",3,1.0909090909090577,4.0,1.4117647058823113]],"note":"The best integer split returns 3.444 synthetic response units. Equal split returns 3.412. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",6,2.6666666666665186,5.0,2.35294117647045],["Channel B",4,1.4117647058823113,5.0,1.7142857142856651]],"note":"The best integer split returns 4.078 synthetic response units. Equal split returns 4.067. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",6,2.6666666666665186,6.0,2.6666666666665186],["Channel B",6,1.9999999999999443,6.0,1.9999999999999443]],"note":"The best integer split returns 4.667 synthetic response units. Equal split returns 4.667. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",7,2.947368421052477,7.0,2.947368421052477],["Channel B",7,2.270270270270209,7.0,2.270270270270209]],"note":"The best integer split returns 5.218 synthetic response units. Equal split returns 5.218. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",8,3.1999999999998403,8.0,3.1999999999998403],["Channel B",8,2.5263157894736175,8.0,2.5263157894736175]],"note":"The best integer split returns 5.726 synthetic response units. Equal split returns 5.726. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",8,3.1999999999998403,9.0,3.4285714285712654],["Channel B",10,2.9999999999999245,9.0,2.769230769230698]],"note":"The best integer split returns 6.200 synthetic response units. Equal split returns 6.198. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",9,3.4285714285712654,10.0,3.6363636363634715],["Channel B",11,3.219512195121873,10.0,2.9999999999999245]],"note":"The best integer split returns 6.648 synthetic response units. Equal split returns 6.636. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",10,3.6363636363634715,11.0,3.826086956521573],["Channel B",12,3.428571428571347,11.0,3.219512195121873]],"note":"The best integer split returns 7.065 synthetic response units. Equal split returns 7.046. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",10,3.6363636363634715,12.0,3.9999999999998335],["Channel B",14,3.8181818181817313,12.0,3.428571428571347]],"note":"The best integer split returns 7.455 synthetic response units. Equal split returns 7.429. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",11,3.826086956521573,13.0,4.159999999999834],["Channel B",15,3.999999999999911,13.0,3.627906976744101]],"note":"The best integer split returns 7.826 synthetic response units. Equal split returns 7.788. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",12,3.9999999999998335,14.0,4.307692307692142],["Channel B",16,4.17391304347817,14.0,3.8181818181817313]],"note":"The best integer split returns 8.174 synthetic response units. Equal split returns 8.126. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",13,4.159999999999834,15.0,4.44444444444428],["Channel B",17,4.340425531914802,15.0,3.999999999999911]],"note":"The best integer split returns 8.500 synthetic response units. Equal split returns 8.444. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",13,4.159999999999834,16.0,4.571428571428409],["Channel B",19,4.653061224489701,16.0,4.17391304347817]],"note":"The best integer split returns 8.813 synthetic response units. Equal split returns 8.745. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",14,4.307692307692142,17.0,4.689655172413632],["Channel B",20,4.799999999999904,17.0,4.340425531914802]],"note":"The best integer split returns 9.108 synthetic response units. Equal split returns 9.030. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",15,4.44444444444428,18.0,4.79999999999984],["Channel B",21,4.941176470588139,18.0,4.499999999999906]],"note":"The best integer split returns 9.386 synthetic response units. Equal split returns 9.300. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",15,4.44444444444428,19.0,4.903225806451455],["Channel B",23,5.207547169811223,19.0,4.653061224489701]],"note":"The best integer split returns 9.652 synthetic response units. Equal split returns 9.556. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",16,4.571428571428409,20.0,4.999999999999844],["Channel B",24,5.3333333333332344,20.0,4.799999999999904]],"note":"The best integer split returns 9.905 synthetic response units. Equal split returns 9.800. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",17,4.689655172413632,21.0,5.090909090908936],["Channel B",25,5.4545454545453556,21.0,4.941176470588139]],"note":"The best integer split returns 10.144 synthetic response units. Equal split returns 10.032. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",17,4.689655172413632,22.0,5.176470588235142],["Channel B",27,5.684210526315689,22.0,5.076923076922979]],"note":"The best integer split returns 10.374 synthetic response units. Equal split returns 10.253. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",18,4.79999999999984,23.0,5.257142857142707],["Channel B",28,5.793103448275762,23.0,5.207547169811223]],"note":"The best integer split returns 10.593 synthetic response units. Equal split returns 10.465. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",19,4.903225806451455,24.0,5.333333333333185],["Channel B",29,5.898305084745663,24.0,5.3333333333332344]],"note":"The best integer split returns 10.802 synthetic response units. Equal split returns 10.667. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",19,4.903225806451455,25.0,5.405405405405259],["Channel B",31,6.098360655737605,25.0,5.4545454545453556]],"note":"The best integer split returns 11.002 synthetic response units. Equal split returns 10.860. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",20,4.999999999999844,26.0,5.473684210526171],["Channel B",32,6.1935483870966745,26.0,5.571428571428472]],"note":"The best integer split returns 11.194 synthetic response units. Equal split returns 11.045. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",21,5.090909090908936,27.0,5.538461538461396],["Channel B",33,6.285714285714186,27.0,5.684210526315689]],"note":"The best integer split returns 11.377 synthetic response units. Equal split returns 11.223. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",21,5.090909090908936,28.0,5.599999999999859],["Channel B",35,6.461538461538362,28.0,5.793103448275762]],"note":"The best integer split returns 11.552 synthetic response units. Equal split returns 11.393. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",22,5.176470588235142,29.0,5.658536585365716],["Channel B",36,6.545454545454446,29.0,5.898305084745663]],"note":"The best integer split returns 11.722 synthetic response units. Equal split returns 11.557. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",23,5.257142857142707,30.0,5.714285714285578],["Channel B",37,6.626865671641693,30.0,5.9999999999999005]],"note":"The best integer split returns 11.884 synthetic response units. Equal split returns 11.714. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",23,5.257142857142707,31.0,5.767441860464982],["Channel B",39,6.782608695652076,31.0,6.098360655737605]],"note":"The best integer split returns 12.040 synthetic response units. Equal split returns 11.866. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",24,5.333333333333185,32.0,5.818181818181686],["Channel B",40,6.85714285714276,32.0,6.1935483870966745]],"note":"The best integer split returns 12.190 synthetic response units. Equal split returns 12.012. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",25,5.405405405405259,33.0,5.866666666666536],["Channel B",41,6.929577464788635,33.0,6.285714285714186]],"note":"The best integer split returns 12.335 synthetic response units. Equal split returns 12.152. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",25,5.405405405405259,34.0,5.91304347826074],["Channel B",43,7.0684931506848345,34.0,6.374999999999901]],"note":"The best integer split returns 12.474 synthetic response units. Equal split returns 12.288. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",26,5.473684210526171,35.0,5.957446808510511],["Channel B",44,7.135135135135039,35.0,6.461538461538362]],"note":"The best integer split returns 12.609 synthetic response units. Equal split returns 12.419. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",27,5.538461538461396,36.0,5.999999999999875],["Channel B",45,7.199999999999905,36.0,6.545454545454446]],"note":"The best integer split returns 12.738 synthetic response units. Equal split returns 12.545. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",28,5.599999999999859,37.0,6.040816326530488],["Channel B",46,7.2631578947367474,37.0,6.626865671641693]],"note":"The best integer split returns 12.863 synthetic response units. Equal split returns 12.668. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",28,5.599999999999859,38.0,6.079999999999878],["Channel B",48,7.384615384615291,38.0,6.705882352941078]],"note":"The best integer split returns 12.985 synthetic response units. Equal split returns 12.786. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",29,5.658536585365716,39.0,6.117647058823409],["Channel B",49,7.443037974683451,39.0,6.782608695652076]],"note":"The best integer split returns 13.102 synthetic response units. Equal split returns 12.900. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",30,5.714285714285578,40.0,6.153846153846035],["Channel B",50,7.499999999999907,40.0,6.85714285714276]],"note":"The best integer split returns 13.214 synthetic response units. Equal split returns 13.011. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",30,5.714285714285578,41.0,6.188679245282902],["Channel B",52,7.609756097560884,41.0,6.929577464788635]],"note":"The best integer split returns 13.324 synthetic response units. Equal split returns 13.118. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",31,5.767441860464982,42.0,6.222222222222107],["Channel B",53,7.662650602409547,42.0,6.999999999999903]],"note":"The best integer split returns 13.430 synthetic response units. Equal split returns 13.222. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",32,5.818181818181686,43.0,6.25454545454534],["Channel B",54,7.714285714285623,43.0,7.0684931506848345]],"note":"The best integer split returns 13.532 synthetic response units. Equal split returns 13.323. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",32,5.818181818181686,44.0,6.285714285714174],["Channel B",56,7.813953488372003,44.0,7.135135135135039]],"note":"The best integer split returns 13.632 synthetic response units. Equal split returns 13.421. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",33,5.866666666666536,45.0,6.3157894736841],["Channel B",57,7.862068965517151,45.0,7.199999999999905]],"note":"The best integer split returns 13.729 synthetic response units. Equal split returns 13.516. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",34,5.91304347826074,46.0,6.344827586206787],["Channel B",58,7.9090909090908195,46.0,7.2631578947367474]],"note":"The best integer split returns 13.822 synthetic response units. Equal split returns 13.608. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",34,5.91304347826074,47.0,6.372881355932095],["Channel B",60,7.999999999999911,47.0,7.32467532467523]],"note":"The best integer split returns 13.913 synthetic response units. Equal split returns 13.698. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",35,5.957446808510511,48.0,6.399999999999893],["Channel B",61,8.043956043955955,48.0,7.384615384615291]],"note":"The best integer split returns 14.001 synthetic response units. Equal split returns 13.785. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",36,5.999999999999875,49.0,6.426229508196616],["Channel B",62,8.086956521739042,49.0,7.443037974683451]],"note":"The best integer split returns 14.087 synthetic response units. Equal split returns 13.869. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",36,5.999999999999875,50.0,6.451612903225702],["Channel B",64,8.17021276595736,50.0,7.499999999999907]],"note":"The best integer split returns 14.170 synthetic response units. Equal split returns 13.952. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."}],"columns":["Channel","Best spend","Response","Equal spend","Response"],"context":"Two known Hill curves: β=(8,12), K=(12,30), S=1. Allocate a fixed budget between channels; no spend can be negative.","readout":"This is a single-period response model. Unlike the carryover scenario, this calculation does not apply adstock. Response is not revenue or profit.","note":""},{"id":"shape-2","name":"Threshold response · S = 2","title":"A bigger budget changes the best split.","unit":"Total synthetic incremental response ↑","parameter":"Total budget","x":[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100],"series":[{"label":"Best integer split","values":[0.0,0.2162162,0.8,1.6,2.4615385,3.2786885,4.0,4.6117647,5.12,5.5384615,5.8823529,6.1656051,6.4,6.595122,6.7751724,7.2780488,7.7947855,8.3134175,8.8243575,9.3203161,9.8029268,10.2672081,10.7096577,11.1361605,11.5384615,11.9251559,12.2889476,12.6364589,12.9643202,13.2748444,13.5698027,13.8463446,14.111551,14.3595602,14.5959538,14.8190981,15.0292135,15.2302147,15.4186514,15.5984516,15.7685763,15.92882,16.0827039,16.22742,16.3652663,16.4965517,16.6203096,16.7393515,16.8519692,16.9589041,17.061611]},{"label":"Equal split","values":[0.0,0.0684909,0.2693136,0.5894001,1.009607,1.5077563,2.0615385,2.6506877,3.258219,3.8708257,4.4786885,5.0749654,5.6551724,6.2165889,6.7577501,7.2780488,7.7774394,8.2562287,8.7149321,9.1541806,9.5746606,9.977078,10.3621369,10.7305288,11.0829268,11.4199834,11.7423301,12.0505781,12.345319,12.6271254,12.8965517,13.1541345,13.400393,13.6358292,13.8609279,14.0761569,14.2819672,14.4787927,14.6670507,14.8471416,15.0194495,15.1843425,15.3421724,15.4932756,15.6379733,15.776572,15.9093636,16.0366265,16.1586252,16.2756119,16.3878259]}],"snapshots":[{"rows":[["Channel A",0,0.0,0.0,0.0],["Channel B",0,0.0,0.0,0.0]],"note":"The best integer split returns 0.000 synthetic response units. Equal split returns 0.000. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",2,0.21621621621621476,1.0,0.05517241379310307],["Channel B",0,0.0,1.0,0.013318534961154257]],"note":"The best integer split returns 0.216 synthetic response units. Equal split returns 0.068. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",4,0.799999999999995,2.0,0.21621621621621476],["Channel B",0,0.0,2.0,0.0530973451327433]],"note":"The best integer split returns 0.800 synthetic response units. Equal split returns 0.269. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",6,1.5999999999999912,3.0,0.4705882352941146],["Channel B",0,0.0,3.0,0.1188118811881187]],"note":"The best integer split returns 1.600 synthetic response units. Equal split returns 0.589. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",8,2.4615384615384497,4.0,0.799999999999995],["Channel B",0,0.0,4.0,0.20960698689956309]],"note":"The best integer split returns 2.462 synthetic response units. Equal split returns 1.010. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",10,3.2786885245901507,5.0,1.1834319526627148],["Channel B",0,0.0,5.0,0.32432432432432395]],"note":"The best integer split returns 3.279 synthetic response units. Equal split returns 1.508. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",12,3.999999999999986,6.0,1.5999999999999912],["Channel B",0,0.0,6.0,0.46153846153846106]],"note":"The best integer split returns 4.000 synthetic response units. Equal split returns 2.062. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",14,4.611764705882339,7.0,2.031088082901544],["Channel B",0,0.0,7.0,0.6195995785036874]],"note":"The best integer split returns 4.612 synthetic response units. Equal split returns 2.651. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",16,5.119999999999987,8.0,2.4615384615384497],["Channel B",0,0.0,8.0,0.7966804979253104]],"note":"The best integer split returns 5.120 synthetic response units. Equal split returns 3.258. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",18,5.538461538461527,9.0,2.8799999999999875],["Channel B",0,0.0,9.0,0.9908256880733934]],"note":"The best integer split returns 5.538 synthetic response units. Equal split returns 3.871. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",20,5.8823529411764595,10.0,3.2786885245901507],["Channel B",0,0.0,10.0,1.1999999999999988]],"note":"The best integer split returns 5.882 synthetic response units. Equal split returns 4.479. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",22,6.165605095541391,11.0,3.652830188679231],["Channel B",0,0.0,11.0,1.422135161606267]],"note":"The best integer split returns 6.166 synthetic response units. Equal split returns 5.075. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",24,6.399999999999991,12.0,3.999999999999986],["Channel B",0,0.0,12.0,1.655172413793102]],"note":"The best integer split returns 6.400 synthetic response units. Equal split returns 5.655. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",26,6.595121951219504,13.0,4.31948881789136],["Channel B",0,0.0,13.0,1.897100093545368]],"note":"The best integer split returns 6.595 synthetic response units. Equal split returns 6.217. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",16,5.119999999999987,14.0,4.611764705882339],["Channel B",12,1.655172413793102,14.0,2.1459854014598525]],"note":"The best integer split returns 6.775 synthetic response units. Equal split returns 6.758. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",15,4.8780487804877914,15.0,4.8780487804877914],["Channel B",15,2.399999999999998,15.0,2.399999999999998]],"note":"The best integer split returns 7.278 synthetic response units. Equal split returns 7.278. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",15,4.8780487804877914,16.0,5.119999999999987],["Channel B",17,2.91673675357443,16.0,2.6574394463667796]],"note":"The best integer split returns 7.795 synthetic response units. Equal split returns 7.777. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",15,4.8780487804877914,17.0,5.33949191685911],["Channel B",19,3.4353687549563814,17.0,2.91673675357443]],"note":"The best integer split returns 8.313 synthetic response units. Equal split returns 8.256. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",15,4.8780487804877914,18.0,5.538461538461527],["Channel B",21,3.946308724832212,18.0,3.1764705882352917]],"note":"The best integer split returns 8.824 synthetic response units. Equal split returns 8.715. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",15,4.8780487804877914,19.0,5.718811881188107],["Channel B",23,4.442267319804055,19.0,3.4353687549563814]],"note":"The best integer split returns 9.320 synthetic response units. Equal split returns 9.154. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",16,5.119999999999987,20.0,5.8823529411764595],["Channel B",24,4.68292682926829,20.0,3.69230769230769]],"note":"The best integer split returns 9.803 synthetic response units. Equal split returns 9.575. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",16,5.119999999999987,21.0,6.03076923076922],["Channel B",26,5.147208121827408,21.0,3.946308724832212]],"note":"The best integer split returns 10.267 synthetic response units. Equal split returns 9.977. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",17,5.33949191685911,22.0,6.165605095541391],["Channel B",27,5.370165745856351,22.0,4.196531791907512]],"note":"The best integer split returns 10.710 synthetic response units. Equal split returns 10.362. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",17,5.33949191685911,23.0,6.288261515601773],["Channel B",29,5.796668581275126,23.0,4.442267319804055]],"note":"The best integer split returns 11.136 synthetic response units. Equal split returns 10.731. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",18,5.538461538461527,24.0,6.399999999999991],["Channel B",30,5.9999999999999964,24.0,4.68292682926829]],"note":"The best integer split returns 11.538 synthetic response units. Equal split returns 11.083. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",18,5.538461538461527,25.0,6.501950585175544],["Channel B",32,6.3866943866943835,25.0,4.9180327868852425]],"note":"The best integer split returns 11.925 synthetic response units. Equal split returns 11.420. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",19,5.718811881188107,26.0,6.595121951219504],["Channel B",33,6.570135746606331,26.0,5.147208121827408]],"note":"The best integer split returns 12.289 synthetic response units. Equal split returns 11.742. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",19,5.718811881188107,27.0,6.680412371134013],["Channel B",35,6.917647058823526,27.0,5.370165745856351]],"note":"The best integer split returns 12.636 synthetic response units. Equal split returns 12.051. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",20,5.8823529411764595,28.0,6.758620689655165],["Channel B",36,7.081967213114751,28.0,5.586698337292159]],"note":"The best integer split returns 12.964 synthetic response units. Equal split returns 12.345. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",20,5.8823529411764595,29.0,6.830456852791871],["Channel B",38,7.3924914675767885,29.0,5.796668581275126]],"note":"The best integer split returns 13.275 synthetic response units. Equal split returns 12.627. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",21,6.03076923076922,30.0,6.896551724137925],["Channel B",39,7.539033457249069,30.0,5.9999999999999964]],"note":"The best integer split returns 13.570 synthetic response units. Equal split returns 12.897. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",21,6.03076923076922,31.0,6.95746606334841],["Channel B",41,7.8155753583882195,31.0,6.196668457818374]],"note":"The best integer split returns 13.846 synthetic response units. Equal split returns 13.154. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",22,6.165605095541391,32.0,7.013698630136981],["Channel B",42,7.945945945945944,32.0,6.3866943866943835]],"note":"The best integer split returns 14.112 synthetic response units. Equal split returns 13.400. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",23,6.288261515601773,33.0,7.065693430656929],["Channel B",43,8.071298654056017,33.0,6.570135746606331]],"note":"The best integer split returns 14.360 synthetic response units. Equal split returns 13.636. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",23,6.288261515601773,34.0,7.113846153846149],["Channel B",45,8.307692307692305,34.0,6.747081712062254]],"note":"The best integer split returns 14.596 synthetic response units. Equal split returns 13.861. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",24,6.399999999999991,35.0,7.1585098612125595],["Channel B",46,8.419098143236072,35.0,6.917647058823526]],"note":"The best integer split returns 14.819 synthetic response units. Equal split returns 14.076. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",24,6.399999999999991,36.0,7.199999999999996],["Channel B",48,8.629213483146064,36.0,7.081967213114751]],"note":"The best integer split returns 15.029 synthetic response units. Equal split returns 14.282. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",25,6.501950585175544,37.0,7.238598810310637],["Channel B",49,8.728264162375035,37.0,7.240193918025559]],"note":"The best integer split returns 15.230 synthetic response units. Equal split returns 14.479. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",26,6.595121951219504,38.0,7.274559193954656],["Channel B",50,8.823529411764703,38.0,7.3924914675767885]],"note":"The best integer split returns 15.419 synthetic response units. Equal split returns 14.667. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",26,6.595121951219504,39.0,7.3081081081081045],["Channel B",52,9.003329633740286,39.0,7.539033457249069]],"note":"The best integer split returns 15.598 synthetic response units. Equal split returns 14.847. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",27,6.680412371134013,40.0,7.3394495412844],["Channel B",53,9.088163925586409,40.0,7.679999999999998]],"note":"The best integer split returns 15.769 synthetic response units. Equal split returns 15.019. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",27,6.680412371134013,41.0,7.368767123287667],["Channel B",55,9.248407643312099,41.0,7.8155753583882195]],"note":"The best integer split returns 15.929 synthetic response units. Equal split returns 15.184. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",28,6.758620689655165,42.0,7.396226415094336],["Channel B",56,9.324083250743309,42.0,7.945945945945944]],"note":"The best integer split returns 16.083 synthetic response units. Equal split returns 15.342. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",29,6.830456852791871,43.0,7.421976919217257],["Channel B",57,9.39696312364425,43.0,8.071298654056017]],"note":"The best integer split returns 16.227 synthetic response units. Equal split returns 15.493. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",29,6.830456852791871,44.0,7.446153846153843],["Channel B",59,9.534809404245605,44.0,8.191819464033848]],"note":"The best integer split returns 16.365 synthetic response units. Equal split returns 15.638. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",30,6.896551724137925,45.0,7.468879668049789],["Channel B",60,9.599999999999998,45.0,8.307692307692305]],"note":"The best integer split returns 16.497 synthetic response units. Equal split returns 15.777. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",31,6.95746606334841,46.0,7.490265486725661],["Channel B",61,9.662843540359228,46.0,8.419098143236072]],"note":"The best integer split returns 16.620 synthetic response units. Equal split returns 15.909. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",31,6.95746606334841,47.0,7.510412239694005],["Channel B",63,9.781885397412198,47.0,8.526214216789961]],"note":"The best integer split returns 16.739 synthetic response units. Equal split returns 16.037. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",32,7.013698630136981,48.0,7.52941176470588],["Channel B",64,9.838270616493192,48.0,8.629213483146064]],"note":"The best integer split returns 16.852 synthetic response units. Equal split returns 16.159. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",32,7.013698630136981,49.0,7.547347740667973],["Channel B",66,9.945205479452053,49.0,8.728264162375035]],"note":"The best integer split returns 16.959 synthetic response units. Equal split returns 16.276. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."},{"rows":[["Channel A",33,7.065693430656929,50.0,7.564296520423598],["Channel B",67,9.995917609946186,50.0,8.823529411764703]],"note":"The best integer split returns 17.062 synthetic response units. Equal split returns 16.388. Exhaustive enumeration checks every feasible integer split; ties favor the first split. These parameters are known, not learned."}],"columns":["Channel","Best spend","Response","Equal spend","Response"],"context":"Two known Hill curves: β=(8,12), K=(12,30), S=2. Allocate a fixed budget between channels; no spend can be negative.","readout":"This is a single-period response model. Unlike the carryover scenario, this calculation does not apply adstock. Response is not revenue or profit.","note":""}],"config":{"adstockLength":12,"betas":[8,12],"halfSaturation":[12,30],"budgets":[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100]},"method":["Carryover reuses geometric_adstock_np from the existing lab. It computes a finite unnormalized sum of α^lag times spend; a pulse makes its impulse response explicit.","Allocation reuses hill_np: β × x^S/(K^S+x^S). The response parameters are specified, not fitted. Every nonnegative integer split is evaluated, preserving the total budget exactly.","With S=1 each curve is concave; S=2 introduces a threshold. The comparison is deterministic and has no statistical uncertainty bands."],"limits":["This v1 is a mechanics and allocation explorer. It does not run PyMC, posterior inference, lift calibration, or a head-to-head Meridian comparison.","No real marketing data or validated causal attribution. Known response curves omit parameter uncertainty, costs, interactions and changing markets; do not use the suggested split for real spending."],"references":[["PyMC-Marketing · MMM model components","https://www.pymc-marketing.io/en/0.13.0/api/generated/pymc_marketing.mmm.mmm.MMM.html"]],"provenance":{"python":"3.13.0","numpy":"2.4.6","sourceSha256":{"showcase_benchmark.py":"6709e51e1952246df699a4d58a99b5c0888761f91cf4723d9ae28f9a2963fbc2","mmm_utils.py":"30ea801c89936d65816f05c916835d6edc8d66d2e3180902f3cbf8e33672bb9b"}}}
