Eu estava seguindo os códigos do GitHub Copilot para escrever uma função que obtém uma matriz e ajusta uma regressão linear de variável única em cada linha da matriz em relação ao tempo, e fui confrontado com um procedimento estranho:
function fᵢ(adj_price::Matrix{Float64})
n_assets, n_days = size(adj_price)
n_days > 1 || ArgumentError("") |> throw
t = 1:n_days
# Fit a linear regression on each row of the adjusted price \
# matrix against t and store the gradients in aᵢ Vector.
aᵢ = zeros(n_assets)
for i in 1:n_assets
aᵢ[i] = adj_price[i, :] \ t
end
return aᵢ
end
O objetivo é armazenar o gradiente de cada modelo de regressão em um Vetor e retornar o Vetor como saída final. Assim, deve-se ajustar uma regressão em cada linha da Matriz contra uma variável de tempo, para atingir seu coeficiente (gradiente). Minha pergunta está onde temos adj_price[i, :] \ t
. Esta pequena operação atinge o coeficiente?
Sim, é útil consultar os documentos:
Então, na sua regressão linear básica:
y = X * b
onde y é o seu resultado, X é a sua matriz de regressores e b é o vetor covariável, multiplicando ambos os lados da equação pelo inverso de X você obtém
X \ y = b
que é o que a regressão linear calcula.
Observe que isso é diferente da regressão simples
que pode ser executado usando GLM, já que a
@formula
macro por padrão inclui um termo de interceptação, então você está se ajustandoy = a + Xb
em vez de. Para replicar isso,
\
você teria que fazerpara incluir manualmente a coluna de interceptação em sua matriz de regressores.