OLS回归:如何使预测值总和严格等于指定值的技术咨询
Great question! When you need your predicted September room prices to sum exactly to 500 while using OLS, you have two reliable approaches—one quick and practical, the other statistically rigorous. Let’s break them down:
1. Post-OLS Scaling (Simple & Intuitive)
This method starts with standard OLS predictions, then adjusts them proportionally to hit your total sum target. It’s perfect if you want to preserve the relative relationships between your predicted prices without rewriting your entire model.
How it works:
- First, run your OLS model to get initial predicted September prices.
- Calculate the sum of these initial predictions (
initial_sum). - Compute a scaling factor:
scaling_factor = 500 / initial_sum. - Multiply each initial prediction by this factor—your new predictions will now sum exactly to 500.
Example Code (Python):
import pandas as pd # Your dataset room_data = pd.DataFrame({ "Rooms": ["Single", "Balcony", "Triple", "Couple", "Family"], "March_Price": [20, 50, 100, 75, 150] }) # Step 1: Get initial OLS predictions (example model: Sept_Price = 1.1 * March_Price + 3) # Replace this with your actual OLS model output room_data["Initial_Sept_Pred"] = room_data["March_Price"] * 1.1 + 3 # Step 2: Calculate scaling factor initial_sum = room_data["Initial_Sept_Pred"].sum() scaling_factor = 500 / initial_sum # Step3: Adjust predictions room_data["Adjusted_Sept_Pred"] = room_data["Initial_Sept_Pred"] * scaling_factor # Verify the sum print(f"Adjusted sum: {room_data['Adjusted_Sept_Pred'].sum()}") # Output: ~500
Pros & Cons:
- ✅ Easy to implement, no complex math required
- ✅ Preserves the relative differences between predicted prices
- ❌ Slightly deviates from pure OLS if the initial sum is far from 500
2. Constrained OLS (Statistically Precise)
If you want to enforce the sum constraint directly in your OLS model (instead of adjusting after the fact), you can use constrained least squares. This method minimizes the squared prediction error while ensuring the total sum of predictions equals 500.
How it works:
The standard OLS objective is to minimize sum((y - Xβ)^2). We add a linear constraint: sum(Xβ) = 500 (where Xβ are your predicted prices). Using Lagrange multipliers or matrix algebra, we can compute the adjusted coefficients that satisfy this constraint.
Example Code (Python):
import numpy as np import statsmodels.api as sm import pandas as pd # Your dataset plus synthetic September prices (replace with real data if available) room_data = pd.DataFrame({ "Rooms": ["Single", "Balcony", "Triple", "Couple", "Family"], "March_Price": [20, 50, 100, 75, 150], "Sept_Price": [24, 56, 108, 82, 165] # Synthetic actuals }) # Prepare OLS inputs X = sm.add_constant(room_data["March_Price"]) # Add intercept y = room_data["Sept_Price"] # Step1: Run standard OLS ols_model = sm.OLS(y, X).fit() initial_preds = ols_model.predict(X) print(f"Initial sum: {initial_preds.sum()}") # Step2: Define the sum constraint: sum(preds) = 500 n = len(y) # Constraint matrix: n*alpha + beta*sum(March_Price) =500 C = np.array([[n, room_data["March_Price"].sum()]]) d = np.array([500]) # Step3: Compute constrained coefficients XTX_inv = np.linalg.inv(X.T @ X) C_XTX_inv_CT = C @ XTX_inv @ C.T lambda_hat = np.linalg.inv(C_XTX_inv_CT) @ (d - C @ ols_model.params) constrained_beta = ols_model.params + XTX_inv @ C.T @ lambda_hat # Step4: Get constrained predictions constrained_preds = X @ constrained_beta print(f"Constrained sum: {constrained_preds.sum()}") # Output: Exactly 500
Pros & Cons:
- ✅ Exact OLS solution that meets the sum constraint
- ✅ Minimizes prediction error while adhering to the constraint
- ❌ Requires more code/math, and needs actual September price data to fit the model
Which Method Should You Choose?
- Use post-OLS scaling if you don’t have September price data (e.g., extrapolating from March) or want a quick, simple fix.
- Use constrained OLS if you have observed September prices and want the most statistically valid prediction that satisfies the sum constraint.
内容的提问来源于stack exchange,提问作者Rikky Bhai

