web-dev-qa-db-ja.com

RでR2(R 2乗)を計算する関数

観測およびモデル化されたデータを含むデータフレームがあり、R2値を計算したいと思います。このために呼び出すことができる関数があると思っていましたが、見つけることができません。私は自分で書いてそれを適用できることを知っていますが、明らかな何かを見逃していますか?みたいなものが欲しい

obs <- 1:5
mod <- c(0.8,2.4,2,3,4.8)
df <- data.frame(obs, mod)

R2 <- rsq(df)
# 0.85
15
Esme_

これを見るには少し統計的な知識が必要です。 2つのベクトル間のRの2乗は、 相関の2乗 です。したがって、次のように機能を定義できます。

_rsq <- function (x, y) cor(x, y) ^ 2
_

Sandipanの答え はまったく同じ結果を返します(次の証明を参照)が、現状では(_$r.squared_が明らかなため)より読みやすくなっています。


統計をしましょう

基本的に、yxに対する線形回帰を近似し、回帰平方和と総平方和の比を計算します。

補題1:回帰_y ~ x_はy - mean(y) ~ x - mean(x)と同等です

lemma 1

補題2:ベータ= cov(x、y)/ var(x)

lemma 2

補題3:R.square = cor(x、y)^ 2

lemma 3


警告

2つの任意のベクトルxy(同じ長さ)の間の2乗は、それらの線形関係の良さの尺度です。考え直してください!! _x + a_と_y + b_の間の2乗Rは、定数シフトabで同じです。したがって、それは「予測の良さ」に関する弱いまたは役に立たない尺度です。代わりにMSEまたはRMSEを使用します。

42-のコメント に同意します:

Rの2乗は、回帰関数に関連付けられた要約関数によって報告されます。しかし、そのような推定値が統計的に正当化される場合のみです。

Rの2乗は(最高ではないが)「適合度」の尺度になります。しかし、サンプル外予測の良さを測定できるという正当化はありません。データをトレーニング部分とテスト部分に分割し、トレーニングモデルに回帰モデルを当てはめると、トレーニング部分で有効なR 2乗値を取得できますが、テスト部分でR 2乗を正当に計算することはできません。 一部の人々はこれをしました 、しかし私はそれに同意しません。

非常に極端な例を次に示します。

_preds <- 1:4/4
actual <- 1:4
_

これらの2つのベクトル間のRの2乗は1です。もちろん、1つはもう1つのベクトルの線形再スケーリングなので、完全な線形関係になります。しかし、predsactualの良い予測だと本当に思いますか??


wordsforthewise への返信

あなたのコメントをありがとう 12 および 詳細の答え

あなたはおそらく手順を誤解したでしょう。 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乗を使用できると誤解しないでください。

33
李哲源

これはなぜですか:

rsq <- function(x, y) summary(lm(y~x))$r.squared
rsq(obs, mod)
#[1] 0.8560185
12
Sandipan Dey

明らかなことではありませんが、caretパッケージには、 ドキュメント に従って「パフォーマンス推定値のベクトル」を計算する関数postResample()があります。 「パフォーマンスの見積もり」は

  • RMSE
  • Rsquared
  • 平均絶対誤差(MAE)

このようなベクトルからアクセスする必要があります

_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の実装を見逃しているか、それを実装することを誰も気にしていないと思う。ほとんどの実装 このような は、一般化線形モデル用です。

6
wordsforthewise

線形モデルの要約を使用することもできます。

summary(lm(obs ~ mod, data=df))$r.squared 
4
Maria

[ 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
1
andrii