観測およびモデル化されたデータを含むデータフレームがあり、R2値を計算したいと思います。このために呼び出すことができる関数があると思っていましたが、見つけることができません。私は自分で書いてそれを適用できることを知っていますが、明らかな何かを見逃していますか?みたいなものが欲しい
obs <- 1:5
mod <- c(0.8,2.4,2,3,4.8)
df <- data.frame(obs, mod)
R2 <- rsq(df)
# 0.85
これを見るには少し統計的な知識が必要です。 2つのベクトル間のRの2乗は、 相関の2乗 です。したがって、次のように機能を定義できます。
_rsq <- function (x, y) cor(x, y) ^ 2
_
Sandipanの答え はまったく同じ結果を返します(次の証明を参照)が、現状では(_$r.squared
_が明らかなため)より読みやすくなっています。
基本的に、y
のx
に対する線形回帰を近似し、回帰平方和と総平方和の比を計算します。
補題1:回帰_y ~ x
_はy - mean(y) ~ x - mean(x)
と同等です
補題2:ベータ= cov(x、y)/ var(x)
補題3:R.square = cor(x、y)^ 2
2つの任意のベクトルx
とy
(同じ長さ)の間の2乗は、それらの線形関係の良さの尺度です。考え直してください!! _x + a
_と_y + b
_の間の2乗Rは、定数シフトa
とb
で同じです。したがって、それは「予測の良さ」に関する弱いまたは役に立たない尺度です。代わりにMSEまたはRMSEを使用します。
42-のコメント に同意します:
Rの2乗は、回帰関数に関連付けられた要約関数によって報告されます。しかし、そのような推定値が統計的に正当化される場合のみです。
Rの2乗は(最高ではないが)「適合度」の尺度になります。しかし、サンプル外予測の良さを測定できるという正当化はありません。データをトレーニング部分とテスト部分に分割し、トレーニングモデルに回帰モデルを当てはめると、トレーニング部分で有効なR 2乗値を取得できますが、テスト部分でR 2乗を正当に計算することはできません。 一部の人々はこれをしました 、しかし私はそれに同意しません。
非常に極端な例を次に示します。
_preds <- 1:4/4
actual <- 1:4
_
これらの2つのベクトル間のRの2乗は1です。もちろん、1つはもう1つのベクトルの線形再スケーリングなので、完全な線形関係になります。しかし、preds
はactual
の良い予測だと本当に思いますか??
あなたのコメントをありがとう 1 、 2 および 詳細の答え 。
あなたはおそらく手順を誤解したでしょう。 2つのベクトルx
およびy
が与えられた場合、最初に回帰線_y ~ x
_を当てはめ、次に回帰平方和と総平方和を計算します。この回帰ステップをスキップして、二乗和の計算に直行するようです。 平方和のパーティション が成り立たず、一貫した方法でRの2乗を計算できないため、これは偽です。
既に説明したように、これはRの2乗を計算するための1つの方法にすぎません。
_preds <- c(1, 2, 3)
actual <- c(2, 2, 4)
rss <- sum((preds - actual) ^ 2) ## residual sum of squares
tss <- sum((actual - mean(actual)) ^ 2) ## total sum of squares
rsq <- 1 - rss/tss
#[1] 0.25
_
しかし、別のものがあります:
_regss <- sum((preds - mean(preds)) ^ 2) ## regression sum of squares
regss / tss
#[1] 0.75
_
また、式は負の値を与えることができます(上記のWarningセクションで述べたように、適切な値は1でなければなりません)。
_preds <- 1:4 / 4
actual <- 1:4
rss <- sum((preds - actual) ^ 2) ## residual sum of squares
tss <- sum((actual - mean(actual)) ^ 2) ## total sum of squares
rsq <- 1 - rss/tss
#[1] -2.375
_
2年前に最初の回答を投稿したとき、この回答が最終的にそれほど長くなるとは思っていませんでした。ただし、このスレッドの高い評価を考えると、統計の詳細と議論を追加する必要があります。簡単にRの2乗を計算できるからといって、どこでもRの2乗を使用できると誤解しないでください。
これはなぜですか:
rsq <- function(x, y) summary(lm(y~x))$r.squared
rsq(obs, mod)
#[1] 0.8560185
明らかなことではありませんが、caret
パッケージには、 ドキュメント に従って「パフォーマンス推定値のベクトル」を計算する関数postResample()
があります。 「パフォーマンスの見積もり」は
このようなベクトルからアクセスする必要があります
_library(caret)
vect1 <- c(1, 2, 3)
vect2 <- c(3, 2, 2)
res <- caret::postResample(vect1, vect2)
rsq <- res[2]
_
ただし、これは別の回答で述べたように、r 2乗の相関2乗近似を使用しています。 Max Kuhnが従来の1-SSE/SSTを使用しなかった理由がわかりません。
caret
にはR2()
メソッドもありますが、ドキュメントで見つけるのは困難です。
通常の 決定係数の係数 を実装する方法は次のとおりです。
_preds <- c(1, 2, 3)
actual <- c(2, 2, 4)
rss <- sum((preds - actual) ^ 2)
tss <- sum((actual - mean(actual)) ^ 2)
rsq <- 1 - rss/tss
_
もちろん、手作業でコーディングするのも悪くありませんが、主に統計用に作られた言語には、なぜ機能がないのでしょうか?どこかでR ^ 2の実装を見逃しているか、それを実装することを誰も気にしていないと思う。ほとんどの実装 このような は、一般化線形モデル用です。
線形モデルの要約を使用することもできます。
summary(lm(obs ~ mod, data=df))$r.squared
[ https://en.wikipedia.org/wiki/Coefficient_of_determination] に基づいた最も簡単なソリューションを次に示します。
# 1. 'Actual' and 'Predicted' data
df <- data.frame(
y_actual = c(1:5),
y_predicted = c(0.8, 2.4, 2, 3, 4.8))
# 2. R2 Score components
# 2.1. Average of actual data
avr_y_actual <- mean(df$y_actual)
# 2.2. Total sum of squares
ss_total <- sum((df$y_actual - avr_y_actual)^2)
# 2.3. Regression sum of squares
ss_regression <- sum((df$y_predicted - avr_y_actual)^2)
# 2.4. Residual sum of squares
ss_residuals <- sum((df$y_actual - df$y_predicted)^2)
# 3. R2 Score
r2 <- 1 - ss_residuals / ss_total