17

xy値、および期待されるy値f(非線形の最適曲線から)があるとします。

RでR^2を計算するにはどうすればよいですか?この関数は線形モデルではなく、非線形最小二乗(nls)近似であるため、lm近似ではないことに注意してください。

4

6 に答える 6

20

この関数を使用して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値を計算できないわけではなく、線形モデルの場合と同じことを意味しない/同じ望ましい特性を持っていない可能性があるというだけです。

于 2013-01-25T21:37:41.023 に答える
10

fのような音はあなたの予測値です。したがって、それらから実際の値までの距離をn*分散yで割った値

だから何かのような

1-sum((y-f)^2)/(length(y)*var(y))

モデルが線形モデルにかなり近く、nがかなり大きい限り、準rsquared値が得られるはずです。

于 2013-01-25T21:43:43.917 に答える
5

尋ねられた質問への直接の答えとして(R2 /疑似R2は役に立たないと主張するのではなく)nagelkerke、パッケージ内の関数は、rcompanionMcFadden、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値をnls1-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")を使用する詐欺モデルの場合、最悪のシナリオ(たとえば、データが厳密に減少している場合)に適合したモデルは平坦な線になり、結果として次のようになります。とaccuracyrcompanionnlsR2ゼロの。調整された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を調整します。調整されたバージョン。yyfittedが同じ方向に進む場合、これは通常の線形モデルで報告されるR2との値になります。adjusted R2私にとって、これは少なくとも完全に理にかなっているので、上記の答えが示唆しているように、モデルのpseudo R2値の有用性を完全に拒否することに同意しません。nls

非正規エラー構造の場合(たとえば、非正規エラーでGAMを使用していた場合)、McFadden pseudo R2は次のように定義されます。

1-residual deviance/null deviance

いくつかの有用な議論については、ここここを参照してください。

于 2018-03-14T14:56:40.897 に答える
4

非線形モデルのもう1つの準決定係数は、実際のy値と予測されたy値の間の相関を2乗することです。線形モデルの場合、これは通常の決定係数です。

于 2013-01-25T23:38:28.607 に答える
1

この問題の代わりに、私は次の手順を数回使用しました。

  1. nls関数を使用してデータの近似を計算します
  2. 結果のモデルを使用して予測を行う
  3. モデルによって予測された値に対してデータをトレース(プロット...)します(モデルが良好な場合、ポイントは二等分線の近くにある必要があります)。
  4. 線形回帰のR2を計算します。

皆様のご多幸をお祈り申し上げます。パトリック。

于 2018-01-10T18:18:56.467 に答える
1

パッケージ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

彼らが言うように、それは単なる概算です。

于 2021-07-30T00:55:26.867 に答える