Reputation: 61
Non linear real world data, 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
I manually graphed a formula for a starting point,
formula: y = b/x^2+a
manual: y = 800000/x^2-39.5
sum of residuals = 185
correlation forecast to actual =0.79
Using the nls formula in R, I get an error message:
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
Not sure what I am missing here.
Upvotes: 5
Views: 11087
Reputation: 12713
I can reproduce your error. nls
function is missing the argument data
in it.
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
Now data df
is created and passed into nls function. Make sure, the insulated expression in I()
is the intended one.
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
Read the formula man page for insulated expression.
?formula
The man page of formula
says that
The ^ operator indicates crossing to the specified degree. For example (a+b+c)^2 is identical to (a+b+c)*(a+b+c) which in turn expands to a formula containing the main effects for a, b and c together with their second-order interactions
Also it suggests using I()
to prevent ambiguity between formula operators and arithmetic operators.
Here is the another quote from formula man page
avoid this confusion, the function I() can be used to bracket those portions of a model formula where the operators are used in their arithmetic sense. For example, in the formula y ~ a + I(b+c), the term b+c is to be interpreted as the sum of b and c.
Also this man page is worth reading
?AsIs
In function formula. There it is used to inhibit the interpretation of operators such as "+", "-", "*" and "^" as formula operators, so they are used as arithmetical operators. This is interpreted as a symbol by terms.formula.
Upvotes: 8