15

I am preparing a plot using ggplot2, and I want to add a trendline that is based on a weighted least squares estimation.

In base graphics this can be done by sending a WLS model to abline:

mod0 <- lm(ds$dMNP~ds$MNP)
mod1 <- lm(ds$dMNP~ds$MNP, weights = ds$Asset)

symbols(ds$dMNP~ds$MNP, circles=ds$r, inches=0.35)
#abline(mod0)
abline(mod1)

in ggplot2 I set the argument weight in geom_smooth but nothing changes:

ggplot(ds, aes(x=MNP, y=dMNP, size=Asset) + 
  geom_point(shape=21) +
  geom_smooth(method = "lm", weight="Asset", color="black", show.legend = FALSE)

this gives me the same plot as

ggplot(ds, aes(x=MNP, y=dMNP, size=Asset) + 
  geom_point(shape=21) +
  geom_smooth(method = "lm", color="black", show.legend = FALSE)
MEcon
  • 395
  • 4
  • 23

1 Answers1

28

I'm late, but for posterity and clarity, here is the full solution:

ggplot(ds, aes(x = MNP, y = dMNP, size = Asset)) + 
  geom_point(shape = 21) +
  geom_smooth(method = "lm", mapping = aes(weight = Asset), 
              color = "black", show.legend = FALSE)

Don't put the weight name in quotes.

ardaar
  • 1,164
  • 9
  • 19
  • I get the following error message `The following aesthetics were dropped during statistical transformation: weight, size ℹ This can happen when ggplot fails to infer the correct grouping structure in the data. ℹ Did you forget to specify a `group` aesthetic or to convert a numerical variable into a factor?` – Julien Jan 21 '23 at 09:38
  • But the curve obtained is still weighted, which is good – Julien Jan 21 '23 at 09:39
  • This would get rid of the error message: ggplot(ds, aes(x = MNP, y = dMNP)) + geom_point(shape = 21,aes(size = Asset)) + geom_smooth(method = "lm", mapping = aes(weight = Asset), color = "black", show.legend = FALSE) – andyyy Jul 12 '23 at 10:19