首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算非线性最小二乘拟合的R^2

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

Stack Overflow用户
提问于 2013-01-26 05:35:54
回答 6查看 31.8K关注 0票数 17

假设我有x值、y值和期望的y值f (来自一些非线性的最佳拟合曲线)。

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-01-26 05:37:41

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

代码语言:javascript
运行
复制
x = runif(100)
y = runif(100)
spam = summary(lm(x~y))
> spam$r.squared
[1] 0.0008532386

请注意,r的平方不是为非线性模型定义的,或者至少是非常复杂的quote from R-help

有一个很好的理由,在R中拟合的nls模型不提供r平方-r平方对于一般的nls模型没有意义。

R平方的一种思路是将拟合模型的残差平方和与仅由常数组成的平凡模型的残差平方和进行比较。在处理nls模型时,不能保证这是嵌套模型的比较。如果模型不是嵌套的,那么这种比较就没有太大的意义。

所以答案是,你可能从一开始就不想这么做。

如果您需要同行评审的证据,请参见this article;这并不是说您不能计算R^2值,而是它可能意味着与线性模型情况下不同的东西/具有相同的理想属性。

票数 20
EN

Stack Overflow用户

发布于 2013-01-26 05:43:44

听起来像f是你的预测值。它们与实际值之间的距离除以y的n*方差

所以就像这样

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

只要你的模型合理地接近于线性模型,并且n很大,就应该给你一个准rsquared的值。

票数 10
EN

Stack Overflow用户

发布于 2018-03-14 22:56:41

作为对所提出问题的直接回答(而不是争论R2 /伪R2没有用处),rcompanion包中的nagelkerke函数将报告由McFadden、考克斯和斯内尔以及Nagelkerke提出的非线性最小二乘(nls)模型的各种伪R2值。

代码语言:javascript
运行
复制
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和调整后的nls模型的伪R2值为1- RSS/TSS:

代码语言:javascript
运行
复制
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)

它也是由rcompanion包中的accuracy函数计算出的pseudo R2。基本上,这个R2衡量的是你的适合度比你只画一条水平线通过它们的拟合程度要好多少。如果您的空模型是允许仅拦截模型的模型,则这对于nls模型是有意义的。此外,对于其他非线性模型,它也是有意义的。例如,对于使用严格增加的样条线的scam模型(样条术语中的bs=“mpi”),针对最坏情况(例如,数据严格减少的情况)的拟合模型将是一条平坦的线,因此将导致R2为零。然后,调整后的R2还会惩罚拟合参数具有更高nrs的模型。使用调整后的BIC值已经解决了上面链接的论文的许多批评,http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2892436/ (此外,如果一个人发誓使用信息标准来进行模型选择,那么问题就变成了使用哪一个- R2,BIC,EBIC,AICc,QIC,等等)。

只是在使用

代码语言:javascript
运行
复制
r.sq <- max(cor(y,yfitted),0)^2
adj.r.sq <- 1 - (1 - r.sq) * (n - int.df) / r.df

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

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

代码语言:javascript
运行
复制
1-residual deviance/null deviance

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14530770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档