aSportsguy
aSportsguy

Reputation: 61

R Error: parameters without starting value

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

Answers (1)

Sathish
Sathish

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

Related Questions