値x
、y
値、および期待されるy値f
(非線形の最適曲線から)があるとします。
RでR^2を計算するにはどうすればよいですか?この関数は線形モデルではなく、非線形最小二乗(nls
)近似であるため、lm
近似ではないことに注意してください。
値x
、y
値、および期待されるy値f
(非線形の最適曲線から)があるとします。
RでR^2を計算するにはどうすればよいですか?この関数は線形モデルではなく、非線形最小二乗(nls
)近似であるため、lm
近似ではないことに注意してください。
この関数を使用してlm
、線形モデルを近似します。
x = runif(100)
y = runif(100)
spam = summary(lm(x~y))
> spam$r.squared
[1] 0.0008532386
決定係数は非線形モデルに対して定義されていないことに注意してください。少なくとも非常に注意が必要です。R-helpから引用してください。
Rに適合するnlsモデルがr-squaredを提供しないのには十分な理由があります-r-squaredは一般的なnlsモデルには意味がありません。
決定係数の考え方の1つは、近似モデルの残差平方和を、定数のみで構成される自明なモデルの残差平方和と比較することです。nlsモデルを扱う場合、これがネストされたモデルの比較であることを保証することはできません。モデルがネストされていない場合、この比較はそれほど意味がありません。
したがって、答えは、おそらく最初からこれを実行したくないということです。
査読済みの証拠が必要な場合は、たとえばこの記事を参照してください。R ^ 2値を計算できないわけではなく、線形モデルの場合と同じことを意味しない/同じ望ましい特性を持っていない可能性があるというだけです。
fのような音はあなたの予測値です。したがって、それらから実際の値までの距離をn*分散yで割った値
だから何かのような
1-sum((y-f)^2)/(length(y)*var(y))
モデルが線形モデルにかなり近く、nがかなり大きい限り、準rsquared値が得られるはずです。
尋ねられた質問への直接の答えとして(R2 /疑似R2は役に立たないと主張するのではなく)nagelkerke
、パッケージ内の関数は、rcompanion
McFadden、Cox、およびSnellによって提案された非線形最小二乗(nls)モデルのさまざまな疑似R2値を報告します。およびNagelkerke、例えば
require(nls)
data(BrendonSmall)
quadplat = function(x, a, b, clx) {
ifelse(x < clx, a + b * x + (-0.5*b/clx) * x * x,
a + b * clx + (-0.5*b/clx) * clx * clx)}
model = nls(Sodium ~ quadplat(Calories, a, b, clx),
data = BrendonSmall,
start = list(a = 519,
b = 0.359,
clx = 2304))
nullfunct = function(x, m){m}
null.model = nls(Sodium ~ nullfunct(Calories, m),
data = BrendonSmall,
start = list(m = 1346))
nagelkerke(model, null=null.model)
このsoilphysics
パッケージは、モデルのEfronの疑似R2および調整済み疑似R2値をnls
1-RSS/TSSとして報告します。
pred <- predict(model)
n <- length(pred)
res <- resid(model)
w <- weights(model)
if (is.null(w)) w <- rep(1, n)
rss <- sum(w * res ^ 2)
resp <- pred + res
center <- weighted.mean(resp, w)
r.df <- summary(model)$df[2]
int.df <- 1
tss <- sum(w * (resp - center)^2)
r.sq <- 1 - rss/tss
adj.r.sq <- 1 - (1 - r.sq) * (n - int.df) / r.df
out <- list(pseudo.R.squared = r.sq,
adj.R.squared = adj.r.sq)
これは、パッケージ内の関数pseudo R2
によって計算されたものでもあります。基本的に、このR2は、フラットな水平線を引くだけの場合と比較して、フィット感がどれだけ良くなるかを測定します。nullモデルが切片のみのモデルを許可するモデルである場合、これはモデルにとって意味があります。また、特定の他の非線形モデルの場合、それは理にかなっています。たとえば、厳密に増加するスプライン(スプライン用語ではbs = "mpi")を使用する詐欺モデルの場合、最悪のシナリオ(たとえば、データが厳密に減少している場合)に適合したモデルは平坦な線になり、結果として次のようになります。とaccuracy
rcompanion
nls
R2
ゼロの。調整されたR2は、適合パラメーターの数が多いモデルにもペナルティを課します。調整されたR2値を使用すると、上記のリンク先の論文に対する多くの批判にすでに対処できます。http: //www.ncbi.nlm.nih.gov/pmc/articles/PMC2892436/モデルの選択問題は、どちらを使用するか(AIC、BIC、EBIC、AICc、QICなど)になります。
使用するだけ
r.sq <- max(cor(y,yfitted),0)^2
adj.r.sq <- 1 - (1 - r.sq) * (n - int.df) / r.df
正規ガウス誤差がある場合にも意味があると思います。つまり、観測されたyと近似されたy(負の関係はゼロの予測力を意味するようにゼロでクリップされます)の相関を2乗し、近似されたパラメーターのnrを調整します。調整されたバージョン。y
とyfitted
が同じ方向に進む場合、これは通常の線形モデルで報告されるR2
との値になります。adjusted R2
私にとって、これは少なくとも完全に理にかなっているので、上記の答えが示唆しているように、モデルのpseudo R2
値の有用性を完全に拒否することに同意しません。nls
非正規エラー構造の場合(たとえば、非正規エラーでGAMを使用していた場合)、McFadden pseudo R2
は次のように定義されます。
1-residual deviance/null deviance
非線形モデルのもう1つの準決定係数は、実際のy値と予測されたy値の間の相関を2乗することです。線形モデルの場合、これは通常の決定係数です。
この問題の代わりに、私は次の手順を数回使用しました。
皆様のご多幸をお祈り申し上げます。パトリック。
modelr
付きmodelr::rsquare(nls_model, data)
nls_model <- nls(mpg ~ a / wt + b, data = mtcars, start = list(a = 40, b = 4))
modelr::rsquare(nls_model, mtcars)
# 0.794
rcompanion
これにより、Tomがリソースから説明した長い方法と本質的に同じ結果が得られます。
nagelkerke
機能の長い道のりnullfunct <- function(x, m){m}
null_model <- nls(mpg ~ nullfunct(wt, m),
data = mtcars,
start = list(m = mean(mtcars$mpg)))
nagelkerke(nls_model, null_model)[2]
# 0.794 or 0.796
lm(mpg ~ predict(nls_model), data = mtcars) %>% broom::glance()
# 0.795
彼らが言うように、それは単なる概算です。