2016-12-14 4 views
3

私はマルチレベル解析の初心者で、グラフ関数を使ってグラフをどのようにすることができるかを理解しようとしていますbase-R。私は以下のfitの出力を理解していますが、私は視覚化に苦労しています。 dfは、単にいくつかの簡単なテストデータです:異なる色で多レベル解析で異なるレベルを表示する方法

t <- seq(0, 10, 1) 
df <- data.frame(t = t, 
       y = 1.5+0.5*(-1)^t + (1.5+0.5*(-1)^t) * t, 
       p1 = as.factor(rep(c("p1", "p2"), 10)[1:11])) 

fit <- lm(y ~ t * p1, data = df) 

# I am looking for an automated version of that: 
plot(df$t, df$y) 
lines(df$t[df$p1 == "p1"], 
     fit$coefficients[1] + fit$coefficients[2] * df$t[df$p1 == "p1"], col = "blue") 
lines(df$t[df$p1 == "p2"], 
     fit$coefficients[1] + fit$coefficients[2] * df$t[df$p1 == "p2"] + 
     + fit$coefficients[3] + fit$coefficients[4] * df$t[df$p1 == "p2"], col = "red") 

それはそれはp1と二行があることを含める必要があることを知っている必要があります。
結果は次のようになります。 Fit with two levels (interactions needs to be included)

編集は:est <- predict(fit, newx = t)はフィットと同じ結果になりますが、それでも私は「どのようにクラスタ化する」分からない予測します。

編集2 @Keith:式y ~ t * p1y = (a + c * p1) + (b + d * p1) * tとなります。 「最初の青い線」については、c, dは両方ともゼロです。

+0

'T'と 'y'は常に同じになりますか?あなたは常に単一因子列を持っていますか? –

+0

適合した値を得るより良い方法は 'predict()'です。 data.frameを 'newdata'として渡して予測し、驚かせる。 –

+0

@KeithHughittいいえ、私の本当の問題は、単純化された見た目[here](http://stackoverflow.com/questions/40765869/analysis-using-linear-regression-based-on-subgroups)のためにはるかに複雑になります。この質問の主な目的は、実際には「正しい数の線でグラフを取得する方法」です。この単純なケースでも( 'p1'は2レベルしかありません!)私は失敗します;-) – Christoph

答えて

3

これは私がやる方法です。私はggplot2のプロットのバージョンも含めています。なぜなら、私はそれがプロットについて考えている方法に適しているからです。 このバージョンでは、レベル数はp1になります。モデルパラメータの数を補うには、関連するすべての変数を含めるようにxyを構築する方法を調整するだけで済みます。 newdata引数を省略すると、lmに提供されたデータセットでフィッティングが行われることを指摘しておきます。

t <- seq(0, 10, 1) 
df <- data.frame(t = t, 
       y = 1.5+0.5*(-1)^t + (1.5+0.5*(-1)^t) * t, 
       p1 = as.factor(rep(c("p1", "p2"), 10)[1:11])) 

fit <- lm(y ~ t * p1, data = df) 

xy <- data.frame(t = t, p1 = rep(levels(df$p1), each = length(t))) 
xy$fitted <- predict(fit, newdata = xy) 

library(RColorBrewer) # for colors, you can define your own 
cols <- brewer.pal(n = length(levels(df$p1)), name = "Set1") # feel free to ignore the warning 

plot(x = df$t, y = df$y) 
for (i in 1:length(levels(xy$p1))) { 
    tmp <- xy[xy$p1 == levels(xy$p1)[i], ] 
    lines(x = tmp$t, y = tmp$fitted, col = cols[i]) 
} 

enter image description here

library(ggplot2) 
ggplot(xy, aes(x = t, y = fitted, color = p1)) + 
    theme_bw() + 
    geom_point(data = df, aes(x = t, y = y)) + 
    geom_line() 

enter image description here

関連する問題