33

次のデータをプロットし、レススムーザーを追加しました。3次多項式とその方程式(残余を含む)をプロットに追加したいと思います。何かアドバイス?

set.seed(1410)
dsmall<-diamonds[sample(nrow(diamonds), 100), ]
df<-data.frame("x"=dsmall$carat, "y"=dsmall$price)

p <-ggplot(df, aes(x, y)) 
p <- p + geom_point(alpha=2/10, shape=21, fill="blue", colour="black", size=5)

#Add a loess smoother
p<- p + geom_smooth(method="loess",se=TRUE)

ここに画像の説明を入力してください

3次多項式を追加するにはどうすればよいですか?私が試してみました:

p<- p + geom_smooth(method="lm", se=TRUE, fill=NA,formula=lm(y ~ poly(x, 3, raw=TRUE)),colour="red")

最後に、3次多項式と残余をグラフに追加するにはどうすればよいですか?私が試してみました:

 lm_eqn = function(df){
    m=lm(y ~ poly(x, 3, df))#3rd degree polynomial
    eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
    list(a = format(coef(m)[1], digits = 2),
    b = format(coef(m)[2], digits = 2),
    r2 = format(summary(m)$r.squared, digits = 3)))
    as.character(as.expression(eq))
}


data.label <- data.frame(x = 1.5,y = 10000,label = c(lm_eqn(df)))


p<- p + geom_text(data=data.label,aes(x = x, y = y,label =label), size=8,family="Times",face="italic",parse = TRUE)
4

2 に答える 2

53

パート 1: 多項式を近似するには、次の引数を使用します。

  • method=lm- あなたはこれを正しく行いました
  • formula=y ~ poly(x, 3, raw=TRUE)-つまり、これを呼び出しでラップしないでくださいlm

コード:

p + stat_smooth(method="lm", se=TRUE, fill=NA,
                formula=y ~ poly(x, 3, raw=TRUE),colour="red")

ここに画像の説明を入力


パート 2: 方程式を追加するには:

  • 関数lm_eqn()を変更して、データ ソースを正しく指定しますlm- 閉じ括弧が間違った場所にありました
  • annotate()ではなく、ラベルを配置するために使用します。geom_text

コード:

lm_eqn = function(df){
  m=lm(y ~ poly(x, 3), df)#3rd degree polynomial
  eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2,
                   list(a = format(coef(m)[1], digits = 2),
                        b = format(coef(m)[2], digits = 2),
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq))
}


p + annotate("text", x=0.5, y=15000, label=lm_eqn(df), hjust=0, size=8, 
             family="Times", face="italic", parse=TRUE)

ここに画像の説明を入力

于 2012-08-14T09:26:06.923 に答える
14

答え 1 は良い出発点ですが、要求された 3 次多項式ではなく、パラメーター推定値の負の値を適切に処理できません。最も簡単なのは package を使用することpolynomです。このような場合は本当にggplot を使用する必要があるため、関数を定義しないバージョンを示しますstat_

以下に、任意の次数の多項式の解析済みラベルとして使用されるテキストを生成する方法を示します。これはパラメーターの推定に役立つため、signif()代わりに使用します。また、不要になっformat()たことにも注意してください。faceの使用family = "Times"は移植性がなく、 を使用しても同じ効果が得られ"serif"ます。すべての大変な作業は によって行われas.character.polynomial()ます!

library(polynom)
library(ggplot2)

set.seed(1410)
dsmall <- diamonds[sample(nrow(diamonds), 100), ]
df <- data.frame("x"=dsmall$carat, "y"=dsmall$price)

my.formula <- y ~ poly(x, 3, raw = TRUE)
p <- ggplot(df, aes(x, y)) 
p <- p + geom_point(alpha=2/10, shape=21, fill="blue", colour="black", size=5)
p <- p + geom_smooth(method = "lm", se = FALSE, 
                     formula = my.formula, 
                     colour = "red")

m <- lm(my.formula, df)
my.eq <- as.character(signif(as.polynomial(coef(m)), 3))
label.text <- paste(gsub("x", "~italic(x)", my.eq, fixed = TRUE),
              paste("italic(R)^2",  
                    format(summary(m)$r.squared, digits = 2), 
                    sep = "~`=`~"),
                    sep = "~~~~")

p + annotate(geom = "text", x = 0.2, y = 15000, label = label.text, 
             family = "serif", hjust = 0, parse = TRUE, size = 4)

ここに画像の説明を入力

最後の注意: 分散は平均とともに増加するためlm()、3 次多項式モデルを使用することは、おそらくこれらのデータの分析に最適な方法ではありません。

于 2016-01-07T15:27:43.367 に答える