Skip to content

Cause of error in spdep::errorsarlm

3 messages · Frede Aakmann Tøgersen, Roger Bivand, Dan Rosauer

#
Hi

Please remember to keep the r-sig-geo on the list.

See ?formula. I guess that somewhere under the hood of glm() as.formula() is called. Checking the code of glm() you can see that model.frame() is called. From ?model.frame one notice that:

     If either 'formula' or 'data' is already a model frame (a data
     frame with a '"terms"' attribute) and the other is missing, the
     model frame is returned.  Unless 'formula' is a terms object,
     'as.formula' and then 'terms' is called on it.  (If you wish to
     use the 'keep.order' argument of 'terms.formula', pass a terms
     object rather than a formula.)

All this happens in glm() but not in errorsarlm():
Error: $ operator is invalid for atomic vectors
3: terms.default(formula, data = data)
2: terms(formula, data = data)
1: errorsarlm(my_formula, data = df, listw = weight_list)
[1] "character"
[1] "formula"
In errorsarlm() terms() is called with my_formula and data and since formula is a string an error is raised.

In the man page of errorsarlm() one sees:

formula: a symbolic description of the model to be fit. The details of
          model specification are given for 'lm()'

And in ?lm we see:

formula: an object of class '"formula"' (or one that can be coerced to
          that class): a symbolic description of the model to be
          fitted.  The details of model specification are given under
          'Details'.

So strictly speaking errorsarlm() should be able to handle a formula defined as a string (maintainer on cc).


Yours sincerely / Med venlig hilsen


Frede Aakmann T?gersen
Specialist, M.Sc., Ph.D.
Plant Performance & Modeling

Technology & Service Solutions
T +45 9730 5135
M +45 2547 6050
frtog at vestas.com
http://www.vestas.com

Company reg. name: Vestas Wind Systems A/S
This e-mail is subject to our e-mail disclaimer statement.
Please refer to www.vestas.com/legal/notice
If you have received this e-mail in error please contact the sender.
1 day later
#
On Wed, 5 Nov 2014, Frede Aakmann T?gersen wrote:

            
Thanks for a careful diagnosis. I've committed (R-forge, revision 563) 
simple fixes to all model fitting functions in spdep that used the formula 
argument without checking that it is of class "formula". Only spautolm() 
used the full model.frame() mechanism before, and this distinction 
remains.

With released spdep:

SAR.mod <- errorsarlm(as.formula(my_formula), data=df,
   listw=weight_list)

and

SAR.mod <- spautolm(my_formula, data=df, listw=weight_list)

give the same output. With the next release, the as.formula() is done 
internally. spautolm() was written in 2005/6, the others from 1998 
onwards, and the differences in handling model.frame objects stem from 
practice in lm() at those times.

I can see that using a string to hold a formula may seem attractive as it 
permits paste() and other string functions to be used to modify the 
formula. I would however suggest that using the update() method for 
formulae is at least as flexible, and that formula arguments be given as 
formula objects, not as strings, even if this usage is possible.

Best wishes,

Roger

  
    
#
Thanks very much Roger and Frede

This was very helpful.  

I have somehow managed to run some quite intricate model fitting and model selection code over several years, while handling formulas entirely as text, and being almost completely unaware of the formula class and associated functions such as model.frame.  But now I am elightened!

By the way Roger, I just found that errorsarlm works beautifully with dredge {MuMIn} for model selection and averaging.  The two together have just saved large amounts of time and coding compared to previous analyses.

cheers
Dan

-----Original Message-----
From: Roger Bivand [mailto:Roger.Bivand at nhh.no] 
Sent: Thursday, 6 November 2014 11:46 PM
To: Frede Aakmann T?gersen
Cc: Dan Rosauer; r-sig-geo at r-project.org
Subject: RE: Cause of error in spdep::errorsarlm
On Wed, 5 Nov 2014, Frede Aakmann T?gersen wrote:

            
Thanks for a careful diagnosis. I've committed (R-forge, revision 563) simple fixes to all model fitting functions in spdep that used the formula argument without checking that it is of class "formula". Only spautolm() used the full model.frame() mechanism before, and this distinction remains.

With released spdep:

SAR.mod <- errorsarlm(as.formula(my_formula), data=df,
   listw=weight_list)

and

SAR.mod <- spautolm(my_formula, data=df, listw=weight_list)

give the same output. With the next release, the as.formula() is done internally. spautolm() was written in 2005/6, the others from 1998 onwards, and the differences in handling model.frame objects stem from practice in lm() at those times.

I can see that using a string to hold a formula may seem attractive as it permits paste() and other string functions to be used to modify the formula. I would however suggest that using the update() method for formulae is at least as flexible, and that formula arguments be given as formula objects, not as strings, even if this usage is possible.

Best wishes,

Roger
--
Roger Bivand
Department of Economics, Norwegian School of Economics, Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; fax +47 55 95 91 00
e-mail: Roger.Bivand at nhh.no