代码之家  ›  专栏  ›  技术社区  ›  anderwyang

在下面的“geom_smooth”中,如何使线条波动与原始数据相匹配

  •  0
  • anderwyang  · 技术社区  · 2 年前

    在下面 geom_smooth ,线年 2023 比一年更光滑 2024 ,但2023年的SD比2024年的15大20。如何修复它?

    library(tidyverse)
    df_2023 <- data.frame(mdate =seq.Date(from=as.Date('2023-1-1'),
                                          to=as.Date('2023-12-31'),by="1 day"),
                          amount = rnorm(365,mean=4,sd=20),
                          myear='2023')
    
    df_2024 <- data.frame(mdate = seq.Date(from=as.Date('2024-1-1'),
                                           to=as.Date('2024-6-28'),by="1 day"),
                          amount= rnorm(180,mean=4,sd=15),
                          myear='2024')
    
    plot_data <- rbind(df_2023,df_2024)
    
    plot_data %>% mutate(mdate_new = update(mdate,year=2024)) %>% 
      ggplot(aes(x = mdate_new,y=amount,color=myear )) + geom_line(aes(alpha=0.6))+
      geom_smooth(se=FALSE)
    

    也许2023年全年数据生成的平滑线,所以更平滑。 我换了上面的 geom_smoooth 到以下代码,但失败

    geom_smooth(aes(data= plot_data %>% filter(mdate_new <as.Date('2024-6-28'))))
    

    enter image description here

    1 回复  |  直到 2 年前
        1
  •  2
  •   Roland    2 年前

    stat_smooth 告诉你 loess 被使用,并且与默认参数一起使用,特别是与 span = 0.75 该文件解释说,为了平滑邻域,使用了一部分数据点,该比例由下式定义 span 即,默认情况下使用具有75%点的邻域。

    现在,在数据子集中,数据点的总数非常不同,这意味着默认邻域的点数非常不同,从而导致不同的平滑。你可以纠正这一点:

    n24 <- nrow(subset(plot_data, myear == 2024))
    n23 <- nrow(subset(plot_data, myear == 2023))
      
    ggplot(plot_data, aes(x = mdate_new,y=amount,color=myear )) + geom_line(aes(alpha=0.6))+
      geom_smooth(data = subset(plot_data, myear == 2023), se=FALSE, span = 0.75 * n24/n23) +
      geom_smooth(data = subset(plot_data, myear == 2024), se=FALSE, span = 0.75)
    

    我没有在这里显示输出,因为您没有设置随机种子,因此您的数据不能完全再现。

    PS:可能更适合 mgcv::gam ggplot2之外的模型。这给了你更精细的控制。

    推荐文章