2016-12-14 4 views
3

저는 다단계 분석의 초보자이며 플롯 기능을 사용하여 그래프를 수행하는 방법을 이해하려고 시도합니다 (base-R). 나는 아래의 fit의 출력을 이해하지만 나는 시각화와 함께 투쟁하고있다.다른 색상으로 다단계 분석에서 다른 레벨을 표시하는 방법

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을 포함하는 것을 두 개의 선이 있다는 것을 알아야한다 : df은 몇 가지 간단한 테스트 데이터입니다.
결과는 다음과 같아야합니다 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입니다.

+0

는't' 항상'y'는 같은 것인가? 당신은 항상 단일 요인 컬럼을 갖게 될 것입니까? –

+0

맞는 값을 얻는 더 좋은 방법은'predict()'를 이용하는 것입니다. data.frame을 newdata로 전달하여 예측하고 놀라게 할 수 있습니다. –

+0

@KeithHughitt 아니, 내 진짜 문제는 훨씬 더 복잡해질 것이다. 단순한보기 [여기] (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