aSp*_*guy 4 r non-linear-regression
非线性真实世界数据,n=2,600
SAMPLE
X values 71.33 74.98 80 85.35 90.03
Y values 119.17 107.73 99.72 75 54.59
Run Code Online (Sandbox Code Playgroud)
我手动绘制了一个起点的公式,
formula: y = b/x^2+a
manual: y = 800000/x^2-39.5
sum of residuals = 185
correlation forecast to actual =0.79
Run Code Online (Sandbox Code Playgroud)
在 R 中使用 nls 公式,我收到一条错误消息:
a_start = -39.5
b_start = 800000
m<-nls(y~b/(x^2)+a, start=list(a=a_start,b=b_start))
Error in nls(y~ b/(x^2) + a, start = list(a = a_start, b = b_start)) :
parameters without starting value in 'data': y, x
Run Code Online (Sandbox Code Playgroud)
不确定我在这里缺少什么。
我可以重现你的错误。nls函数缺少其中的参数data。
m<-nls(y ~ b/(x^2)+a, start=list(a=a_start, b=b_start))
# Error in nls(y ~ b/(x^2) + a, start = list(a = a_start, b = b_start)) :
# parameters without starting value in 'data': y, x
Run Code Online (Sandbox Code Playgroud)
现在数据df被创建并传递给 nls 函数。确保 in 中的绝缘表达式I()是预期的。
df <- data.frame(x = c(71.33, 74.98 , 80 , 85.35 , 90.03),
y = c(119.17, 107.73 , 99.72 , 75, 54.59))
a_start <- -39.5
b_start <- 800000
m <- nls(y ~ I(b/(x^2+a)), data = df, start=list(a=a_start, b=b_start))
summary(m)
# Formula: y ~ I(b/(x^2 + a))
#
# Parameters:
# Estimate Std. Error t value Pr(>|t|)
# a -1743.2 872.5 -1.998 0.1396
# b 412486.2 89981.4 4.584 0.0195 *
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 9.103 on 3 degrees of freedom
#
# Number of iterations to convergence: 6
# Achieved convergence tolerance: 4.371e-06
Run Code Online (Sandbox Code Playgroud)
阅读绝缘表达式的公式手册页。
?formula
Run Code Online (Sandbox Code Playgroud)
的手册页formula说
^ 运算符表示到指定程度的交叉。例如 (a+b+c)^2 与 (a+b+c)*(a+b+c) 相同,后者又扩展为一个公式,其中包含 a、b 和 c 的主要影响以及它们的第二个-顺序交互
它还建议使用I()以防止公式运算符和算术运算符之间的歧义。
这是公式手册页的另一个引用
为避免这种混淆,函数 I() 可用于将模型公式中运算符用于算术意义的那些部分括起来。例如,在公式 y ~ a + I(b+c) 中,术语 b+c 将被解释为 b 和 c 的总和。
这个手册页也值得一读
?AsIs
Run Code Online (Sandbox Code Playgroud)
在函数公式中。它用于禁止将“+”、“-”、“*”和“^”等运算符解释为公式运算符,因此它们被用作算术运算符。这被terms.formula 解释为一个符号。