2016-09-20 61 views
2

在我的數據集中,我有3組,我想繪製y和組之間的交互作用。R中多級分析中的繪圖節制效果

id <- c(1,1,1,2,2,2,3,3,3) 
group <- c(0,0,0,1,1,1,2,2,2) 
x <- c(20,50,30,50,65,80,20,50,60) 
y <- c(120,130,150,200,210,180,160,170,120) 

我已經用「interaction.plot」試過了,但沒有奏效。

interaction.plot(x,group,y) 

有人有一個很好的R語法來繪製這種交互?

+0

小心解釋爲什麼它不起作用?我輸入這個代碼,我確實得到了一個情節。它出什麼問題了? – cgmil

回答

1

無論您想要什麼,您都必須將class的組更改爲factor。確實interaction.plot()是因素的雙向組合,你的x不是因素。但如果一個是連續的,interaction.plot()會提供一些幫助。就你而言,輸出結果顯示「考慮與這些數據進行交互是愚蠢的想法」。

但是,如果你想要做的(我認爲你想要一個線性模型):

df <- data.frame(id = id, x = x, y = y, group = as.factor(group)) 

## Base plot 
model <- lm(y ~ x * group, data = df) 
xpara <- 20:80 

plot(y ~ x, data = df, col=c(2:4)[group], pch=19) 
for(i in 1:3) lines(xpara, predict(model, data.frame(x = xpara, group = as.factor(i-1))), col = i+1) 
legend("topleft",paste(c("group0","group1","group2")), pch=19, lty=1, col=c(2:4)) 

## ggplot2 (I plotted lines and confidence intervals to interpret) 
library(ggplot2) 
ggplot(df, aes(x = x, y = y, colour = group)) + 
    geom_point(size = 4) + 
    geom_smooth(method = "lm", se = T, fullrange = T) 

enter image description here

[編輯]

如果類模型通過predict()支持,方式基本上是一樣的。

df2 <- data.frame(id = as.factor(id), x = x, y = y, group = as.factor(group)) 
library(nlme) 

# first; make model 
lme.mod <- lme(y ~ x * group, random = ~ 1|id, data = df2) 

# second; get predicted values 
xpara <- 20:80 # make a vector for an independent variable you use as x. 
y.g1 <- predict(lme.mod, data.frame(x = xpara, group = "0", id = "1"), type="response") 
y.g2 <- predict(lme.mod, data.frame(x = xpara, group = "1", id = "1"), type="response") 
y.g3 <- predict(lme.mod, data.frame(x = xpara, group = "2", id = "1"), type="response") 

# third; draw 
plot(y ~ x, df2, col=c(2:4)[group], pch=19) 
lines(xpara, y.g1, col=2) 
lines(xpara, y.g2, col=3) 
lines(xpara, y.g3, col=4) 

## Simplificated version 
lev <- levels(df$group) 

plot(y ~ x, data = df2, col=c(2:4)[group], pch=19, ylab="y (id = "1")") 
for(i in seq.int(length(lev))) 
    lines(xpara, predict(lme.mod, data.frame(x = xpara, group = lev[i], id = 1)), col = i+1) 
legend("topleft",paste(c("group0","group1","group2")), pch=19, lty=1, col=c(2:4)) 
+0

謝謝你的回答和語法。但是,由於我的數據集具有層次結構,因此我想在多層模型中繪製交互圖,所以我寧願使用命令「lme」而不是「lm」。這是可能的多層次設計? –

+0

@ M.K。;好的,我編輯過。 – cuttlefish44