计算非线性最小二乘拟合的R ^ 2

Cod*_*Guy 15 r

假设我有x值,y值和预期y值f(来自某些非线性最佳拟合曲线).

如何在R中计算R ^ 2?请注意,此函数不是线性模型,而是非线性最小二乘(nls)拟合,因此lm不合适.

Pau*_*tra 17

您只需使用该lm函数拟合线性模型:

x = runif(100)
y = runif(100)
spam = summary(lm(x~y))
> spam$r.squared
[1] 0.0008532386
Run Code Online (Sandbox Code Playgroud)

请注意,r平方不是针对非线性模型定义的,或者至少非常棘手,引自R-help:

有一个很好的理由,一个适合R的nls模型不能提供r平方 - 对于一般的nls模型,r平方没有意义.

考虑r平方的一种方法是将拟合模型的残差平方和与仅由常数组成的平凡模型的残差平方和进行比较.在处理nls模型时,您不能保证这是嵌套模型的比较.如果模型没有嵌套,则这种比较并不十分有意义.

所以答案是你可能首先不想这样做.

如果您需要经过同行评审的证据,请参阅此文章 ; 并不是你不能计算R ^ 2值,只是它可能不是意味着相同的东西/具有与线性模型情况相同的理想属性.


Set*_*eth 10

听起来像f是你的预测值.因此,它们与实际值之间的距离由y*的方差分开

所以像

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

应该给你一个准的值,只要你的模型合理地接近线性模型并且n非常大.


Gre*_*now 5

非线性模型的另一个准 R 平方是对实际 y 值和预测 y 值之间的相关性进行平方。对于线性模型,这是常规的 R 平方。

  • @BenBolker,我的除以 sd(y-hat) 和 sd(y),其中 Seth 的答案除以 sd(y) 两次 (var(y)),所以当 y-hat 和 y 的变异性相似时(高 r-平方)它们应该非常相似,但可能会有更多差异。如果由于某种奇怪的原因,拟合模型与真实关系相反(模型说 y 随 x 增加,而事实是它随 x 减少),那么 Seth 的答案将给出负 R 平方,而我的答案将给出接近 1 的值,这在这种奇怪的情况下更无用的是另一个争论。 (3认同)

Tom*_*ers 5

作为对所问问题的直接回答(而不是争论 R2/伪 R2 没有用)nagelkerkercompanion包中的函数将报告 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)
Run Code Online (Sandbox Code Playgroud)

soilphysics软件包还将 Efron 的伪 R2 和调整后的nls模型的伪 R2 值报告为 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)
Run Code Online (Sandbox Code Playgroud)

这也是pseudo R2由包中的accuracy函数计算出来的rcompanion。基本上,这个 R2 衡量的是你的合身程度比你只画一条水平线穿过它们好多少。nls如果您的空模型是允许仅截取模型的模型,则这对于模型来说是有意义的。同样对于特定的其他非线性模型,它也有意义。例如,对于使用严格增加的样条(样条项中的 bs="mpi")的骗局模型,最坏可能情况(例如,您的数据严格减少)的拟合模型将是一条平坦线,因此会导致一个R2零。调整后的 R2 也会惩罚具有更高拟合参数 nrs 的模型。使用调整后的 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
Run Code Online (Sandbox Code Playgroud)

我认为如果你有正常的高斯误差也有意义 - 即观察到的和拟合的 y 之间的相关性(裁剪为零,因此负关系意味着零预测能力)平方,然后调整拟合参数的 nr调整后的版本。如果yyfitted朝同一方向前进,这将是常规线性模型报告的R2adjusted R2值。对我来说,这至少是完全合理的,所以我不同意完全拒绝模型pseudo R2值的有用性,nls因为上面的答案似乎暗示了这一点。

对于非正常错误结构(例如,如果您使用具有非正常错误的 GAM),McFadden pseudo R2其定义类似于

1-residual deviance/null deviance
Run Code Online (Sandbox Code Playgroud)

有关一些有用的讨论,请参阅此处此处