非线性回归误差(单梯度矩阵)
Non Linear Regression Error (Single Gradient Matrix)
我以前见过其中一些非常简单的函数,但是我要拟合的函数基本上是 3 个函数的混合
高斯分布(在 x=0 处占优势)
指数(接管 post 高斯)
和一个将值
舍入的常量
从我读到的这个错误的其他例子来看,问题似乎是由错误的初始猜测引起的,但我不知道如何纠正这个问题,或者考虑到我的大小,这是否是实际问题功能。
这是我的代码和我正在查看的数据示例之一。:
Value<-c(163301.080,269704.110,334570.550,409536.530,433021.260,418962.060,349554.460,253987.570,124461.710,140750.480,52612.790,54286.427,26150.025,14631.210,15780.244,8053.618,4402.581,2251.137,2743.511,1707.508,1246.894)
Height<-c(400,300,200,0,-200,-400,-600,-800,-1000,-1000,-1200,-1220,-1300,-1400,-1400,-1500,-1600,-1700,-1700,-1800,-1900)
Framed<-data.frame(Value,Height)
i<-nls(Value~a*exp(-Height^2/(2*b^2))+ c*exp(-d*abs(Height)) + e,
data=Framed,start = list(a=410000,b=5,c=10000,d=5,e=1200))
plot(Value~Height)
summary(i)
感谢您的帮助,现在我又遇到了同样的问题,我在下面使用了您的技术(R noob)之前在 mathematica 中使用了操纵图,我认为我已经相对较好地适应了数据,这是我也在尝试拟合的数据图表(抱歉无法上传,信誉不足)
但是我遇到了同样的问题,这是与我的健康有关还是与近距离的大量可变性有关?
你是对的,这通常是关于蝙蝠起始值的,这就是你的(部分)情况。查看您的数据和您的猜测,很明显出了问题。但在此之前,请注意 Framed
的创建顺序不正确。应该是X Y
,或者:
Framed <- data.frame(Height, Value)
考虑到这一点,请尝试以下操作:
Vals2 <- 410000*exp(-Height^2/(2*5^2)) - 10000*exp(-5*abs(Height)) + 1200
plot(Framed)
lines(Height, Vals2)
你应该得到
这表明你的猜测有多糟糕。玩弄你的功能,很容易看出 b
离得很远。将其更改为 500
,然后:
好多了,但还是放不下。如果您更改其他参数(c
、d
和 e
),您会发现它们似乎不会对数据产生太大影响,或者根本不会影响数据。这可能是因为 a
大得多,而您在第一个学期中有 Height^2
。如果你简化你的函数,并且 运行:
i<-nls(Value~a*exp(-Height^2/(2*b^2)), start = list(a=410000,b=500))
你会找到合适的。这可能是因为随着参数数量的增加,非线性函数变得更难拟合,特别是如果它们之间存在协方差。更少的参数更容易安装。但是,您必须决定是否只能使用 a
和 b
.
但如果你绘制它,它看起来仍然不太好。很明显,您的 Value
在 Height = 0
处没有最大值,就像您的描述和模拟曲线中应该的那样。您的数据似乎有误,因为如果您尝试 Height <- Height+200
以及上述更改,您将得到
> summary(i)
Formula: Value ~ a * exp(-Height^2/(2 * b^2))
Parameters:
Estimate Std. Error t value Pr(>|t|)
a 449820.71 10236.43 43.94 <2e-16 ***
b 496.60 12.54 39.59 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 17790 on 19 degrees of freedom
Number of iterations to convergence: 4
Achieved convergence tolerance: 2.164e-06
现在由您来检查您的数据是否确实发生了偏移,以及您是否可以简化函数。
我以前见过其中一些非常简单的函数,但是我要拟合的函数基本上是 3 个函数的混合
高斯分布(在 x=0 处占优势) 指数(接管 post 高斯) 和一个将值
舍入的常量从我读到的这个错误的其他例子来看,问题似乎是由错误的初始猜测引起的,但我不知道如何纠正这个问题,或者考虑到我的大小,这是否是实际问题功能。
这是我的代码和我正在查看的数据示例之一。:
Value<-c(163301.080,269704.110,334570.550,409536.530,433021.260,418962.060,349554.460,253987.570,124461.710,140750.480,52612.790,54286.427,26150.025,14631.210,15780.244,8053.618,4402.581,2251.137,2743.511,1707.508,1246.894)
Height<-c(400,300,200,0,-200,-400,-600,-800,-1000,-1000,-1200,-1220,-1300,-1400,-1400,-1500,-1600,-1700,-1700,-1800,-1900)
Framed<-data.frame(Value,Height)
i<-nls(Value~a*exp(-Height^2/(2*b^2))+ c*exp(-d*abs(Height)) + e,
data=Framed,start = list(a=410000,b=5,c=10000,d=5,e=1200))
plot(Value~Height)
summary(i)
感谢您的帮助,现在我又遇到了同样的问题,我在下面使用了您的技术(R noob)之前在 mathematica 中使用了操纵图,我认为我已经相对较好地适应了数据,这是我也在尝试拟合的数据图表(抱歉无法上传,信誉不足)
但是我遇到了同样的问题,这是与我的健康有关还是与近距离的大量可变性有关?
你是对的,这通常是关于蝙蝠起始值的,这就是你的(部分)情况。查看您的数据和您的猜测,很明显出了问题。但在此之前,请注意 Framed
的创建顺序不正确。应该是X Y
,或者:
Framed <- data.frame(Height, Value)
考虑到这一点,请尝试以下操作:
Vals2 <- 410000*exp(-Height^2/(2*5^2)) - 10000*exp(-5*abs(Height)) + 1200
plot(Framed)
lines(Height, Vals2)
你应该得到
这表明你的猜测有多糟糕。玩弄你的功能,很容易看出 b
离得很远。将其更改为 500
,然后:
好多了,但还是放不下。如果您更改其他参数(c
、d
和 e
),您会发现它们似乎不会对数据产生太大影响,或者根本不会影响数据。这可能是因为 a
大得多,而您在第一个学期中有 Height^2
。如果你简化你的函数,并且 运行:
i<-nls(Value~a*exp(-Height^2/(2*b^2)), start = list(a=410000,b=500))
你会找到合适的。这可能是因为随着参数数量的增加,非线性函数变得更难拟合,特别是如果它们之间存在协方差。更少的参数更容易安装。但是,您必须决定是否只能使用 a
和 b
.
但如果你绘制它,它看起来仍然不太好。很明显,您的 Value
在 Height = 0
处没有最大值,就像您的描述和模拟曲线中应该的那样。您的数据似乎有误,因为如果您尝试 Height <- Height+200
以及上述更改,您将得到
> summary(i)
Formula: Value ~ a * exp(-Height^2/(2 * b^2))
Parameters:
Estimate Std. Error t value Pr(>|t|)
a 449820.71 10236.43 43.94 <2e-16 ***
b 496.60 12.54 39.59 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 17790 on 19 degrees of freedom
Number of iterations to convergence: 4
Achieved convergence tolerance: 2.164e-06
现在由您来检查您的数据是否确实发生了偏移,以及您是否可以简化函数。