使ggplot2中的geom_smooth()适应观察次数

时间:2017-05-29 19:28:48

标签: r ggplot2

如何使来自method的{​​{1}} geom_smooth()参数变为动态并适应组中数据点的数量?

例如,我有以下格式的数据:

ggplot

此图表完全正常,并使用以下代码为每个组(1. DATE PRODUCT SIZE 2. 3/1/2017 A 10 3. 3/2/2017 B 14 4. 3/3/2017 C 25 5. 3/4/2017 A 16 6. etc. )添加黄土(每个PRODUCT组有大约20个条目):

PRODUCT

但是,假设我为第4个产品“DT<-read.csv("TEST_DATA.csv") DT$DATE<-as.Date(DT$DATE, "%m/%d/%Y") myPlot<-ggplot(DT, aes(DATE, SIZE, color = PRODUCT)) myPlot + geom_point() + geom_smooth(method = "loess", se = FALSE) ”添加了2个数据点。然后,我收到以下警告消息,并且没有任何黄土拟合线添加到任何组的图中。

D

我相信这个警告是因为产品Warning messages: 1: In simpleLoess(y, x, w, span, degree = degree, parametric = parametric, ... : span too small. fewer data values than degrees of freedom. 的观测数量少于黄土的自由度。

设置D,无论如何选择method = "auto",这样做无效,将方法设置为"loess"并不是我想要的。

我想做以下但不能完全开始工作,我想知道是否有人可以提供帮助?

"lm"

如您所见,如果任何群组的观察次数少于5次,我会尝试myPlot + geom_point() + geom_smooth(data = DT, method = if(length(DT$PRODUCT)<5) {"lm"} else {"loess"}, se = F) 使用geom_smooth(),否则请使用method = "lm"方法。但我无法弄清楚如何在"loess"函数中访问每个组的观察数量。

2 个答案:

答案 0 :(得分:1)

您可以根据最小组长度编写一个有条件地选择平滑方法的函数。例如:

iris

让我们运行该功能。对于conditional_smooth(iris, "Petal.Length", "Sepal.Length", "Species") 数据框,最小的组的长度为50。

conditional_smooth(iris[c(1:50,97:150), ], "Petal.Length", "Sepal.Length", "Species")

enter image description here

现在让我们将一组缩短为四个值:

input[class=inputtext]

enter image description here

答案 1 :(得分:0)

您可以使用n参数(要评估的平滑点数)。有关详细信息,请参阅stat_smooth

修改 您可以动态构建绘图:

sProduct <- unique(DT$PRODUCT)
myPlot <- ggplot(DT, aes(DATE, SIZE, color = PRODUCT)) + geom_point()

for (i in sProduct){

  sMethod <- ifelse(sum(DT$PRODUCT == i) <= 5, "lm", "loess")
  myPlot <- myPlot + geom_smooth(data = subset(DT, PRODUCT == i), method = sMethod, se = FALSE)
}

myPlot