Skip to content

Commit f596a22

Browse files
committed
BUG: use centered tss in r-square with entity or time effects in panel model
1 parent e09dd99 commit f596a22

File tree

4 files changed

+22
-4
lines changed

4 files changed

+22
-4
lines changed

RELEASE.rst

+3
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,16 @@ pandas 0.6.2
9191
- Fix handling of missing columns (was combine_first-specific) in
9292
DataFrame.combine for general case (GH #529)
9393
- Fix type inference logic with boolean lists and arrays in DataFrame indexing
94+
- Use centered sum of squares in R-square computation if entity_effects=True
95+
in panel regression
9496

9597
Thanks
9698
------
9799
- Craig Austin
98100
- Andreas Hilboll
99101
- Adam Klein
100102
- Matt Harrison
103+
- Mario Gamboa-Cavazos
101104
- Arthur Gerigk
102105
- Gregg Lind
103106
- Solomon Negusse

pandas/stats/ols.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,16 @@ def p_value(self):
257257
@cache_readonly
258258
def _r2_raw(self):
259259
"""Returns the raw r-squared values."""
260-
has_intercept = np.abs(self._resid_raw.sum()) < _FP_ERR
261-
if self._intercept:
260+
if self._use_centered_tss:
262261
return 1 - self.sm_ols.ssr / self.sm_ols.centered_tss
263262
else:
264263
return 1 - self.sm_ols.ssr / self.sm_ols.uncentered_tss
265264

265+
@property
266+
def _use_centered_tss(self):
267+
# has_intercept = np.abs(self._resid_raw.sum()) < _FP_ERR
268+
return self._intercept
269+
266270
@cache_readonly
267271
def r2(self):
268272
"""Returns the r-squared values."""
@@ -934,7 +938,7 @@ def _rmse_raw(self):
934938
def _r2_raw(self):
935939
rs = self._resid_stats
936940

937-
if self._intercept:
941+
if self._use_centered_tss:
938942
return 1 - rs['sse'] / rs['centered_tss']
939943
else:
940944
return 1 - rs['sse'] / rs['uncentered_tss']

pandas/stats/plm.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -328,10 +328,19 @@ def _r2_raw(self):
328328
resid = Y - np.dot(X, self._beta_raw)
329329

330330
SSE = (resid ** 2).sum()
331-
SST = ((Y - np.mean(Y)) ** 2).sum()
331+
332+
if self._use_centered_tss:
333+
SST = ((Y - np.mean(Y)) ** 2).sum()
334+
else:
335+
SST = (Y**2).sum()
332336

333337
return 1 - SSE / SST
334338

339+
@property
340+
def _use_centered_tss(self):
341+
# has_intercept = np.abs(self._resid_raw.sum()) < _FP_ERR
342+
return self._intercept or self._entity_effects or self._time_effects
343+
335344
@cache_readonly
336345
def _r2_adj_raw(self):
337346
"""Returns the raw r-squared adjusted values."""

pandas/stats/tests/test_ols.py

+2
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,8 @@ def testRolling(self):
562562
def testRollingWithFixedEffects(self):
563563
self.checkMovingOLS(self.panel_x, self.panel_y,
564564
entity_effects=True)
565+
self.checkMovingOLS(self.panel_x, self.panel_y, intercept=False,
566+
entity_effects=True)
565567

566568
def testRollingWithTimeEffects(self):
567569
self.checkMovingOLS(self.panel_x, self.panel_y,

0 commit comments

Comments
 (0)