簡體   English   中英

ggplot2:使用facet_wrap返回“完整”或“子集”glm模型的邏輯結果的stat_smooth

[英]ggplot2: stat_smooth for logistic outcomes with facet_wrap returning 'full' or 'subset' glm models

我正在研究邏輯回歸模型,其中包含一個連續預測器和一個具有多個級別的分類預測器。 我想使用ggplot2呈現結果並利用facet_wrap顯示分類預測器的每個級別的回歸線。 這樣做時我注意到stat_smooth提供的擬合曲線只考慮特定方面的數據,而不是整個數據集。 這是一個很小的差異,但是當看到predict.glm返回的情節與預測值時,這是一個值得注意的差異。

下面是一個使用代碼后面的圖形重新創建問題的示例。

library(boot)    # needed for inv.logit function
library(ggplot2) # version 0.8.9

set.seed(42)
n <- 100

df <- data.frame(location = rep(LETTERS[1:4], n),
                 score    = sample(45:80, 4*n, replace = TRUE))

df$p    <- inv.logit(0.075 * df$score + rep(c(-4.5, -5, -6, -2.8), n))
df$pass <- sapply(df$p, function(x){rbinom(1, 1, x)}) 

gplot <- ggplot(df, aes(x = score, y = pass)) + 
            geom_point() + 
            facet_wrap( ~ location) + 
            stat_smooth(method = 'glm', family = 'binomial') 

# 'full' logistic model
g <- glm(pass ~ location + score, data = df, family = 'binomial')
summary(g)

# new.data for predicting new observations
new.data <- expand.grid(score    = seq(46, 75, length = n), 
                        location = LETTERS[1:4])

new.data$pred.full <- predict(g, newdata = new.data, type = 'response')

pred.sub <- NULL
for(i in LETTERS[1:4]){
  pred.sub <- c(pred.sub,
    predict(update(g, formula = . ~ score, subset = location %in% i), 
            newdata = data.frame(score = seq(46, 75, length = n)), 
            type = 'response'))
}

new.data$pred.sub <- pred.sub

gplot + 
  geom_line(data = new.data, aes(x = score, y = pred.full), color = 'green') + 
  geom_line(data = new.data, aes(x = score, y = pred.sub),  color = 'red')

在此輸入圖像描述

我注意到並關注的是在方面B中容易看到。紅色曲線是僅考慮一個位置的模型的預測值,而綠色曲線是使用完整數據集的預測。 基於數據子集的模型與stat_smooth的圖匹配。

我想通過ggplot2繪制標准錯誤着色的綠色曲線。 我確信在我可以使用的代碼中有一個選項可以做到這一點,但我還沒有找到它,或者可能有一個不同的順序或步驟我應該遵循從ggplot調用獲得綠色曲線。 我在一個方面繪制所有內容並使用顏色或群體美感時發現了類似的問題。

任何建議將不勝感激。

你是正確的,這樣做的方法是在ggplot2之外擬合模型,然后計算你喜歡的擬合值和間隔,並分別傳遞這些數據。

實現您所描述的內容的一種方法是這樣的:

preds <- predict(g, newdata = new.data, type = 'response',se = TRUE)
new.data$pred.full <- preds$fit

new.data$ymin <- new.data$pred.full - 2*preds$se.fit
new.data$ymax <- new.data$pred.full + 2*preds$se.fit  

ggplot(df,aes(x = score, y = pass)) + 
    facet_wrap(~location) + 
    geom_point() + 
    geom_ribbon(data = new.data,aes(y = pred.full, ymin = ymin, ymax = ymax),alpha = 0.25) +
    geom_line(data = new.data,aes(y = pred.full),colour = "blue")

在此輸入圖像描述

這伴隨着關於擬合值的間隔的通常警告:由您確定您正在繪制的間隔是您真正想要的。 關於“預測間隔”往往存在很多混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM