Fonction pour calculer R2 (R-carré) dans la R
J'ai un dataframe avec observées et des données modélisées, et je voudrais calculer la valeur de R2. Je m'attendais à y être une fonction que je pourrais appeler, mais ne pouvez pas en trouver un. Je sais que je peux écrire mon propre et de l'appliquer, mais ai-je raté quelque chose d'évident? Je veux quelque chose comme
obs <- 1:5
mod <- c(0.8,2.4,2,3,4.8)
df <- data.frame(obs, mod)
R2 <- rsq(df)
# 0.85
Et l'inévitable "qu'en est-adjusted R^2?" la question est abordée ici - stats.stackexchange.com/questions/48703/...
Vous devrez peut-être spécifier la façon dont cette "modélisation des données" a été créé. La r.au carré qui est rapporté par les fonctions de synthèse associés aux fonctions de régression. Mais ce n'est que lorsqu'un estiamte est statsitically justifiée.
J'ai plusieurs modèles différents, mais ce n'est pas simplement la sortie d'un modèle de régression comme lm, donc le résumé des fonctions ne fonctionnent pas. Essentiellement, j'ai besoin de pouvoir comparer entre les deux vecteurs (Zheyuan Li suggestion fonctionne parfaitement pour cela)
Vous devrez peut-être spécifier la façon dont cette "modélisation des données" a été créé. La r.au carré qui est rapporté par les fonctions de synthèse associés aux fonctions de régression. Mais ce n'est que lorsqu'un estiamte est statsitically justifiée.
J'ai plusieurs modèles différents, mais ce n'est pas simplement la sortie d'un modèle de régression comme lm, donc le résumé des fonctions ne fonctionnent pas. Essentiellement, j'ai besoin de pouvoir comparer entre les deux vecteurs (Zheyuan Li suggestion fonctionne parfaitement pour cela)
OriginalL'auteur Esme_ | 2016-12-01
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'un peu de connaissances en statistique pour voir cela. R au carré entre les deux vecteurs est juste le carré de leur corrélation. Ainsi, vous pouvez définir vous fonction:
Sandipan réponse vous renvoie exactement le même résultat (voir la suite de la preuve), mais en l'état actuel, il semble plus lisible (en raison de l'évidente
$r.squared
).Faisons les statistiques
Fondamentalement, nous l'ajustement d'une régression linéaire des
y
surx
, et de calculer le ratio de la somme de régression des carrés à la somme totale des carrés.lemme 1: une régression
y ~ x
est équivalent ày - mean(y) ~ x - mean(x)
lemme 2: beta = cov(x, y) /var(x)
lemme 3: R. carré = cor(x, y) ^ 2
Avertissement
R au carré entre deux vecteurs arbitraires
x
ety
(de même longueur) est juste une bonté mesure de leur relation linéaire. Réfléchir à deux fois!! R au carré entrex + a
ety + b
sont identiques pour tout changement constanta
etb
. Donc, c'est un faible, voire inutile de mesure sur la "qualité de la prédiction". Utiliser MSE ou RMSE:Je suis d'accord avec 42-'s commentaire:
R au carré peut être (mais pas le meilleur) mesure de la "qualité de l'ajustement". Mais il n'y a pas de justification qu'il peut mesurer la bonté de l'échantillon de prédiction. Si vous répartir vos données dans la formation et les essais des pièces et de l'ajustement d'un modèle de régression sur la formation, vous pouvez obtenir un valide R au carré de la valeur sur la formation de la partie, mais vous ne pouvez pas légitimement calculer une R au carré sur la partie de test. Certaines personnes ont fait ce, mais je ne suis pas d'accord avec elle.
Ici est très extrême exemple:
Le R au carré entre ces deux vecteurs est égal à 1. Oui bien sûr, on est juste un linéaire de changement d'échelle de l'autre de sorte qu'ils ont une parfaite relation linéaire. Mais, pensez-vous vraiment que le
preds
est une bonne prédiction suractual
??En réponse à wordsforthewise
Merci pour vos commentaires Un, Deux et votre réponse de détails.
Vous avez probablement mal compris la procédure. Étant donnés deux vecteurs
x
ety
, nous avons d'abord ajustement d'une droite de régressiony ~ x
puis calculer la somme de régression des carrés et la somme totale des carrés. Il semble que vous ignorez cette régression de l'étape et aller directement à la somme des carrés de calcul. Ce qui est faux, puisque la partition de la somme des carrés ne tient pas et vous ne pouvez pas calculer R au carré dans une manière cohérente.Comme vous l'avez démontré, c'est juste un moyen pour le calcul de R au carré:
Mais il y a un autre:
Aussi, votre formule peut donner une valeur négative (la bonne valeur doit être 1 comme mentionné ci-dessus dans le Avertissement section).
Dernière remarque
Je n'avais jamais prévu que cette réponse pourrait éventuellement être si long, quand j'ai posté ma première réponse il y a 2 ans. Toutefois, compte tenu de la forte vues de ce thread, je me sens obligé d'ajouter plus de détails statistiques et des discussions. Je ne veux pas tromper les gens que juste parce qu'ils peuvent calculer un R au carré si facilement, ils peuvent utiliser R au carré partout.
La réponse de la corrélation ^2 et l'approche conventionnelle 1 - ESS/SST n'est pas la même. Dans l'exemple j'utilise, j'ai eu
0.756388
de la corr^2 et0.7531449
de la normale r^2 équation. Petite différence, mais encore, il serait peut-modèle pour l'hyper-paramètre de sélection, etc.il serait peut - , pas de modèle
Dans la régression linéaire multiple, R-carré est le carré de la corrélation entre la réponse et vecteur de valeurs ajustées. Essayez
model <- lm(trees); cor(trees[[1]], model$fitted.values) ^ 2
. A comparer avecsummary(model)$r.squared
Merci pour la réponse dans votre réponse, mais je suis toujours confus pourquoi nous ne pouvons pas aller directement à la RSS de calcul. Je vais méditer sur la partition SS pendant un certain temps. Aussi, je ne vois pas de raison R2 ne peut pas être négatif-n'est-ce pas effectivement dire que nos prévisions sont de pire que d'utiliser la valeur moyenne de la cible pour predcitions?
OriginalL'auteur 李哲源
Pourquoi pas ceci:
OriginalL'auteur Sandipan Dey
Il n'est pas quelque chose d'évident, mais le
caret
paquet a une fonctionpostResample()
qui va calculer "Un vecteur de performance des estimations", selon le la documentation. Les "estimations de performances" sontet doivent être accessibles à partir du vecteur comme ce
Cependant, c'est à l'aide de la corrélation au carré approximation de r-squared comme mentionné dans une autre réponse. Je ne sais pas pourquoi Max Kuhn n'est pas d'utiliser le classique 1-ESS/SST.
caret
a aussi unR2()
méthode, bien qu'il soit difficile de trouver dans la documentation.La façon de mettre en œuvre la normale coefficient de détermination de l'équation est:
Pas trop mal pour le code à la main bien sûr, mais pourquoi n'est-il pas une fonction dans un langage principalement fait pour les statistiques? Je pense que je doit être à côté de la mise en œuvre de la R^2 quelque part ou personne ne se soucie assez sur elle pour la mettre en œuvre. La plupart des implémentations, comme celui-ci, semblent être pour les modèles linéaires généralisés.
OriginalL'auteur wordsforthewise
Vous pouvez également utiliser le résumé pour les modèles linéaires:
OriginalL'auteur Maria
Ici est la solution la plus simple basé sur [https://en.wikipedia.org/wiki/Coefficient_of_determination%5D
OriginalL'auteur andrii