首页 文章

用格子绘制回归线

提问于
浏览
3

我在这里遇到了一些麻烦,请帮助我 . 我有这些数据

set.seed(4)
mydata <- data.frame(var = rnorm(100),
                     temp = rnorm(100),
                     subj = as.factor(rep(c(1:10),5)),
                     trt = rep(c("A","B"), 50))

和这个适合他们的模型

lm  <- lm(var ~ temp * subj, data = mydata)

我想用 lattice 绘制结果并拟合回归线,用我的模型预测,通过它们 . 为此,我正在使用这种方法,由D. Sarkar概述"Lattice Tricks for the power useR"

temp_rng <- range(mydata$temp, finite = TRUE)

grid <- expand.grid(temp = do.breaks(temp_rng, 30),
                    subj = unique(mydata$subj),
                    trt = unique(mydata$trt))

model <- cbind(grid, var = predict(lm, newdata = grid))

orig <- mydata[c("var","temp","subj","trt")]

combined <- make.groups(original = orig, model = model)


xyplot(var ~ temp | subj, 
       data = combined,
       groups = which,
       type = c("p", "l"),
       distribute.type = TRUE
       )

到目前为止,每件事情都很好,但我也想为两种治疗 trt=1trt=2 的数据点分配填充颜色 .

所以我写了这段代码,工作得很好,但是当绘制回归线时,看起来这个类型不能被面板函数识别出来......

my.fill <- c("black", "grey")

plot <- with(combined,
        xyplot(var ~ temp | subj,
              data = combined,
              group = combined$which,
              type = c("p", "l"),
              distribute.type = TRUE,
              panel = function(x, y, ..., subscripts){
                     fill <- my.fill[combined$trt[subscripts]] 
                     panel.xyplot(x, y, pch = 21, fill = my.fill, col = "black")
                     },
             key = list(space = "right",
                     text = list(c("trt1", "trt2"), cex = 0.8),
                     points = list(pch = c(21), fill = c("black", "grey")),
                     rep = FALSE)
                     )
      )
plot

我还尝试在 panel.xyplot 内移动类型和分发类型,以及将数据子集化为 panel.xyplot ,如下所示

plot <- with(combined,
        xyplot(var ~ temp | subj,
              data = combined,
              panel = function(x, y, ..., subscripts){
                     fill <- my.fill[combined$trt[subscripts]] 
                     panel.xyplot(x[combined$which=="original"], y[combined$which=="original"], pch = 21, fill = my.fill, col = "black")
                     panel.xyplot(x[combined$which=="model"], y[combined$which=="model"], type = "l", col = "black")
                     },
             key = list(space = "right",
                     text = list(c("trt1", "trt2"), cex = 0.8),
                     points = list(pch = c(21), fill = c("black", "grey")),
                     rep = FALSE)
                     )
      )
plot

但也没有成功 .

任何人都可以帮我把预测值绘制成一条线而不是点吗?

3 回答

  • 6

    这可能是 latticeExtra 包的工作 .

    library(latticeExtra)
    p1 <- xyplot(var ~ temp | subj, data=orig, panel=function(..., subscripts) {
      fill <- my.fill[combined$trt[subscripts]] 
      panel.xyplot(..., pch=21, fill=my.fill, col="black")
    })
    p2 <- xyplot(var ~ temp | subj, data=model, type="l")
    p1+p2
    

    enter image description here

    我在你的第一次尝试中继续进行,但带有下标的那个没有用,因为x和y是subj数据的子集,所以使用基于 combined 的向量对它们进行子集化将不会像你想象的那样工作它会 . 试试这个 .

    xyplot(var ~ temp | subj, groups=which, data = combined,
           panel = function(x, y, groups, subscripts){
             fill <- my.fill[combined$trt[subscripts]]
             g <- groups[subscripts]
             panel.points(x[g=="original"], y[g=="original"], pch = 21, 
                          fill = my.fill, col = "black")
             panel.lines(x[g=="model"], y[g=="model"], col = "black")
           },
           key = list(space = "right",
             text = list(c("trt1", "trt2"), cex = 0.8),
             points = list(pch = c(21), fill = c("black", "grey")),
             rep = FALSE)
           )
    
  • 2

    仅在原始数据上使用 panel.lmline 函数可能更容易:

    xyplot(var ~ temp | subj,
            data = orig,
            panel = function(x,y,...,subscripts){
                fill <- my.fill[orig$trt[subscripts]]
                panel.xyplot(x, y, pch = 21, fill = my.fill,col = "black")
                panel.lmline(x,y,col = "salmon")
            },
            key = list(space = "right",
                         text = list(c("trt1", "trt2"), cex = 0.8),
                         points = list(pch = c(21), fill = c("black", "grey")),
                         rep = FALSE)
    )
    

    enter image description here

  • 2

    这可能是微不足道的,但您可以尝试:

    xyplot(... , type=c("p","l","r"))
    

    p " adds points, " l " connects them with broken lines, " r ”通过您的数据拟合线性模型 . 仅 type="r" 将仅绘制回归线而不显示数据点 .

相关问题