I used an example from the paper: An Introduction to Shrinkage Estimation of the
Covariance Matrix: A Pedagogic Illustration
I was able to get the same Shrinkage matrix. I have provided the same matrix they use in their paper.
Hope this helps
import numpy as np
import pandas
from math import pow
def get_shrunk_covariance_matrix(obs, c, zeros):
w_len=c.shape[0]
T=obs.shape[0]
print T, w_len
w=((T-1.0)/T)*c
sq_cov=c*c
sq_cov=sq_cov.as_matrix()
np.fill_diagonal(sq_cov, 0)
sq_cov=pandas.DataFrame(sq_cov).dropna()
frames =[]
for z in range(w_len):
LST=[]
for cc in range(T):
lst=[]
for ccc in range(w_len):
val = pow(obs.loc[cc][z]*obs.loc[cc][ccc]-w.loc[z][ccc],2)
lst.append(val)
LST.append(lst)
df=pandas.DataFrame(LST)
df[z]=0
frames.append(df)
result = pandas.concat(frames)
Sum_of_All_Estimated_Var=result.values.tolist()
sum1=0
for s in Sum_of_All_Estimated_Var: sum1+=sum(s)
a1=(T/pow((T-1),3))*sum1
Sum_of_All_S_ij_Squared=sq_cov.values.tolist()
a2=0
for s in Sum_of_All_S_ij_Squared: a2+=sum(s)
Optimal_Shrinkage_Intensity = a1/(a1+a2)
print Optimal_Shrinkage_Intensity
Shrinkage=(1-Optimal_Shrinkage_Intensity)*c + Optimal_Shrinkage_Intensity*zeros
print Shrinkage
if __name__=="__main__":
n=np.matrix([[10,12,9,-2,17,8,12], [-9,-11,2,-5,-7,2,-2], [16,5,8,5,18,8,9], [6,-3,6,-13,1,4,2], [1,4,-9,5,8,-16,-1], [12,-1,2,22,11,6,10]])
mean = n.mean(axis=0)
n=n-mean
frame = pandas.DataFrame(n).dropna()
c=pandas.DataFrame(np.cov(frame, rowvar=0), index=frame.columns, columns=frame.columns)
C=np.cov(frame, rowvar=0)
D=C.diagonal()
zeros = np.zeros((C.shape[0], C.shape[0]), float)
np.fill_diagonal(zeros, D)
get_shrunk_covariance_matrix(frame, c, zeros)
rpy
andrpy2
so you can reap R's solutions in Python too... $\endgroup$