How to plot regression or LOWESS lines over data in coplot











up vote
2
down vote

favorite












It is often helpful to plot a line (e.g., a fitted regression line or a non-parametric LOWESS line) over data. Likewise, when variables are confounded, it is often helpful to plot x1, y data stratified by x2. However, I can't quite figure out how to combine both using ?coplot. This ought to be quite natural in lattice, but I can't seem to figure out how to do it there, either.



The following provides some data to play with:



library(MASS)
set.seed(7422)
X <- mvrnorm(100, mu=c(5,5), Sigma=rbind(c(2.0, 1.9),
c(1.9, 2.0) ) )
x1 <- X[,1]; x2 <- X[,2]
y <- 3 + .6*x1 - .4*x2 + rnorm(100)
m <- lm(y~x1+x2)
summary(m)$coefficients
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 3.8281801 0.4022204 9.517619 1.476519e-15
# x1 0.5466495 0.2060269 2.653292 9.314673e-03
# x2 -0.4835804 0.2139542 -2.260205 2.604451e-02
windows()
pairs(cbind(y, x1, x2))
xs <- seq(1.6, 9.2, by=.1)
windows()
plot(y~x2)
lines(xs, predict(m, data.frame(x1=5.2, x2=xs)), col="blue")
windows()
coplot(y~x2|x1)
## doesn't work (lines on plot were drawn by hand)
# lines(xs, predict(m, data.frame(x1=mean(x1[subscripts], x2=xs)), col="blue")
# lines(lowess(y~x2, subset=x1[subscripts]), col="gray")


Scatterplot matrix of the raw data:



scatterplot matrix of the raw data



Here is a marginal plot of x2 vs y, with fitted the regression line and a marginal LOWESS line plotted on top of the data. This will look weird to people who aren't statistically savvy.



marginal plot of x2 vs y, with fitted regression line and marginal LOWESS



This is what I have in mind. It's a coplot, with the regression model and a LOWESS line fitted to each stratum of the data plotted inside each panel.



coplot with regression lines and conditional LOWESSes overlaid










share|improve this question


























    up vote
    2
    down vote

    favorite












    It is often helpful to plot a line (e.g., a fitted regression line or a non-parametric LOWESS line) over data. Likewise, when variables are confounded, it is often helpful to plot x1, y data stratified by x2. However, I can't quite figure out how to combine both using ?coplot. This ought to be quite natural in lattice, but I can't seem to figure out how to do it there, either.



    The following provides some data to play with:



    library(MASS)
    set.seed(7422)
    X <- mvrnorm(100, mu=c(5,5), Sigma=rbind(c(2.0, 1.9),
    c(1.9, 2.0) ) )
    x1 <- X[,1]; x2 <- X[,2]
    y <- 3 + .6*x1 - .4*x2 + rnorm(100)
    m <- lm(y~x1+x2)
    summary(m)$coefficients
    # Estimate Std. Error t value Pr(>|t|)
    # (Intercept) 3.8281801 0.4022204 9.517619 1.476519e-15
    # x1 0.5466495 0.2060269 2.653292 9.314673e-03
    # x2 -0.4835804 0.2139542 -2.260205 2.604451e-02
    windows()
    pairs(cbind(y, x1, x2))
    xs <- seq(1.6, 9.2, by=.1)
    windows()
    plot(y~x2)
    lines(xs, predict(m, data.frame(x1=5.2, x2=xs)), col="blue")
    windows()
    coplot(y~x2|x1)
    ## doesn't work (lines on plot were drawn by hand)
    # lines(xs, predict(m, data.frame(x1=mean(x1[subscripts], x2=xs)), col="blue")
    # lines(lowess(y~x2, subset=x1[subscripts]), col="gray")


    Scatterplot matrix of the raw data:



    scatterplot matrix of the raw data



    Here is a marginal plot of x2 vs y, with fitted the regression line and a marginal LOWESS line plotted on top of the data. This will look weird to people who aren't statistically savvy.



    marginal plot of x2 vs y, with fitted regression line and marginal LOWESS



    This is what I have in mind. It's a coplot, with the regression model and a LOWESS line fitted to each stratum of the data plotted inside each panel.



    coplot with regression lines and conditional LOWESSes overlaid










    share|improve this question
























      up vote
      2
      down vote

      favorite









      up vote
      2
      down vote

      favorite











      It is often helpful to plot a line (e.g., a fitted regression line or a non-parametric LOWESS line) over data. Likewise, when variables are confounded, it is often helpful to plot x1, y data stratified by x2. However, I can't quite figure out how to combine both using ?coplot. This ought to be quite natural in lattice, but I can't seem to figure out how to do it there, either.



      The following provides some data to play with:



      library(MASS)
      set.seed(7422)
      X <- mvrnorm(100, mu=c(5,5), Sigma=rbind(c(2.0, 1.9),
      c(1.9, 2.0) ) )
      x1 <- X[,1]; x2 <- X[,2]
      y <- 3 + .6*x1 - .4*x2 + rnorm(100)
      m <- lm(y~x1+x2)
      summary(m)$coefficients
      # Estimate Std. Error t value Pr(>|t|)
      # (Intercept) 3.8281801 0.4022204 9.517619 1.476519e-15
      # x1 0.5466495 0.2060269 2.653292 9.314673e-03
      # x2 -0.4835804 0.2139542 -2.260205 2.604451e-02
      windows()
      pairs(cbind(y, x1, x2))
      xs <- seq(1.6, 9.2, by=.1)
      windows()
      plot(y~x2)
      lines(xs, predict(m, data.frame(x1=5.2, x2=xs)), col="blue")
      windows()
      coplot(y~x2|x1)
      ## doesn't work (lines on plot were drawn by hand)
      # lines(xs, predict(m, data.frame(x1=mean(x1[subscripts], x2=xs)), col="blue")
      # lines(lowess(y~x2, subset=x1[subscripts]), col="gray")


      Scatterplot matrix of the raw data:



      scatterplot matrix of the raw data



      Here is a marginal plot of x2 vs y, with fitted the regression line and a marginal LOWESS line plotted on top of the data. This will look weird to people who aren't statistically savvy.



      marginal plot of x2 vs y, with fitted regression line and marginal LOWESS



      This is what I have in mind. It's a coplot, with the regression model and a LOWESS line fitted to each stratum of the data plotted inside each panel.



      coplot with regression lines and conditional LOWESSes overlaid










      share|improve this question













      It is often helpful to plot a line (e.g., a fitted regression line or a non-parametric LOWESS line) over data. Likewise, when variables are confounded, it is often helpful to plot x1, y data stratified by x2. However, I can't quite figure out how to combine both using ?coplot. This ought to be quite natural in lattice, but I can't seem to figure out how to do it there, either.



      The following provides some data to play with:



      library(MASS)
      set.seed(7422)
      X <- mvrnorm(100, mu=c(5,5), Sigma=rbind(c(2.0, 1.9),
      c(1.9, 2.0) ) )
      x1 <- X[,1]; x2 <- X[,2]
      y <- 3 + .6*x1 - .4*x2 + rnorm(100)
      m <- lm(y~x1+x2)
      summary(m)$coefficients
      # Estimate Std. Error t value Pr(>|t|)
      # (Intercept) 3.8281801 0.4022204 9.517619 1.476519e-15
      # x1 0.5466495 0.2060269 2.653292 9.314673e-03
      # x2 -0.4835804 0.2139542 -2.260205 2.604451e-02
      windows()
      pairs(cbind(y, x1, x2))
      xs <- seq(1.6, 9.2, by=.1)
      windows()
      plot(y~x2)
      lines(xs, predict(m, data.frame(x1=5.2, x2=xs)), col="blue")
      windows()
      coplot(y~x2|x1)
      ## doesn't work (lines on plot were drawn by hand)
      # lines(xs, predict(m, data.frame(x1=mean(x1[subscripts], x2=xs)), col="blue")
      # lines(lowess(y~x2, subset=x1[subscripts]), col="gray")


      Scatterplot matrix of the raw data:



      scatterplot matrix of the raw data



      Here is a marginal plot of x2 vs y, with fitted the regression line and a marginal LOWESS line plotted on top of the data. This will look weird to people who aren't statistically savvy.



      marginal plot of x2 vs y, with fitted regression line and marginal LOWESS



      This is what I have in mind. It's a coplot, with the regression model and a LOWESS line fitted to each stratum of the data plotted inside each panel.



      coplot with regression lines and conditional LOWESSes overlaid







      r plot loess






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 9 at 20:56









      gung

      7,90663966




      7,90663966
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote













          To do this with coplot, you need to define your own panel function. The default function is points which just plots the points, but you can add a regression line and a lowess curve with a simple function.



          PointsWithReg = function(x, y, pch=20, col=1, ...) {
          points(x=x, y=y, col=col, pch=pch, type="p", ...)
          abline(lm(y ~ x))
          lines(lowess(x=x, y=y), col="blue")
          }

          coplot(y~x2|x1, panel=PointsWithReg, pch=16)


          Coplot with regression line and lowess






          share|improve this answer





















          • Thanks, is there a convenient way to modify that so that the regression line from the model is plotted in each panel, rather than a new regression fitted to each stratum of the data? The slope should be straightforward, as it would be the same everywhere (at least in this case, w/o an interaction), but the intercept would need to be shifted based on the mean of x1 w/i each stratum.
            – gung
            Nov 10 at 2:15











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53233176%2fhow-to-plot-regression-or-lowess-lines-over-data-in-coplot%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          1
          down vote













          To do this with coplot, you need to define your own panel function. The default function is points which just plots the points, but you can add a regression line and a lowess curve with a simple function.



          PointsWithReg = function(x, y, pch=20, col=1, ...) {
          points(x=x, y=y, col=col, pch=pch, type="p", ...)
          abline(lm(y ~ x))
          lines(lowess(x=x, y=y), col="blue")
          }

          coplot(y~x2|x1, panel=PointsWithReg, pch=16)


          Coplot with regression line and lowess






          share|improve this answer





















          • Thanks, is there a convenient way to modify that so that the regression line from the model is plotted in each panel, rather than a new regression fitted to each stratum of the data? The slope should be straightforward, as it would be the same everywhere (at least in this case, w/o an interaction), but the intercept would need to be shifted based on the mean of x1 w/i each stratum.
            – gung
            Nov 10 at 2:15















          up vote
          1
          down vote













          To do this with coplot, you need to define your own panel function. The default function is points which just plots the points, but you can add a regression line and a lowess curve with a simple function.



          PointsWithReg = function(x, y, pch=20, col=1, ...) {
          points(x=x, y=y, col=col, pch=pch, type="p", ...)
          abline(lm(y ~ x))
          lines(lowess(x=x, y=y), col="blue")
          }

          coplot(y~x2|x1, panel=PointsWithReg, pch=16)


          Coplot with regression line and lowess






          share|improve this answer





















          • Thanks, is there a convenient way to modify that so that the regression line from the model is plotted in each panel, rather than a new regression fitted to each stratum of the data? The slope should be straightforward, as it would be the same everywhere (at least in this case, w/o an interaction), but the intercept would need to be shifted based on the mean of x1 w/i each stratum.
            – gung
            Nov 10 at 2:15













          up vote
          1
          down vote










          up vote
          1
          down vote









          To do this with coplot, you need to define your own panel function. The default function is points which just plots the points, but you can add a regression line and a lowess curve with a simple function.



          PointsWithReg = function(x, y, pch=20, col=1, ...) {
          points(x=x, y=y, col=col, pch=pch, type="p", ...)
          abline(lm(y ~ x))
          lines(lowess(x=x, y=y), col="blue")
          }

          coplot(y~x2|x1, panel=PointsWithReg, pch=16)


          Coplot with regression line and lowess






          share|improve this answer












          To do this with coplot, you need to define your own panel function. The default function is points which just plots the points, but you can add a regression line and a lowess curve with a simple function.



          PointsWithReg = function(x, y, pch=20, col=1, ...) {
          points(x=x, y=y, col=col, pch=pch, type="p", ...)
          abline(lm(y ~ x))
          lines(lowess(x=x, y=y), col="blue")
          }

          coplot(y~x2|x1, panel=PointsWithReg, pch=16)


          Coplot with regression line and lowess







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 9 at 22:07









          G5W

          20.7k82041




          20.7k82041












          • Thanks, is there a convenient way to modify that so that the regression line from the model is plotted in each panel, rather than a new regression fitted to each stratum of the data? The slope should be straightforward, as it would be the same everywhere (at least in this case, w/o an interaction), but the intercept would need to be shifted based on the mean of x1 w/i each stratum.
            – gung
            Nov 10 at 2:15


















          • Thanks, is there a convenient way to modify that so that the regression line from the model is plotted in each panel, rather than a new regression fitted to each stratum of the data? The slope should be straightforward, as it would be the same everywhere (at least in this case, w/o an interaction), but the intercept would need to be shifted based on the mean of x1 w/i each stratum.
            – gung
            Nov 10 at 2:15
















          Thanks, is there a convenient way to modify that so that the regression line from the model is plotted in each panel, rather than a new regression fitted to each stratum of the data? The slope should be straightforward, as it would be the same everywhere (at least in this case, w/o an interaction), but the intercept would need to be shifted based on the mean of x1 w/i each stratum.
          – gung
          Nov 10 at 2:15




          Thanks, is there a convenient way to modify that so that the regression line from the model is plotted in each panel, rather than a new regression fitted to each stratum of the data? The slope should be straightforward, as it would be the same everywhere (at least in this case, w/o an interaction), but the intercept would need to be shifted based on the mean of x1 w/i each stratum.
          – gung
          Nov 10 at 2:15


















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53233176%2fhow-to-plot-regression-or-lowess-lines-over-data-in-coplot%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Guess what letter conforming each word

          Port of Spain

          Run scheduled task as local user group (not BUILTIN)