Estou tentando resolver um conjunto de equações que possui 40 variáveis independentes (x1, ..., x40) e uma variável dependente (y). O número total de equações (número de linhas) é ~ 300, e eu quero resolver o conjunto de 40 coeficientes que minimizam o erro total da soma dos quadrados entre y e o valor previsto.
Meu problema é que a matriz é muito esparsa e não sei a melhor maneira de resolver o sistema de equações com dados esparsos. Um exemplo do conjunto de dados é mostrado abaixo:
y x1 x2 x3 x4 x5 x6 ... x40
87169 14 0 1 0 0 2 ... 0
46449 0 0 4 0 1 4 ... 12
846449 0 0 0 0 0 3 ... 0
....
Atualmente, estou usando um algoritmo genético para resolver isso e os resultados estão saindo com aproximadamente um fator de duas diferenças entre o observado e o esperado.
Alguém pode sugerir diferentes métodos ou técnicas capazes de resolver um conjunto de equações com dados esparsos.
fonte
Respostas:
Se bem entendi, este é o caso de regressão linear múltipla com dados esparsos ( regressão esparsa ). Supondo que, espero que você encontre os seguintes recursos úteis.
1) A palestra do NCSU mostra regressão esparsa com visão geral de algoritmos, notas, fórmulas, gráficos e referências à literatura: http://www.stat.ncsu.edu/people/zhou/courses/st810/notes/lect23sparse.pdf
2) o
R
ecossistema oferece muitos pacotes , úteis para análises de regressão esparsas, incluindo:3) Uma postagem de blog com um exemplo de solução de regressão esparsa , com base em
SparseM
: http://aleph-nought.blogspot.com/2012/03/multiple-linear-regression-with-sparse.html4) Uma postagem no blog sobre o uso de matrizes esparsas no R , que inclui uma cartilha sobre o uso
glmnet
: http://www.johnmyleswhite.com/notebook/2011/10/31/using-sparse-matrices-in-r5) Mais exemplos e algumas discussões sobre o tópico podem ser encontrados no StackOverflow : /programming/3169371/large-scale-regression-in-r-with-a-sparse-feature-matrix
ATUALIZAÇÃO (com base no seu comentário):
Se você estiver tentando resolver um problema de LP com restrições, poderá achar este artigo teórico útil: http://web.stanford.edu/group/SOL/papers/gmsw84.pdf .
Além disso, verifique o pacote R limSolve : http://cran.r-project.org/web/packages/limSolve . E, em geral, verifique os pacotes no CRAN Task View "Otimização e programação matemática" : http://cran.r-project.org/web/views/Optimization.html .
Por fim, verifique o livro "Usando R para Análise Numérica em Ciência e Engenharia" (de Victor A. Bloomfield). Possui uma seção sobre solução de sistemas de equações, representada por matrizes esparsas (seção 5.7, páginas 99-104), que inclui exemplos, com base em alguns dos pacotes mencionados acima: http://books.google.com/books? ID = 9ph_AwAAQBAJ & pg = PA99 & gpl = PA99 & dq = r + limsolve + esparso + matriz & fonte = bl & ots = PHDE8nXljQ & sig = sPi4n5Wk0M02ywkubq7R7KD_b04 & hl = en & sa = X & ei = FZjiU-ioIcjmsATGkYDAAg & ved = 0CDUQ6AEwAw # v = onepage & q = r% 20limsolve% 20sparse% 20matrix & f = falso .
fonte
A resposta de Aleksandr está completamente correta.
No entanto, a maneira como a questão é colocada implica que essa é uma questão simples de regressão simples de mínimos quadrados: minimizar a soma dos resíduos quadrados entre uma variável dependente e uma combinação linear de preditores.
Agora, embora possa haver muitos zeros em sua matriz de design, seu sistema não é muito grande: 300 observações em 40 preditores não são mais que médias. Você pode executar essa regressão usando R sem nenhum esforço especial para dados esparsos. Basta usar o
lm()
comando (para "modelo linear"). Use?lm
para ver a página de ajuda. E observe quelm
, por padrão, silenciosamente adicionará uma coluna constante à sua matriz de design (a interceptação) - inclua um-1
no lado direito da sua fórmula para suprimir isso. No geral, supondo que todos os seus dados (e nada mais) sejamdata.frame
chamadosfoo
, você pode fazer isso:E então você pode olhar para estimativas de parâmetros, etc. como este:
Se o seu sistema for muito maior, digamos da ordem de 10.000 observações e centenas de preditores, analisar solucionadores esparsos especializados de acordo com a resposta de Aleksandr pode começar a fazer sentido.
Finalmente, em seu comentário à resposta de Aleksandr , você menciona restrições em sua equação. Se esse é realmente o seu problema principal, existem maneiras de calcular os mínimos quadrados restritos em R. Eu pessoalmente gosto
pcls()
domgcv
pacote. Talvez você queira editar sua pergunta para incluir o tipo de restrições (restrições de caixa, restrições de não-negatividade, restrições de integralidade, restrições lineares, ...) que você enfrenta?fonte