Search code examples
rfunctionequation-solving

Different results, using same data and method(?), when using WordMat and R


I am interested to reproduce results calculated by the GNU plugin to MS Word WordMat in R, but I can't get them to arrive at similar results (I am not looking for identical, but simply similar).

I have some y and x values and a power function, y = bx^a

Using the following data,

x <- c(15,31,37,44,51,59)
y <- c(126,71,61,53,47,42)

I get a = -0.8051 and b = 1117.7472 in WordMat, but a = -0.8026 and B = 1108.2533 in R, slightly different values.

Am I using the nls function in some wrong way or is there a better (more transparent) way to calculate it in R?

Data and R code,

# x <- c(15,31,37,44,51,59)
# y <- c(126,71,61,53,47,42)
df <- data.frame(x,y)
moD <- nls(y~a*x^b, df, start = list(a = 1,b=1))
summary(moD)

Formula: y ~ a * x^b

Parameters:
    Estimate Std. Error t value Pr(>|t|)    
a  1.108e+03  1.298e+01   85.35 1.13e-07 ***
b -8.026e-01  3.626e-03 -221.36 2.50e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3296 on 4 degrees of freedom

Number of iterations to convergence: 19 
Achieved convergence tolerance: 5.813e-06

Solution

  • It looks like WordMat is estimating the parameters of y=b*x^a by doing the log-log regression rather than by solving the nonlinear least-squares problem:

    > x <- c(15,31,37,44,51,59)
    > y <- c(126,71,61,53,47,42)
    > 
    > (m1 <- lm(log(y)~log(x)))
    
    Call:
    lm(formula = log(y) ~ log(x))
    
    Coefficients:
    (Intercept)       log(x)  
         7.0191      -0.8051  
    > exp(coef(m1)[1])
    (Intercept) 
       1117.747 
    

    To explain what's going on here a little bit more: if y=b*x^a, taking the log on both sides gives log(y)=log(b)+a*log(x), which has the form of a linear regression (lm() in R). However, log-transforming also affects the variance of the errors (which are implicitly included on the right-hand side of the question), meaning that you're actually solving a different problem. Which is correct depends on exactly how you state the problem. This question on CrossValidated gives more details.