- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将两部分线拟合到数据。
以下是一些示例数据:
x<-c(0.00101959664756622, 0.001929220749155, 0.00165657261751726,
0.00182514724375389, 0.00161532360585458, 0.00126991061099209,
0.00149545009309177, 0.000816386510029308, 0.00164402569283353,
0.00128029006251656, 0.00206892841921455, 0.00132378793976235,
0.000953143467154676, 0.00272964503695939, 0.00169743839571702,
0.00286411493120396, 0.0016464862337286, 0.00155672067449593,
0.000878271561566836, 0.00195872573138819, 0.00255412836538339,
0.00126212428137799, 0.00106206607962734, 0.00169140916371657,
0.000858015581562961, 0.00191955159274793, 0.00243104345247067,
0.000871042201994687, 0.00229814264111745, 0.00226756341241083)
y<-c(1.31893118849162, 0.105150790530179, 0.412732029152914, 0.25589805483046,
0.467147868109498, 0.983984462069833, 0.640007862668818, 1.51429617241365,
0.439777145282391, 0.925550163462951, -0.0555942758921906, 0.870117027565708,
1.38032147826294, -0.96757052387814, 0.346370836378525, -1.08032147826294,
0.426215616848312, 0.55151485221263, 1.41306889485598, 0.0803478641720901,
-0.86654892295057, 1.00422341998656, 1.26214517662281, 0.359512373951839,
1.4835398594013, 0.154967053938309, -0.680501679226447, 1.44740598234453,
-0.512732029152914, -0.359512373951839)
我希望能够定义最合适的两部分线(所示为手绘示例)
然后我定义一个分段函数,它应该找到一个两部分线性函数。该定义基于两条线的梯度及其相互截距,这应该完全定义线。
# A=gradient of first line segment
# B=gradient of second line segment
# Cx=inflection point x coord
# Cy=inflexion point y coord
out_model <- nls(y ~ I(x <= Cx)*Cy-A*(Cx-x)+I(x > Cx)*Cy+B*(x),
data = data.frame(x,y),
start = c(A=-500,B=-500,Cx=0.0001,Cy=-1.5) )
但是我收到错误:
Error in nls(y ~ I(x <= Cx) * Cy - A * (Cx - x) + I(x > Cx) * Cy + B * : singular gradient
我从Finding a curve to match data得到了基本方法
有什么想法我哪里出错了吗?
最佳答案
我没有一个优雅的答案,但我确实有一个答案。
(请参阅下面的编辑以获得更优雅的答案)
如果Cx
足够小,以至于没有数据点可以容纳A
和Cy
,或者如果Cx
足够大,以至于没有数据点可以容纳 B
和 Cy
,QR 分解矩阵将是奇异的,因为 会有许多不同的值Cx
、A
和 Cy
或 Cx
、B
和 Cy
分别将同样适合数据。
我通过阻止安装Cx
来测试这一点。如果我将 Cx
修复为(例如)Cx = Mean(x)
,nls()
可以毫无困难地解决问题:
nls(y ~ ifelse(x < mean(x),ya+A*x,yb+B*x),
data = data.frame(x,y),
start = c(A=-1000,B=-1000,ya=3,yb=0))
...给出:
Nonlinear regression model
model: y ~ ifelse(x < mean(x), ya + A * x, yb + B * x)
data: data.frame(x, y)
A B ya yb
-1325.537 -1335.918 2.628 2.652
residual sum-of-squares: 0.06614
Number of iterations to convergence: 1
Achieved convergence tolerance: 2.294e-08
这让我想到,如果我转换 Cx
使其永远不会超出范围 [min(x),max(x)]
,那可能解决这个问题。事实上,我希望至少有三个数据点可用于拟合“A”线和“B”线,因此 Cx 必须位于 的第三低值和第三高值之间x
。使用 atan()
函数和适当的算术让我将范围 [-inf,+inf]
映射到 [0,1]
,所以我得到了代码:
trans <- function(x) 0.5+atan(x)/pi
xs <- sort(x)
xlo <- xs[3]
xhi <- xs[length(xs)-2]
nls(y ~ ifelse(x < xlo+(xhi-xlo)*trans(f),ya+A*x,yb+B*x),
data = data.frame(x,y),
start = c(A=-1000,B=-1000,ya=3,yb=0,f=0))
但是不幸的是,我仍然从这段代码中得到初始参数处的奇异梯度矩阵
错误,因此问题仍然是过度参数化的。正如 @Henrik 所建议的,双线性拟合和单线性拟合之间的差异对于这些数据来说并不大。
不过,我仍然可以获得双线性拟合的答案。由于 nls()
解决了 Cx
修复后的问题,因此我现在可以通过简单地执行以下操作来找到使残留标准误差最小化的 Cx
值使用optimize()进行一维最小化。这不是一个特别优雅的解决方案,但总比没有好:
xs <- sort(x)
xlo <- xs[3]
xhi <- xs[length(xs)-2]
nn <- function(f) nls(y ~ ifelse(x < xlo+(xhi-xlo)*f,ya+A*x,yb+B*x),
data = data.frame(x,y),
start = c(A=-1000,B=-1000,ya=3,yb=0))
ssr <- function(f) sum(residuals(nn(f))^2)
f = optimize(ssr,interval=c(0,1))
print (f$minimum)
print (nn(f$minimum))
summary(nn(f$minimum))
...给出输出:
[1] 0.8541683
Nonlinear regression model
model: y ~ ifelse(x < xlo + (xhi - xlo) * f, ya + A * x, yb + B * x)
data: data.frame(x, y)
A B ya yb
-1317.215 -872.002 2.620 1.407
residual sum-of-squares: 0.0414
Number of iterations to convergence: 1
Achieved convergence tolerance: 2.913e-08
Formula: y ~ ifelse(x < xlo + (xhi - xlo) * f, ya + A * x, yb + B * x)
Parameters:
Estimate Std. Error t value Pr(>|t|)
A -1.317e+03 1.792e+01 -73.493 < 2e-16 ***
B -8.720e+02 1.207e+02 -7.222 1.14e-07 ***
ya 2.620e+00 2.791e-02 93.854 < 2e-16 ***
yb 1.407e+00 3.200e-01 4.399 0.000164 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0399 on 26 degrees of freedom
Number of iterations to convergence: 1
A
和 B
以及 ya
和 yb
的值之间没有太大差异f
的最佳值,但存在一些差异。
(编辑——优雅的答案)
将问题分为两步后,就不再需要使用 nls()
了。 lm()
工作正常,如下所示:
function (x,y)
{
f <- function (Cx)
{
lhs <- function(x) ifelse(x < Cx,Cx-x,0)
rhs <- function(x) ifelse(x < Cx,0,x-Cx)
fit <- lm(y ~ lhs(x) + rhs(x))
c(summary(fit)$r.squared,
summary(fit)$coef[1], summary(fit)$coef[2],
summary(fit)$coef[3])
}
r2 <- function(x) -(f(x)[1])
res <- optimize(r2,interval=c(min(x),max(x)))
res <- c(res$minimum,f(res$minimum))
best_Cx <- res[1]
coef1 <- res[3]
coef2 <- res[4]
coef3 <- res[5]
plot(x,y)
abline(coef1+best_Cx*coef2,-coef2) #lhs
abline(coef1-best_Cx*coef3,coef3) #rs
}
...给出:
关于r - R 中 nls() 的分段函数拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15874214/
在 Eclipse 中运行我的程序时出现错误ORA-12705:无法访问 NLS 数据文件或指定的环境无效。 到目前为止我尝试过的事情: 我已经尝试在注册表的\HKEY_LOCAL_MACHINE\S
在 R 中工作,我正在尝试使用 nls() 将一些数据拟合到以下模型: y ~ c - a * exp(-b * x) 我的数据: x <- c(8, 8, 10, 10, 10, 10, 12, 1
我尝试搜索有关此主题的其他线程,但没有一个修复对我有用。我有一个自然实验的结果,我想显示符合指数分布的事件连续发生的次数。我的 R shell 粘贴在下面 f x [1] 1 2 3 4
对于这个数据集: dat = structure(list(x = c(5L, 5L, 5L, 5L, 10L, 10L, 10L, 10L, 15L, 15L, 15L, 15L, 17L, 17L
我正在使用 NLS.initializeMessages(BUNDLE_NAME, XYZ.class) 加载常量。 当“BUNDLE_NAME”和“XYZ.class”存在于同一个项目中时,它可以工
使用线性模型函数 lm() 多项式公式可以包含这样的快捷符号: m <- lm(y ~ poly(x,3)) 这是一个快捷方式,可以让用户不必创建 x^2 和 x^3 变量或将它们输入到公式中,例如
想象这两个列表如下: seq<-seq(1,16) L1<-list(A=seq, B=seq, C=seq, D=seq) v1=c(11,15,17,19,21,22,24,25,26,27,28
我想拟合一个线性平台 (nls) 模型,该模型将高度描述为年龄的函数,并且我想测试区域间模型的任何参数是否存在显着差异。 这是我目前所拥有的: # Create data df1 head (df1
我有一个输入日期(比如 sysdate),我想获取上一个星期一的日期。我试过 select trunc(sysdate, 'D') from dual; 但它依赖于 NLS。此外,我不想通过名称检查结
我正在尝试使用 R 中的 nls 拟合矩形双曲线。 curve.nlslrc = nls(photolrc ~ (1/(2*theta))*(AQY*PARlrc+Am-sqrt((AQY*PARlr
我正在使用 nls 拟合一些指数数据. 我正在使用的代码是: fit <- nls(y ~ expFit(times, A, tau, C), start = c(A=100, tau=-3, C=0
尝试拟合我的数据时遇到问题。 这是数据: x = c(1, 1.071519305, 1.148153621, 1.230268771, 1.318256739, 1.412537545, 1.513
我正在尝试制作 nls适合一个有点复杂的表达式,其中包括两个积分,其中两个拟合参数在其上限中。 我得到了错误 "Error in nlsModel(formula, mf, start, wts) :
有没有办法限制 NLS 系数在 R 中的取值范围?我知道我的数据应该存在的曲线形状;然而,NLS 无法通过产生 < 1 的功率系数来产生这样的曲线。 从本质上讲,我正在尝试为一组幼树茎(树苗)数据生成
我想将以下函数拟合到我的数据中: f(x) = Offset+Amplitudesin(FrequencyT+Phase), 或根据 Wikipedia : f(x) = C+alphasin(ome
我不明白为什么我不能为这些数据使用 nls 函数。 我尝试了很多不同的起始值,但总是出现相同的错误。 这是我一直在做的事情: expFct2 = function (x, a, b,c) { a*
我一直在研究一个曲线拟合脚本,该脚本将 3 个指数修改的高斯 (EMG) 拟合到卷积曲线。我的基函数类似于高斯分布,但包括第三个参数(前两个是 mu 和 sigma ),它确定函数的指数分量的权重。
我们的 java 类调用 PLSQL proc,它以由 NLS_DATE_FORMAT 定义的默认格式返回日期。我们的应用程序为国际化设置了自己的语言环境,但我希望日期格式保持为“DD-MON-RR”
谁能给我一个很好的解释,说明参数“算法”在 R 中的 nls 函数中的作用? 另外,公式是如何工作的?我知道它使用了 tilda,但我真的找不到对它的实际解释。 另外,起始值有多重要?我是否需要尝试多
我正在尝试使用 nls 将高斯峰拟合到 R 中的密度图.当我使用以下等式时: fit :2:0: unexpected end of input 1: ~ ^ 谁能指出我哪里出错了? 最佳答案 试
我是一名优秀的程序员,十分优秀!