Correlação em VBA

Agora uma versão de cálculo de correlação de Pearson em VBA usando o Access. Este cálculo é mais fácil de fazer no VBA, porque já há a função interna de cálculo de desvio padrão.

Segue:

Public Function Correlacao(Coluna1 As String, Coluna2 As String, Tabela As String) As Double
    Dim s As String
    Dim rs As DAO.Recordset
    Correlacao = 0
 
    Dim where As String
    'Descrever quais são os critérios de valores válidos
    'No meu caso, só queria valores entre 1 e 5
    where = "[X] > 0 AND [X] < 6 AND [Y] > 0 AND [Y] < 6"
    where = Replace(where, "X", Coluna1)
    where = Replace(where, "Y", Coluna2)
 
    Dim dCol1 As Double
    Dim dCol2 As Double
    dCol1 = DStDev("[" & Coluna1 & "]", Tabela, where) 'Função interna
    dCol2 = DStDev("[" & Coluna2 & "]", Tabela, where) 'Função interna
 
    If dCol1 = 0 Or dCol2 = 0 Then GoTo exitFunction
 
    Dim dV As Double
    dV = dCol1 * dCol2
    ' (Avg([P2k]*[P8])-Avg([P2k])*Avg([P8]))
    '(Avg([P2k]*[P8])-Avg([P2k])*Avg([P8]))
    s = "SELECT (Avg([X] * [Y]) - (Avg([X]) * Avg([Y]))) AS C FROM [Tabela] WHERE " & where & ";"
    s = Replace(s, "X", Coluna1)
    s = Replace(s, "Y", Coluna2)
    s = Replace(s, "Tabela", Tabela)
 
    'Uma função minha que inclui tratamentos de erros.
    'Em essência é CurrentDB.OpenRecordset(stringSQL, RecordsetTypeEnum)
    Set rs = DAORecordset(s, dbOpenSnapshot) 
 
    If rs Is Nothing Then GoTo exitFunction    
    If rs.EOF And rs.BOF Then GoTo exitFunction
 
    Dim dCorrel1 As Double
    dCorrel1 = rs(0).Value / dV
 
    Correlacao = dCorrel1
 
exitFunction:
    Set rs = Nothing
End Function

Para usar:

doubleCorrel = Correlacao(nomeColuna1, nomeColuna2, nomeTabelaOuConsulta)

Espero que ajude alguém!!!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *