的行为R2R2在非线性模型中

机器算法验证 r 非线性回归 残差 r平方
2022-03-23 17:29:40

我对R2在非线性模型中。

下面是一些数据和两个双曲线拟合。一种估计两个参数的方法(模型m1),另一种是其中一个参数固定为100,并且仅估计其他参数(模型m2)。模型m1具有更小的残差标准误差(8.012df) 比m2(13.73df) 并且仅仅通过查看它(见下图),比m2(虽然m1本身可以改进)。anova() 报告的残差平方和为128.35为了m1565.80为了m2. 有一个 df 差异,产生 SS 残差差异的 p 值.12.

残差平方和和眼球拟合的差异并不奇怪。

然而,R2m2(约束模型)要好得多(R2通过平方预测值和观测值的相关性来计算(可能不正确)Y)。m1具有观察到的和预测的 Y 值的平方相关.921, 然而m2.995.

R2对这些模型有用吗?可以根据以下标准区分这些模型吗R2(例如,指数模型可能是竞争模型,我们可以检查R2该模型的)。

我对此感到好奇,因为在我的文献角落里,这些类型的模型是基于R2证据,我也不明白约束如何改进R2在这个情况下。

test <- data.frame(x=c(1,10,50,100),y=c(57.7,28.0,17.8,14.8))

m1 <- nls(y ~ a / (1+b*x),test,start=list(a=200,b=.07))
m2 <- nls(y ~ 100 / (1+b*x),test,start=list(b=.07))
coeffm1 <- coefficients(m1)
coeffm2 <- coefficients(m2)
summary(m1)
summary(m2)

anova(m1,m2)

test$m1pred <- fitted(m1)
test$m2pred <- fitted(m2)

cor(test$y,test$m1pred)^2
cor(test$y,test$m2pred)^2

plot(test$x,test$y,ylim=c(0,60))
curve((y=coeffm1["a"] / (1+coeffm1["b"]*x)),add=T)
curve((y=100 / (1+coeffm2["b"]*x)),add=T,lty="dashed")

实线为模型m1,虚线为模型m2。 m1的眼球贴合度优于m2。

实线为模型m1,虚线为模型m2。m1的眼球贴合度优于m2。

1个回答

我决定将我的评论移至答案并进行讨论

稍微扩展一下我的观点:

你认为你计算的方式R2不明智是对的。

残差和任意拟合值之间的高度相关性并不自动意味着拟合良好。事实上,忘记非线性回归,并考虑线性模型。

假设您有两个线性模型。对于第一个模型,飞行意大利面怪物在梦中来到你身边,用他的附肢触动你,并告诉你真实的参数值

yi=9+2xi+ei, (并且误差是独立同分布的N(0,σ2))

第二天,当您向朋友倾诉您的经历时,一位路过的顺势疗法推销员建议您改为

yi=1000+7.3×1014xi+ei

想象一下,在查看数据时,梦想值似乎是正确的(最小二乘估计值非常接近它们),并且σ2估计非常小,因此梦值和 LS 拟合的残差都是微不足道的。

此外,相关性几乎为 1。

现在,数据与来自酒吧推销员模型的拟合值的相关性是什么?

应该很低吧?模型完全错误!它的预测并不比平均值好。

...实际上,它的相关性是完全一样的几乎 1。

如果那是什么R2是的,它作为比较模型的一种方式是没有用的。

这听起来可能会提供一个有用的对象课程,确切地说他们为什么不应该使用这个定义R2比较这些模型。

但是,由于它们具有不同数量的参数,因此简单的残差平方和也不是一个公平的比较。

甚至更正确R2不一定是比较非线性模型的好方法;在非线性领域中,通常没有充分的理由考虑恒定均值模型,即“零”情况。

事实上,即使比较两个线性模型,R2不一定是最好的方法,例如,出于类似的原因,(在我看来)我之前提到的残差平方和的稍微更合理的比较应该避免与具有不同数量参数的模型进行比较。

我认为观察到的 Y 和拟合的 Y 之间的平方相关实际上是标准R2在 OLS 中。

嗯,是的,这是真的R2对于一个简单的普通最小二乘模型,是观察到的和预测的相关性的平方,但是以您想要的方式解释它的能力取决于它是 OLS 的结果例如,如果您断言参数值,您不会更改相关性,但您会完全失去其作为拟合度量的解释。

对您的示例进行编码似乎证实了这一点,并且还表明顺势疗法推销员的 R2 较低。

由于舍入误差和累积数值误差,R中的计算对于销售员来说并不准确;这是一个数学上精确的关系,我们必须小心处理数值。

观察会发生什么:

x <- runif(100,0,10) 
y <- 9 + 2*x + rnorm(100,0,.005) 
cor(y,x)
cor(y,9+2*x)
cor(y,-1000+ 7.3e-4*x)
cor(y,-1000+ 7.3e-7*x)
cor(y,-1000+ 7.3e-10*x)
cor(y,-1000+ 7.3e-14*x)