假设我有x
值、y
值和期望的y值f
(来自一些非线性的最佳拟合曲线)。
如何在R中计算R^2?请注意,此函数不是线性模型,而是非线性最小二乘(nls
)拟合,因此不是lm
拟合。
发布于 2013-01-25 21:37:41
您只需使用lm
函数来拟合线性模型:
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值,而是它可能意味着与线性模型情况下不同的东西/具有相同的理想属性。
发布于 2013-01-25 21:43:44
听起来像f是你的预测值。它们与实际值之间的距离除以y的n*方差
所以就像这样
1-sum((y-f)^2)/(length(y)*var(y))
只要你的模型合理地接近于线性模型,并且n很大,就应该给你一个准rsquared的值。
发布于 2018-03-14 14:56:41
作为对所提出问题的直接回答(而不是争论R2 /伪R2没有用处),rcompanion
包中的nagelkerke
函数将报告由McFadden、考克斯和斯内尔以及Nagelkerke提出的非线性最小二乘(nls)模型的各种伪R2值。
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:
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,等等)。
只是在使用
r.sq <- max(cor(y,yfitted),0)^2
adj.r.sq <- 1 - (1 - r.sq) * (n - int.df) / r.df
我认为如果你有正常的高斯误差也是有意义的-即观察值和拟合y之间的相关性(在零处修剪,因此负关系将意味着零预测能力)的平方,然后在调整后的版本中针对拟合参数的nr进行调整。如果y
和yfitted
方向相同,则这将是常规线性模型报告的R2
和adjusted R2
值。对我来说,这至少是非常有意义的,所以我不同意完全拒绝nls
模型的pseudo R2
值的有用性,因为上面的答案似乎暗示了这一点。
对于非正常错误结构(例如,如果您使用具有非正常错误的GAM ),McFadden pseudo R2
类似地定义为
1-residual deviance/null deviance
https://stackoverflow.com/questions/14530770
复制相似问题