Como obter com eficiência a matriz de correlação (com valores-p) de um quadro de dados com valores de NaN?
Estou tentando calcular uma matriz de correlação e filtrar as correlações com base nos valores de p para descobrir os pares altamente correlacionados.
Para explicar o que quero dizer, diga que tenho um quadro de dados como este.
df
A B C D
0 2 NaN 2 -2
1 NaN 1 1 1.1
2 1 NaN NaN 3.2
3 -4 NaN 2 2
4 NaN 1 2.1 NaN
5 NaN 3 1 1
6 3 NaN 0 NaN
Para o coeficiente de correlação. Eu usei pd.corr (). Esse método pode processar o quadro de dados com valores de NaN e, mais importante, tolera o par de colunas com 0 sobreposição (col A e col B):
rho = df.corr()
A B C D
A 1.000000 NaN -0.609994 0.041204
B NaN 1.0 -0.500000 -1.000000
C -0.609994 -0.5 1.000000 0.988871
D 0.041204 -1.0 0.988871 1.000000
O desafio é calcular o valor-p. Não encontrei um método interno para fazer isso. No entanto decorrelação das colunas pandas com significância estatística, @BKay forneceu uma maneira de loop para calcular o valor p. Este método irá reclamar de erro se houver menos de 3 sobreposições. Então, fiz algumas modificações adicionando uma exceção de erro.
ValueError: matriz de tamanho zero para operação máxima de redução que não possui identidade
pval = rho.copy()
for i in range(df.shape[1]): # rows are the number of rows in the matrix.
for j in range(df.shape[1]):
try:
df_ols = pd.ols(y=df.iloc[:,i], x=df.iloc[:,j], intercept=True)
pval.iloc[i,j] = df_ols.f_stat['p-value']
except ValueError:
pval.iloc[i,j] = None
pval
A B C D
A 0.000000 NaN 0.582343 0.973761
B NaN 0.000000 0.666667 NaN
C 0.582343 0.666667 0.000000 0.011129
D 0.973761 NaN 0.011129 0.000000
Esse método gera uma matriz de valor p, mas fica extremamente lento quando o tamanho do quadro de dados original aumenta (meu quadro de dados real é de ~ 5000 linhas x 500 colunas). O que você sugeriria fazer para obter essa matriz de valor-p de maneira eficiente para um quadro de dados de tamanho grande.