How do you estimate a demand function?
A demand function connects quantity, price and context over an observed domain. Shape, heterogeneity, competition and endogeneity determine what can be simulated.
Scientific editorial team : Marketing Science Center
Direct answer
Compare scenarios near observed data with intervals and diagnostics.
A demand function connects quantity, price and context over an observed domain. Shape, heterogeneity, competition and endogeneity determine what can be simulated.
01
Operational summary
Scientific question and scope
How do you estimate a demand function?
Supported
Compare scenarios near observed data with intervals and diagnostics.
Forbidden
Extrapolate stable demand through an unobserved structural change.
02
Three reading levels
- 01
Decision-maker — Connect the result to a declared decision, useful threshold and error cost.
- 02
Practitioner — Fix population, unit, horizon, available variables and analysis rule before calculation.
- 03
Analyst — Reproduce the calculation, quantify uncertainty and document diagnostics, failures and sensitivities.
03
Concrete marketing situation
A demand function connects quantity, price and context over an observed domain. Shape, heterogeneity, competition and endogeneity determine what can be simulated.
04
Scientific question and scope
How do you estimate a demand function?
Associational target by default: E[ln(Q)|ln(P),X]. Structural target only under a separately justified identification design: counterfactual demand Q(p)
Required data
Market × product × period
Population, unit of analysis, origin date and horizon must be declared in the deliverable. Without them, the estimand silently changes.
05
Why a simple analysis can fail
- Extrapolate stable demand through an unobserved structural change.
- Declare associational or structural target
- Functional form
- Price endogeneity
06
Method intuition
The method does not automatically turn an association into evidence. It links a declared question to an estimand, specification, compatible data and a bounded interpretation rule.
Associational target by default: E[ln(Q)|ln(P),X]. Structural target only under a separately justified identification design: counterfactual demand Q(p)
07
Required data
Scientific symbol dictionary
P0- Baseline unit price before the scenario. Unit:
euro per unit· Type:positive number· Role:input P1- Scenario unit price P0 multiplied by the declared price ratio. Unit:
euro per unit· Type:positive number· Role:derived Q0- Baseline volume over the declared horizon. Unit:
unit· Type:positive number· Role:input Q1- Conditional scenario volume under constant supplied elasticity. Unit:
unit· Type:positive number· Role:derived VC- Variable cost per unit, held constant in this sealed branch. Unit:
euro per unit· Type:nonnegative number· Role:input price_ratio- Multiplicative scenario price P1/P0. Unit:
ratio· Type:positive number· Role:input elasticity- Externally supplied constant price elasticity used only for the scenario range. Unit:
dimensionless· Type:number· Role:input delta_fixed_cost- Signed change in fixed cost; a negative value is a saving and therefore increases delta profit through the minus sign. Unit:
euro· Type:number· Role:input delta_profit- Conditional change in contribution after the signed fixed-cost change. Unit:
euro over declared horizon· Type:number· Role:output
Exact sealed engine inputs
baseline_price_eur- Value:
100· Unit:EUR_per_unit· Type:number· Data status:synthetic baseline_volume- Value:
10000· Unit:unit· Type:number· Data status:synthetic variable_cost_eur- Value:
55· Unit:EUR_per_unit· Type:number· Data status:synthetic fixed_cost_change_eur- Value:
0· Unit:EUR· Type:number· Data status:synthetic elasticity- Value:
-1.3· Unit:dimensionless· Type:number· Data status:synthetic price_ratio- Value:
1.05· Unit:ratio· Type:number· Data status:synthetic
08
Formal model
Formal model
P1 = P0 × price_ratio; Q1 = Q0 × price_ratio^elasticity; delta_profit = (P1−VC)Q1 − (P0−VC)Q0 − delta_fixed_costEvidence claims: MSC-P023-C01 · MSC-P023-C02 · MSC-P023-C03 · MSC-P023-C04 · MSC-P023-C05
Scientific question and scope
Associational target by default: E[ln(Q)|ln(P),X]. Structural target only under a separately justified identification design: counterfactual demand Q(p)
09
Declared calculation
- 01
Validate positive prices and volumes, nonnegative variable cost, a positive price ratio and the signed fixed-cost convention.
- 02
Compute the scenario price and volume with the supplied elasticity, then calculate baseline and scenario contribution.
- 03
Subtract the signed fixed-cost change and label the result as a conditional scenario, not demand estimation or a causal effect.
10
Numerical example or application case
Synthetic illustration — teaching values, not observed — synthetic data or declared parameters; no real observations
Sealed inputs
baseline_price_eur=100 [EUR_per_unit]baseline_volume=10000 [unit]variable_cost_eur=55 [EUR_per_unit]fixed_cost_change_eur=0 [EUR]elasticity=-1.3 [dimensionless]price_ratio=1.05 [ratio]
Reproducible results
Q1=9385.424301conditional_volume_change=-6.1458%incremental_contribution=€19,271.215054
Verified dossier: claims are linked to passage-level sources, the Python/R calculation is reproduced, limits are explicit, and independent scientific review is complete.
11
Validity assumptions
- Is the supplied elasticity credible over the exact price range and horizon?
- Are variable and fixed cost sign conventions reconciled with finance?
- Could capacity, competitor response, substitution or endogeneity invalidate the constant-elasticity scenario?
12
Diagnostics and uncertainty
Diagnostics and uncertainty
Declare associational or structural target · Functional form · Price endogeneity · Residual structure · Observed support for scenarios
Bounded diagnostic
Conditional scenario using a supplied elasticity; neither demand estimation nor causal effect.
Explicit uncertainty contract · not_estimable_from_sealed_inputs
Method : Explicit non-estimability assessment against the sealed input schema.
Target : Uncertainty of incremental contribution under uncertain elasticity and costs.
Engine evidence : diagnostic=conditional_scenario_using_supplied_elasticity_not_demand_estimation_or_causal_effect
Interpretation : No sampling distribution or credible range for elasticity and costs is supplied, so the example is a conditional point scenario only.
Stop when
Extrapolate stable demand through an unobserved structural change.
13
Result interpretation
- Compare scenarios near observed data with intervals and diagnostics.
- The result is conditional on the declared population, horizon, specification and diagnostics. It must not be extended to another decision without new justification.
14
Supported and forbidden conclusions
Supported
Compare scenarios near observed data with intervals and diagnostics.
Forbidden
Extrapolate stable demand through an unobserved structural change.
15
Possible marketing decision
- 01
Compare scenarios near observed data with intervals and diagnostics.
- 02
The result is conditional on the declared population, horizon, specification and diagnostics. It must not be extended to another decision without new justification.
16
When to use — when to stop
Use when
Compare scenarios near observed data with intervals and diagnostics.
Market × product × period
Stop when
Extrapolate stable demand through an unobserved structural change.
Methodological alternatives
- Estimate a demand model with explicit price endogeneity controls.
- Run a randomized price experiment where legal and operationally feasible.
- Use a richer demand system when substitution across products matters.
17
Reproducibility contract
Python and R are the executable references. SPSS and SAS remain secondary syntaxes until checked on the same data, specification and diagnostics.
The engine selects only this page’s explicit slice and branch. Its hash, outputs, and diagnostics remain sealed in the atomic dossier; no generic fallback branch is allowed.
Slice fingerprint: 27a93ef2c767497234093d2e6d4cb40930812f450e9b235f978cfa4a11ab6b84
CSV · CC0
msc-validation-inputs-v1.csv ↓Python · MIT
msc-validation-reference-v1.py ↓R · MIT
msc-validation-reference-v1.R ↓SPSS / SAS · MIT · inspection only
SPSS ↓SAS ↓Formal model
P1 = P0 × price_ratio; Q1 = Q0 × price_ratio^elasticity; delta_profit = (P1−VC)Q1 − (P0−VC)Q0 − delta_fixed_costVerified dossier: claims are linked to passage-level sources, the Python/R calculation is reproduced, limits are explicit, and independent scientific review is complete.
18
Expected final deliverable
- 01
How do you estimate a demand function? —
Market × product × period - 02
P0 · P1 · Q0 · Q1 · VC · price_ratio · elasticity · delta_fixed_cost · delta_profit
- 03
P1 = P0 × price_ratio; Q1 = Q0 × price_ratio^elasticity; delta_profit = (P1−VC)Q1 − (P0−VC)Q0 − delta_fixed_cost - 04
Declare associational or structural target · Functional form · Price endogeneity · Residual structure · Observed support for scenarios
- 05
Compare scenarios near observed data with intervals and diagnostics. / Extrapolate stable demand through an unobserved structural change.
19
Scientific sources and evidence status
Verified dossier: claims are linked to passage-level sources, the Python/R calculation is reproduced, limits are explicit, and independent scientific review is complete.
MSC-P023-C01— Elasticity is a dimensionless relative response measure.MSC-P023-C02— A log-log price coefficient can be interpreted as elasticity under the stated form.MSC-P023-C03— Omitted variables, cross-sectional design and aggregation can bias elasticity estimates.MSC-P023-C04— Price may be correlated with unobserved demand determinants.MSC-P023-C05— Ignoring marketing-mix endogeneity can materially bias parameters.
Method connections

