Hi Michael, On Tue, Feb 15, 2011 at 7:15 AM, Michael Pearmain <michael.pearm...@gmail.com> wrote: > Hi All, > > I'm having some trouble assigning arguments inside a function to > produce a plot from a model > > Can anyone help me? Below I've outlined the situation and examples of > failing and working code. > > Regards > > Mike > > > > ## data ## > > decay.data <- ... > > behaviors lift reach.uu estimated.conversions.uu total.reach > 1 1 432.0083 770 770 0.00 > 2 2 432.0083 29660 29660 0.03 > 3 3 429.9864 30000 29850 0.03 > 4 4 427.8599 30320 30020 0.03 > 5 5 424.0105 30680 30110 0.03 > 6 6 418.4710 31180 30200 0.03 > 7 7 412.0022 31840 30360 0.03 > 8 8 405.4553 32340 30350 0.03 > 9 9 397.0083 33260 30560 0.03 > 10 10 393.2382 33600 30580 0.03 > 11 11 385.5431 34940 31180 0.03 > 12 12 384.2942 35050 31170 0.03 > 13 13 374.0299 36110 31260 0.03 > 14 14 363.3057 37290 31350 0.03 > 15 15 353.1185 38450 31420 0.03 > 16 16 342.2190 40000 31680 0.03 > 17 17 338.9232 40470 31740 0.04 > 18 18 328.8666 41880 31880 0.04 > 19 19 318.3219 45510 33530 0.04 > 20 20 308.1200 47230 33680 0.04 > > If i use: > > library(nlrwr) > # Build a model. > decay.model <- nls(lift ~ SSexp(total.reach, y0, b), data = decay.data) > > # plot the model > plot(decay.data[["total.reach"]], decay.data[["lift"]]) > xv <- seq(min(decay.data[["lift"]]), max(decay.data[["total.reach"]]), 0.02) > yv <- predict(decay.model, newdata = list(total.reach = xv)) > lines(xv,yv) > > This works.
Actually it doesn't work for me. I get xv <- seq(min(decay.data[["lift"]]), max(decay.data[["total.reach"]]), 0.02) Error in seq.default(min(decay.data[["lift"]]), max(decay.data[["total.reach"]]), : wrong sign in 'by' argument > > If i try and wrap this in a function and pass the argument values i fail when > i reach the "list(total.reach = xv)" i've tried various flavours or paste(), > but again can't figure out where i am going wrong, any help appreciated. Your example is not reproducible (you don't define the BuildDecayModel function for us...) which makes it harder to help. But just by eyeballing... > > PlotDecayModel <- function(x = "total.reach", > y = "lift", > data) { > > decay.model <- BuildDecayModel(x= "total.reach", Putting "total.reach" in quotes like this just sets x equal to the text string "total.reach", not to the value of x passed to the function. If you want the x to be passed from the function remove the quotes. > y = "lift", > data = data) > # Plot the lift Vs reach plot. > plot(data[[x]], data[[y]]) > # Add the model curve to the plot. > xv <- seq(min(data[[x]]), max(data[[x]]), 0.02) > yv <- predict(decay.model, newdata = list(x = xv)) > lines(xv,yv) > } > > I return the error > Error in xy.coords(x, y) : 'x' and 'y' lengths differ > > I can see this is because the function ignores the 'newdata = list(x = xv)' > as it is trying ot assign x on the data to be xv, > (which doesn't exist in the model), so how can i use the arg "total.reach" so > the argument 'newdata = list(x = xv)' is evaluated as > 'newdata = list(total.reach = xv)' I would try something like nd <- list(xv) names(nd) <- x yv <- predict(decay.model, newdata = nd) > > Many thanks in advance HTH, if you still have difficulty please post a reproducible example. Best, Ista > > Mike > > ______________________________________________ > R-help@r-project.org mailing list > 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. > -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org ______________________________________________ R-help@r-project.org mailing list 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.