É possível em R (ou em geral) forçar os coeficientes de regressão como um certo sinal?

10

Estou trabalhando com alguns dados do mundo real e os modelos de regressão estão produzindo alguns resultados contra-intuitivos. Normalmente confio nas estatísticas, mas, na realidade, algumas dessas coisas não podem ser verdadeiras. O principal problema que estou vendo é que um aumento em uma variável está causando um aumento na resposta quando, na realidade, elas precisam estar correlacionadas negativamente.

Existe uma maneira de forçar um sinal específico para cada um dos coeficientes de regressão? Qualquer código R para fazer isso também seria apreciado.

Obrigado por toda e qualquer ajuda!

JRW
fonte
9
Consulte stat.columbia.edu/~gelman/stuff_for_blog/… .
Dimitriy V. Masterov 26/06
11
Pode estar relacionado aqui
Este link r-bloggers.com/positive-coefficient-regression-in-r Acredito que responde à pergunta da @ JRW sobre valores de R ao quadrado. Como já comentado, deve-se tomar cuidado antes de forçar valores positivos do coeficiente.
Esme_ 23/08/19

Respostas:

11
  1. cuidado com a distinção entre a correlação marginal e a correlação parcial (correlação condicional a outras variáveis). Eles podem legitimamente ter sinais diferentes.

    Isso é pode de fato ser negativo enquanto o coeficiente de regressão em uma regressão múltipla é positivo. Não há necessariamente nenhuma contradição nessas duas coisas. Veja também o paradoxo de Simpson , que está um pouco relacionado (especialmente o diagrama). Em geral, você não pode inferir que um coeficiente de regressão deve ter um sinal apenas com base em um argumento sobre a correlação marginal.corr(Y,Xi)

  2. Sim, certamente é possível restringir os coeficientes de regressão para ou *. Existem várias maneiras de fazer isso; algumas delas podem ser feitas prontamente em R, como via . Veja também as respostas a esta pergunta que mencionam vários pacotes R e outras abordagens possíveis.000nnls

    No entanto, aconselho você a não ignorar rapidamente os pontos em 1. apenas porque muitos deles são facilmente implementados.

    * (você pode usar programas que não são negativos para serem negativos, negando a variável correspondente)

Glen_b -Reinstate Monica
fonte
10

Pode muito bem haver uma forma, mas eu diria que é não aconselhável em suas circunstâncias.

Se você tiver um resultado impossível:

1) Há um problema com seus dados 2) Há um problema com sua definição de "impossível" ou 3) Você está usando o método errado

Primeiro, verifique os dados. Segundo, verifique o código. (Ou peça para outras pessoas verificarem). Se ambos estão bem, então talvez algo inesperado esteja acontecendo.

Felizmente para você, você tem uma "impossibilidade" simples - você diz que duas variáveis não podem ser positivamente correlacionadas. Então, faça um gráfico de dispersão e adicione um mais suave e veja. Um único outlier pode causar isso; ou pode ser um relacionamento não linear. Ou alguma outra coisa.

Mas, se você tiver sorte, encontrou algo novo. Como meu professor favorito costumava dizer: "Se você não está surpreso, não aprendeu nada".

Peter Flom - Restabelece Monica
fonte
(+1 para Peter e Glen) @JRW - Se você corrigir o sinal, eu gostaria de ser uma mosca na parede quando tentar explicar ao público o coeficiente que você "obteve" e seu intervalo de confiança. Além disso, eles podem perguntar legitimamente: você consertou o sinal e / ou o alcance de outros? Se não, por que não?
Rolando2
6

Para responder sua pergunta específica, você pode tentar o pacote nnls , que faz a regressão de mínimos quadrados com restrições não negativas nos coeficientes. Você pode usá-lo para obter os sinais desejados alterando os sinais dos preditores apropriados.

A propósito, aqui está uma maneira muito simples de criar um conjunto de dados para demonstrar como é possível ter correlações positivas e coeficientes de regressão negativos.

> n <- rnorm(200)
> x <- rnorm(200)
> d <- data.frame(x1 = x+n, x2= 2*x+n, y=x)
> cor(d)
      x1        x2         y
 x1 1.0000000 0.9474537 0.7260542
 x2 0.9474537 1.0000000 0.9078732
 y  0.7260542 0.9078732 1.0000000
> plot(d)
> lm(y~x1+x2-1, d)

Call:
lm(formula = y ~ x1 + x2 - 1, data = d)

Coefficients:
x1  x2  
-1   1  
Innuo
fonte
Eu apenas brinquei um pouco com esse pacote nnls. Existe alguma maneira de obter um valor ajustado ao quadrado R (ou algo equivalente), ou eu teria que tentar calculá-lo de alguma forma?
JRW