簡體   English   中英

geom_smooth中的自定義lm公式

[英]Custom lm formula in geom_smooth

我正在使用多面圖,並在geom_smooth()使用lm方法添加線條

d<-data.frame(n=c(100, 80, 60, 55, 50, 102, 78, 61, 42, 18),
              year=rep(2000:2004, 2), 
              cat=rep(c("a", "b"), each=5))

ggplot(d, aes(year, n, group=cat))+geom_line()+geom_point()+
  facet_wrap(~cat, ncol=1)+
  geom_smooth(method="lm")

我想設置一個函數來適當地應用多項式。 我已經完成了一個功能:

lm.mod<-function(df){
  m1<-lm(n~year, data=df)
  m2<-lm(n~year+I(year^2), data=df)
  ifelse(AIC(m1)<AIC(m2), "y~x", "y~poly(x, 2)")
}

但是我在應用它時遇到了麻煩。 任何想法,或更好的方法來解決這個問題?

使用單個geom_smooth調用不可能應用不同的平滑函數。 這是一個基於平滑數據子集的解決方案:

首先,創建沒有geom_smooth的基礎圖:

library(ggplot2)
p <- ggplot(d, aes(year, n, group = cat)) +
       geom_line() +
       geom_point() +
       facet_wrap( ~ cat, ncol = 1)

第二,該函數by用於創建一個geom_smooth的每個水平cat (用於磨制的變量)。 此函數返回一個列表。

p_smooth <- by(d, d$cat, 
               function(x) geom_smooth(data=x, method = lm, formula = lm.mod(x)))

現在,您可以將geom_smooth列表添加到基礎圖中:

p + p_smooth

該圖包括上面板的二階多項式和下面板的線性光滑:

在此輸入圖像描述

lm.mod<-function(df){
  m1<-lm(n~year, data=df)
  m2<-lm(n~year+I(year^2), data=df)
  p <- ifelse(AIC(m1)<AIC(m2), "y~x", "y~poly(x, 2)")
return(p) 
}
# I only made the return here explicit out of personal preference

ggplot(d, aes(year, n, group=cat)) + geom_line() + geom_point() +
  facet_wrap(~cat, ncol=1)+
  stat_smooth(method=lm, formula=lm.mod(d))
# stat_smooth and move of your function to formula=

# test by reversing the condition and you should get a polynomial.
# lm.mod<-function(df){
#   m1<-lm(n~year, data=df)
#   m2<-lm(n~year+I(year^2), data=df)
#   p <- ifelse(AIC(m1)>AIC(m2), "y~x", "y~poly(x, 2)")
# return(p)
# }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM