条件付き期待値関数(CEF)#
CEFの性質#
CEF分解の性質#
従属変数\(y\)、\(d \times 1\)の説明変数ベクトル\(X = (x_{1}, \dots, x_{d})\)を扱うこととする。
任意の確率変数\(y\)は\(X\)の条件付き期待値関数(conditional expectation function: CEF)\(E[y|X]\)と、それと直交する項\(e\)とに分解できる
(=Xによって説明される部分とXと無相関の部分とに分解できる)
\[
y = E[y|X] + e
\]
ここで
\(e\)は\(X\)と平均独立\(E[e|X]=0\)
\(e\)は\(X\)のいかなる関数とも無相関
である
証明
\(E[e|X]=E[y-E[y|X]|X]=E[y|X] - E[y|X] = 0\)
\(h(X)\)を\(X\)の任意の関数とする。繰り返し期待値の法則\(E_x[E[Y|X]]=E[Y]\)より\(E[h(X)e]=E[h(X) E[e|X]]\)で、平均独立\(E[e|X]=0\)より\(E[h(X)e]=0\)
二条誤差における最良の回帰関数#
\(m(X)\)を\(X\)の任意の関数とする。CEFは予測誤二乗和の最小化問題の解である。
\[
E[y|X] = \arg \min_{m(X)} E[(y-m(X))^2]
\]
#
線形CEF定理
FWL定理#
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
true_beta = np.array([3, 5, 7])
d = len(coef_true)
n = 100
X = np.random.uniform(size=n * d).reshape(-1, d)
y = X @ true_beta + np.random.normal(size=n)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[1], line 6
4 np.random.seed(0)
5 true_beta = np.array([3, 5, 7])
----> 6 d = len(coef_true)
7 n = 100
8 X = np.random.uniform(size=n * d).reshape(-1, d)
NameError: name 'coef_true' is not defined
class OLS:
def fit(self, X, y):
self.beta_ = np.linalg.inv(X.T @ X) @ X.T @ y
return self
def predict(self, X):
return X @ self.beta_
model = OLS()
model.fit(X, y)
model.beta_
array([2.56721661, 4.94832955, 7.22025893])
\(x_j\)をそれ以外の説明変数に回帰し
\[
x_j = \gamma_0 + \gamma_1 x_1 + \cdots + \gamma_{j-1} x_{j-1} + \gamma_{j+1} x_{j+1} + \cdots + \gamma_d x_d + \tilde{x}_j
\]
その残差\(\tilde{x}_j\)を使って
\[
\beta_j = \frac
{Cov(Y, \tilde{x}_j)}
{Var(\tilde{x}_j)}
\]
のように\(\beta_j\)を推定することができる
model.fit(X[:, 1:3], X[:, 0])
model.beta_
array([0.35005087, 0.53528288])
residual = X[:, 0] - model.predict(X[:, 1:3])
residual
array([-0.02418807, 0.05084639, -0.39041088, -0.17681092, 0.20601426,
-0.36563531, -0.0502294 , 0.21981341, -0.18246505, 0.54003402,
-0.25063503, 0.23124686, -0.10903475, 0.32203852, 0.31964041,
0.52798123, -0.11710549, 0.03799755, -0.19718749, -0.04077773,
-0.23098932, -0.12800315, 0.33846528, -0.49657305, 0.36931925,
-0.12414819, 0.0843685 , 0.02113964, 0.19361591, -0.60510641,
0.01439223, 0.51696115, 0.13575687, -0.37710544, 0.26522578,
0.06259589, -0.34976755, 0.44234243, 0.20336118, -0.09807966,
0.03799004, 0.17102746, -0.43975292, -0.15577178, -0.27403238,
0.04018249, 0.02117883, -0.26244433, 0.50614744, 0.13479612,
-0.24141967, 0.11829199, 0.3901465 , -0.41774219, -0.10340225,
0.65901272, 0.39100947, -0.02558537, 0.53045183, 0.66445758,
-0.36183548, -0.41777507, -0.06168752, 0.0602216 , -0.54025425,
0.27469945, -0.26093776, 0.46797235, -0.36252938, -0.21410597,
0.55947956, -0.14985363, -0.1291308 , 0.14375786, -0.1051827 ,
0.59677821, 0.55560326, 0.01817855, -0.14147823, 0.05229564,
0.5457693 , -0.33087323, 0.42372952, -0.13982339, 0.0195092 ,
-0.42273305, 0.73075836, -0.40301839, 0.24426778, 0.30407443,
0.48966302, 0.37230869, 0.32414815, 0.31729101, 0.42737496,
-0.45161281, 0.07624642, -0.2525051 , 0.38042213, 0.00730186])
np.cov(y, residual)[1, 0] / np.var(residual)
-1.0835887765493208