我正在尝试在一些比例数据上运行二次平台模型,其中值绑定在 0 到 100 之间。我需要一些帮助来解决我遇到的一些错误,并正确解释结果以及理解方程以及如何写出来正确。如果有人对这些模型有经验,任何帮助将不胜感激,因为我已经碰壁了。
示例数据:
Days Type Area
0 Abrasion 0
11 Abrasion 65.6513749
13 Abrasion 79.1887936
15 Abrasion 88.3947998
26 Abrasion 98.2726653
38 Abrasion 100
0 Abrasion 0
70 Abrasion 93.5047459
124 Abrasion 100
0 Abrasion 0
7 Abrasion 78.2666991
8 Abrasion 78.3624009
9 Abrasion 78.9448106
14 Abrasion 81.6443138
24 Abrasion 97.9969096
29 Abrasion 98.8788699
50 Abrasion 99.4708654
53 Abrasion 100
0 Laceration 0
8 Laceration 8.05965381
22 Laceration 67.1254163
83 Laceration 100
0 Laceration 0
8 Laceration 59.1650901
69 Laceration 96.1942307
74 Laceration 100
0 Laceration 0
49 Laceration 82.5396751
133 Laceration 100
0 Laceration 0
125 Laceration 100
0 Laceration 0
16 Laceration 48.5178133
X = 天数 Y = 面积
我想为这些数据拟合一个二次高原模型。
我正在使用的代码:
### Find reasonable initial values for parameters
fit.lm = lm(Area ~ Days, data=healing)
a.ini = fit.lm$coefficients[1]
b.ini = fit.lm$coefficients[2]
clx.ini = mean(healing$Area)
### Define quadratic plateau function
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)}
### Find best fit parameters
model = nls(Area ~ quadplat(Days, a, b, clx),
data = healing,
start = list(a = a.ini,
b = b.ini,
clx = clx.ini),
trace = FALSE,
nls.control(maxiter = 1000))
summary(model)
当我在某些数据上运行它时,它工作正常,但其他时候我收到以下错误:
Error in nls(Area ~ quadplat(Days, a, b, clx), data = healing, :
singular gradient
我不确定为什么我用一些数据而不是其他数据得到这个。例如,当我运行Laceration子集时,模型运行良好。模型输出:
Formula: Area ~ quadplat(Days, a, b, clx)
Parameters:
Estimate Std. Error t value Pr(>|t|)
a 1.2304 3.8509 0.320 0.753
b 3.0869 0.5595 5.518 2.54e-05 ***
clx 62.7697 11.0592 5.676 1.80e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 11.86 on 19 degrees of freedom
Number of iterations to convergence: 8
Achieved convergence tolerance: 3.234e-06
我将此解释为关键阈值,其中 Y 没有统计变化而 X 增加是 62.7697 天。这是正确的解释吗?
下图:
对我来说,这个情节看起来不错。但是,当我对子abrasion集运行相同的分析时,我得到了singular gradient错误。为什么会这样,是因为数据不合适吗?
请有 nls 知识的人通过准确解释这个二次模型在做什么以及为什么我可能会出错来帮助我。我不想“黑箱”这种分析,我认为我缺少关键的理解。另外,如果有人擅长解释公式,你能帮我把这段代码写成一个可读的公式吗?
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)}
非常感谢有关此问题的任何信息或关于 nls 的良好资源的指导。我真的需要一些帮助,如果需要可以附上我的完整数据集。


