Comment traduire les résultats de lm () en une équation?


29

Nous pouvons utiliser lm()pour prédire une valeur, mais nous avons toujours besoin de l'équation de la formule de résultat dans certains cas. Par exemple, ajoutez l'équation aux graphiques.


2
Pouvez-vous reformuler votre question ou ajouter quelques détails? Je connais assez bien R, lmet les modèles linéaires en général, mais ce n'est pas du tout clair ce que vous voulez exactement. Pouvez-vous donner un exemple ou quelque chose à clarifier? Est-ce pour un sujet?
Glen_b -Reinstate Monica

2
Je suppose que vous voulez les coefficients de la formule de régression linéaire. Essayez d'appeler coef()l' lmobjet ajusté , comme dans:mod <- lm(y ~ x); coef(mod)
Jake Westfall

Si vous tapez, lm(y~x)$callil vous indique la formule y ~ x. Si vous voulez dire quelque chose de différent, vous devez être plus précis.
Glen_b -Reinstate Monica


Réponses:


30

Considérez cet exemple:

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 

La question, je suppose, est de savoir comment calculer l'équation de régression à partir de la sortie récapitulative de R. Algébriquement, l'équation d'un modèle de régression simple est la suivante

y^i=β^0+β^1xi+ε^iwhere εN(0, σ^2)
Nous avons juste besoin de cartographier lasummary.lm()sortie à ces termes. En être témoin:

  • β^0Estimate(Intercept)-0.00761
  • β^1Estimatex0.09156
  • σ^Residual standard error0.8155


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


2
lmy^=0.00761+0.09156x

6

Si vous voulez prédire les scores à l'aide de votre équation de régression résultante, vous pouvez construire l'équation à la main en tapant summary(fit)(si votre analyse de régression est stockée dans une variable appelée fit, par exemple), et en regardant les estimations pour chaque coefficient inclus dans votre modèle.

y=β0+β1x+ϵβ0β1y^=0.5+1.6x

Cependant, c'est la voie difficile. R a une fonction intégrée, predict()que vous pouvez utiliser pour calculer automatiquement les valeurs prédites en fonction d'un modèle pour n'importe quel ensemble de données. Par exemple:, predict(fit, newdata=data)si les scores x que vous souhaitez utiliser pour prédire les scores y sont stockés dans la variable data. (Notez que pour voir les scores prévus pour l'échantillon sur lequel votre régression a été effectuée, vous pouvez simplement taper fit$fittedou fitted(fit); ceux-ci vous donneront les valeurs prédites, alias ajustées.)


0

Si vous souhaitez afficher l'équation, comme couper / coller dans un document, mais ne voulez pas vous embêter avec la mise en place de toute l'équation:

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"

0

S'appuyant sur la réponse de keithpjolley, cela remplace les signes «+» utilisés dans le séparateur par le signe réel du coefficient.

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

produit le résultat

[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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.