Como traduzir os resultados de lm () para uma equação?

29

Podemos usar lm()para prever um valor, mas ainda precisamos da equação da fórmula do resultado em alguns casos. Por exemplo, adicione a equação aos gráficos.

user27736
fonte
2
Você pode reformular sua pergunta ou adicionar alguns detalhes? Eu estou familiarizado com R lme com modelos lineares de maneira mais geral, mas não está claro o que exatamente você deseja. Você pode dar um exemplo ou algo a esclarecer? Isso é para algum assunto?
Glen_b -Reinstala Monica
2
Eu acho que você quer os coeficientes da fórmula de regressão linear. Tente chamar coef()no equipada lmobjeto, como em:mod <- lm(y ~ x); coef(mod)
Jake Westfall
Se você digitar lm(y~x)$call, informará a fórmula y ~ x. Se você quer dizer algo diferente disso, precisa ser mais específico.
Glen_b -Reinstate Monica

Respostas:

30

Considere este exemplo:

set.seed(5)            # this line will allow you to run these commands on your
                       # own computer & get *exactly* the same output
x = rnorm(50)
y = rnorm(50)

fit = lm(y~x)
summary(fit)
# Call:
# lm(formula = y ~ x)
# 
# Residuals:
#      Min       1Q   Median       3Q      Max 
# -2.04003 -0.43414 -0.04609  0.50807  2.48728 
# 
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)
# (Intercept) -0.00761    0.11554  -0.066    0.948
# x            0.09156    0.10901   0.840    0.405
# 
# Residual standard error: 0.8155 on 48 degrees of freedom
# Multiple R-squared: 0.01449,  Adjusted R-squared: -0.006046 
# F-statistic: 0.7055 on 1 and 48 DF,  p-value: 0.4051 

A questão, suponho, é como descobrir a equação de regressão a partir da saída sumária de R. Algebricamente, a equação para um modelo de regressão simples é: Nós apenas precisamos mapear a saída para esses termos. A saber:

y^i=β^0+β^1xi+ε^iwhere εN(0, σ^2)
summary.lm()

  • β^0 é o Estimatevalor na (Intercept)linha (especificamente -0.00761)
  • β^1 é o Estimatevalor na xlinha (especificamente 0.09156)
  • σ^ é o Residual standard error(especificamente 0.8155)

Inserindo esses rendimentos em cima: Para uma mais completa visão geral, você pode querer ler este tópico: Interpretação de lm de R () de saída .

y^i=0.00761 + 0.09156xi + ε^iwhere εN(0, 0.81552)

- Reinstate Monica
fonte
2
Dada a menção do OP de um desejo de colocar equações nos gráficos, estive pensando se eles realmente querem que uma função a saída lme produza uma expressão de caractere como " " adequado para tarefa de plotagem (daí minha repetida chamada para esclarecer o que eles queriam - o que não foi feito, infelizmente). y^=0.00761+0.09156x
Glen_b -Reinstate Monica
6

Se o que você deseja é prever pontuações usando sua equação de regressão resultante, você pode construir a equação manualmente digitando summary(fit)(se sua análise de regressão estiver armazenada em uma variável chamada fit, por exemplo) e observando as estimativas para cada coeficiente incluído em seu modelo.

Por exemplo, se você tiver uma regressão simples do tipo e obter uma estimativa da interceptação ( ) de +0,5 e uma estimativa do efeito de x em y ( ) de +1,6, você preveria a pontuação y de um indivíduo a partir da pontuação x calculando: .β 0 β 1 y = 0,5 + 1,6 xy=β0+β1x+ϵβ0β1y^=0.5+1.6x

No entanto, este é o caminho difícil. R possui uma função interna, predict()que você pode usar para calcular automaticamente os valores previstos, com base em um modelo para qualquer conjunto de dados. Por exemplo: predict(fit, newdata=data)se as pontuações x que você deseja usar para prever as pontuações y forem armazenadas na variável data. (Observe que, para ver as pontuações previstas para a amostra em que sua regressão foi realizada, você pode simplesmente digitar fit$fittedou fitted(fit); elas fornecerão os valores previstos, também ajustados).

Patrick Coulombe
fonte
0

Se você deseja mostrar a equação, gostaria de recortar / colar em um documento, mas não quer se preocupar em montar toda a equação:

R> library(MASS)
R> crime.lm <- lm(y~., UScrime)
R> cc <- crime.lm$coefficients
R> (eqn <- paste("Y =", paste(round(cc[1],2), paste(round(cc[-1],2), names(cc[-1]), sep=" * ", collapse=" + "), sep=" + "), "+ e"))
[1] "Y = -5984.29 + 8.78 * M + -3.8 * So + 18.83 * Ed + 19.28 * Po1 + -10.94 * Po2 + -0.66 * LF + 1.74 * M.F + -0.73 * Pop + 0.42 * NW + -5.83 * U1 + 16.78 * U2 + 0.96 * GDP + 7.07 * Ineq + -4855.27 * Prob + -3.48 * Time + e"
keithpjolley
fonte
0

Com base na resposta de keithpjolley, isso substitui os sinais '+' usados ​​no separador pelo sinal real do coeficiente.

modelcrime <- lm(y~., UScrime)
modelcrime_coeff <- modelcrime$coefficients
modelcrime_coeff_sign <- sign(modelcrime_coeff)
modelcrime_coeff_prefix <- case_when(modelcrime_coeff_sign == -1 ~ " - ",
                                     modelcrime_coeff_sign == 1 ~ " + ",
                                     modelcrime_coeff_sign == 0 ~ " + ")
modelcrime_eqn <- paste("y =", paste(if_else(modelcrime_coeff[1]<0, "- ", ""),
                                         abs(round(modelcrime_coeff[1],3)),
                                     paste(modelcrime_coeff_prefix[-1],
                                           abs(round(modelcrime_coeff[-1],3)),
                                           " * ",
                                           names(modelcrime_coeff[-1]),
                                           sep = "", collapse = ""),
                                     sep = ""))
modelcrime_eqn

produz o resultado

[1] "y = - 5984.288 + 8.783 * M - 3.803 * So + 18.832 * Ed + 19.28 * Po1 - 10.942 * Po2 - 0.664 * LF + 1.741 * M.F - 0.733 * Pop + 0.42 * NW - 5.827 * U1 + 16.78 * U2 + 0.962 * GDP + 7.067 * Ineq - 4855.266 * Prob - 3.479 * Time"
David Fong
fonte