Duncan Murdoch
2016-Sep-25 15:30 UTC
[R] curve() doesn't seem to use the whole range of x? And Error: longer object length is not a multiple of shorter object length
On 25/09/2016 9:10 AM, Matti Viljamaa wrote:> Writing: > > bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*lka+bs["kouluB:clka"]*clka > > i.e. without that being inside curve produces a vector of length 375. > > So now it seems that curve() is really skipping some lka-/x-values.How could curve() know what the length of lka is? You're telling it to set x to a sequence of values of length 101 (the default) from min(lka) to max(lka). You never tell it to set x to lka. curve() is designed to plot expressions or functions, not vectors. If you actually want to plot line segments using your original data, use lines(). (You'll likely need to sort your x values into increasing order if you do that, or you'll get a pretty ugly plot.) Duncan Murdoch> >> On 25 Sep 2016, at 16:01, Matti Viljamaa <mviljamaa at kapsi.fi> wrote: >> >> I?m trying to plot regression lines using curve() >> >> The way I do it is: >> >> bs <- coef(fit2) >> >> and then for example: >> >> curve(bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*x+bs["kouluB:clka"]*clka, from=min(lka), to=max(lka), add=TRUE, col='red') >> >> This above code runs into error: >> >> Error in curve(bs["(Intercept)"] + bs["mies"] * 0 + bs["kouluB"] + bs["lka"] * : >> 'expr' did not evaluate to an object of length 'n' >> In addition: Warning message: >> In bs["(Intercept)"] + bs["mies"] * 0 + bs["kouluB"] + bs["lka"] * : >> longer object length is not a multiple of shorter object length >> >> Which I?ve investigated might be related to the lengths of the different objects being multiplied or summed. >> Taking length(g$x) or length(g$y) of >> >> g <- curve(bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*x, from=min(lka), to=max(lka), add=TRUE, col='red') >> >> returns 101. >> >> However length(lka) is 375. But perhaps these being different is not the problem? >> >> I however do see that the whole range of lka is not plotted, for some reason. So how can I be sure >> that it passes through all x-values in lka? And i.e. that the lengths of objects inside curve() are correct? >> >> What can I do? > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
mviljamaa
2016-Sep-25 15:36 UTC
[R] curve() doesn't seem to use the whole range of x? And Error: longer object length is not a multiple of shorter object length
On 2016-09-25 18:30, Duncan Murdoch wrote:> On 25/09/2016 9:10 AM, Matti Viljamaa wrote: >> Writing: >> >> bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*lka+bs["kouluB:clka"]*clka >> >> i.e. without that being inside curve produces a vector of length 375. >> >> So now it seems that curve() is really skipping some lka-/x-values. > > How could curve() know what the length of lka is? You're telling it > to set x to a sequence of values of length 101 (the default) from > min(lka) to max(lka). You never tell it to set x to lka. > > curve() is designed to plot expressions or functions, not vectors. If > you actually want to plot line segments using your original data, use > lines(). (You'll likely need to sort your x values into increasing > order if you do that, or you'll get a pretty ugly plot.) > > Duncan MurdochI know that about curve(), but since this function uses lka as a parameter, then how should I formulate it for curve so that I don't get the error about wrong lengths?>> >>> On 25 Sep 2016, at 16:01, Matti Viljamaa <mviljamaa at kapsi.fi> wrote: >>> >>> I?m trying to plot regression lines using curve() >>> >>> The way I do it is: >>> >>> bs <- coef(fit2) >>> >>> and then for example: >>> >>> curve(bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*x+bs["kouluB:clka"]*clka, >>> from=min(lka), to=max(lka), add=TRUE, col='red') >>> >>> This above code runs into error: >>> >>> Error in curve(bs["(Intercept)"] + bs["mies"] * 0 + bs["kouluB"] + >>> bs["lka"] * : >>> 'expr' did not evaluate to an object of length 'n' >>> In addition: Warning message: >>> In bs["(Intercept)"] + bs["mies"] * 0 + bs["kouluB"] + bs["lka"] * : >>> longer object length is not a multiple of shorter object length >>> >>> Which I?ve investigated might be related to the lengths of the >>> different objects being multiplied or summed. >>> Taking length(g$x) or length(g$y) of >>> >>> g <- curve(bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*x, >>> from=min(lka), to=max(lka), add=TRUE, col='red') >>> >>> returns 101. >>> >>> However length(lka) is 375. But perhaps these being different is not >>> the problem? >>> >>> I however do see that the whole range of lka is not plotted, for some >>> reason. So how can I be sure >>> that it passes through all x-values in lka? And i.e. that the lengths >>> of objects inside curve() are correct? >>> >>> What can I do? >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >>
Jeff Newmiller
2016-Sep-25 15:52 UTC
[R] curve() doesn't seem to use the whole range of x? And Error: longer object length is not a multiple of shorter object length
You seem to be confused about what curve is doing vs. what you are doing. A) Compute the points you want to plot and put them into 2 vectors. Then figure out how to plot those vectors. Then (perhaps) consider putting that all into one line of code again. B) The predict function is the preferred way to compute points. It may be educational for you to do the computations by hand at first, but in the long run using predict will help you avoid problems getting the equations right in multiple places in your script. C) Learn what makes an example reproducible (e.g. [1] or [2]), and ask your questions with reproducible code and data so we can give you concrete responses. [1] http://adv-r.had.co.nz/Reproducibility.html [2] http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example -- Sent from my phone. Please excuse my brevity. On September 25, 2016 8:36:49 AM PDT, mviljamaa <mviljamaa at kapsi.fi> wrote:>On 2016-09-25 18:30, Duncan Murdoch wrote: >> On 25/09/2016 9:10 AM, Matti Viljamaa wrote: >>> Writing: >>> >>> >bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*lka+bs["kouluB:clka"]*clka >>> >>> i.e. without that being inside curve produces a vector of length >375. >>> >>> So now it seems that curve() is really skipping some lka-/x-values. >> >> How could curve() know what the length of lka is? You're telling it >> to set x to a sequence of values of length 101 (the default) from >> min(lka) to max(lka). You never tell it to set x to lka. >> >> curve() is designed to plot expressions or functions, not vectors. >If >> you actually want to plot line segments using your original data, use >> lines(). (You'll likely need to sort your x values into increasing >> order if you do that, or you'll get a pretty ugly plot.) >> >> Duncan Murdoch > >I know that about curve(), but since this function uses lka as a >parameter, then how should I formulate it for curve so that I don't get > >the error about wrong lengths? > >>> >>>> On 25 Sep 2016, at 16:01, Matti Viljamaa <mviljamaa at kapsi.fi> >wrote: >>>> >>>> I?m trying to plot regression lines using curve() >>>> >>>> The way I do it is: >>>> >>>> bs <- coef(fit2) >>>> >>>> and then for example: >>>> >>>> >curve(bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*x+bs["kouluB:clka"]*clka, > >>>> from=min(lka), to=max(lka), add=TRUE, col='red') >>>> >>>> This above code runs into error: >>>> >>>> Error in curve(bs["(Intercept)"] + bs["mies"] * 0 + bs["kouluB"] + >>>> bs["lka"] * : >>>> 'expr' did not evaluate to an object of length 'n' >>>> In addition: Warning message: >>>> In bs["(Intercept)"] + bs["mies"] * 0 + bs["kouluB"] + bs["lka"] * >: >>>> longer object length is not a multiple of shorter object length >>>> >>>> Which I?ve investigated might be related to the lengths of the >>>> different objects being multiplied or summed. >>>> Taking length(g$x) or length(g$y) of >>>> >>>> g <- curve(bs["(Intercept)"]+bs["mies"]*0+bs["kouluB"]+bs["lka"]*x, > >>>> from=min(lka), to=max(lka), add=TRUE, col='red') >>>> >>>> returns 101. >>>> >>>> However length(lka) is 375. But perhaps these being different is >not >>>> the problem? >>>> >>>> I however do see that the whole range of lka is not plotted, for >some >>>> reason. So how can I be sure >>>> that it passes through all x-values in lka? And i.e. that the >lengths >>>> of objects inside curve() are correct? >>>> >>>> What can I do? >>> >>> ______________________________________________ >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide >>> http://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. >>> > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide >http://www.R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code.