[R] problems with package 'segmented'

Rolf Turner rolf.turner at xtra.co.nz
Sat Jan 26 03:45:43 CET 2013

In view of our private communication on this matter (to the effect that
you had not been able to elicit a response from Vito Muggeo) I did a
little delving into the code of segmented.lm().  I ***think*** I have found
the problem.  On line 243 (of the code as seen from loading the package)
the construction:

     initial <- unlist(mapply(function(x, y) {

should read:

     initial <- as.vector(mapply(function(x, y) {

(The unlist() construction  has no effect.)

Once this change is made, the function runs on the example
without throwing an error (or warning).

I have not investigated as to whether the result returned is sensible.

It is also possible that the "fix" I have suggested will induce other 
in other contexts; I don't really understand what's going on well enough to
be certain.

I hope that this is of some help, but.


             Rolf Turner

On 01/12/2010 12:32 AM, Benedikt Drosse wrote:

(BTW --- shouldn't that date read "01/12/2012"?  I don't *think*
your posting sat in my inbox for two *years*!!!)

> Dear R-users,
> I am trying to understand how the 'segmented'-package works to determine
> breakpoints and slopes of regression lines in broken-line regression models.
> However, I am not able to repeat the example on the "plant"-dataset,
> which was reported in the accompanying paper of the package. (V.M.R
> Muggeo, "Segmented: an R package to fit regression models with
> broken-line relationships")
> I would be grateful for any ideas, why this function is not working the
> way it was described in the paper. The error message points to a wrong
> length of row- and dimnames. Unfortunately this doesn't help me very
> much in understanding the function, if it does not work on the example data.
> Do you think the error will be somewhere in the function, or is it my
> stupidity?
> I am using R version 2.15.1 and the package was built in 2.15.2, but in
> respect to the error message I cannot imagine that this will cause my
> problems.
> Below you will find the code as it was reported in the paper:
> library(segmented)
> data("plant")
> attach(plant)
> X <- model.matrix(~0 + group)*time
> time.KV <- X[,1]
> time.KW <- X[,2]
> time.WC <- X[,3]
> olm <- lm(y~0+ group + time.KV + time.KW + time.WC)
> os <- segmented(olm, seg.Z= ~ time.KV + time.KW + time.WC,
> psi=list(time.KV=c(300,500), time.KW=c(450,600), time.WC=c(300,450)))
> The error message is as follows:
> Error in `rownames<-`(`*tmp*`, value = c("psi1.time.KV", "psi2.time.KV",  :
>     Length of 'dimnames' [1] not equal to array extent
> Zusätzlich:Warnmeldung:
> In cbind(initial, psi, sqrt(vv)) :
>     number of rows of result is not a multiple of vector length (arg 2)
> However, when I take out one break.point from any of the groups (e.g.
> time.KV=300), the function works fine without reporting any errors:
> code as follows:
> os <- segmented(olm, seg.Z= ~ time.KV + time.KW + time.WC,
> psi=list(time.KV=300, time.KW=c(450,600), time.WC=c(300,450)))
> Thanks alot for your comments.

More information about the R-help mailing list