簡體   English   中英

Plot 線性回歸中每個變量的影響?

[英]Plot the impact for each variable in linear regression?

我想為使用 R 計算的 lm model 創建一個如下所示的 plot。

在此處輸入圖像描述

有一種簡單的方法嗎?

上面的plot是在本頁這里收集的。

Package {caret} 提供了一個方便的方法varImp :示例:

library(caret)
my_model <- lm(mpg ~ disp + cyl, data = mtcars)

## > varImp(my_model)
##
##       Overall
## disp 2.006696
## cyl  2.229809

對於可變重要性的不同度量,請參閱?varImp 將值輸入您選擇的繪圖庫。

額外:{ ggstatsplot } 計算繪制大量 model 對象的大量 model 統計數據。 這包括關於 regression coefficients 的假設,對於該方法ggcoefstats()可能會滿足您的目的(不過請記住縮放預測變量以對系數進行有意義的比較)。

按照鏈接文章中的方法(r 平方的相對邊際增加),您可以編寫自己的 function,它采用公式和數據框,然后繪制相對重要性:

library(ggplot2)

plot_importance <- function(formula, data) {
  
  lhs <- as.character(as.list(formula)[[2]])
  rhs <- as.list(as.list(formula)[[3]])
  vars <- grep("[+\\*]", rapply(rhs, as.character), invert = TRUE, value = TRUE)
  df <- do.call(rbind, lapply(seq_along(vars), function(i) {
    f1 <- as.formula(paste(lhs, paste(vars[-i], collapse = "+"), sep = "~"))
    f2 <- as.formula(paste(lhs, paste(c(vars[-i], vars[i]), collapse = "+"), 
                           sep = "~"))
    r1 <- summary(lm(f1, data = data))$r.squared
    r2 <- summary(lm(f2, data = data))$r.squared
    
    data.frame(variable = vars[i], importance = r2 - r1)
  }))
  
  df$importance <- df$importance / sum(df$importance)
  df$variable <- reorder(factor(df$variable), -df$importance)

  ggplot(df, aes(x = variable, y = importance)) +
    geom_col(fill = "deepskyblue4") +
    scale_y_continuous(labels = scales::percent) +
    coord_flip() +
    labs(title = "Relative importance of variables",
         subtitle = deparse(formula)) +
    theme_classic(base_size = 16)
}

我們可以使用鏈接文章中提供的示例數據對此進行測試:

IV <- read.csv(paste0("https://statisticsbyjim.com/wp-content/uploads/",
                      "2017/07/ImportantVariables.csv"))

plot_importance(Strength ~ Time + Pressure + Temperature, data = IV)

我們看到 plot 是相同的。

我們還可以在一些內置數據集上對其進行測試,以證明其用途是通用的:

plot_importance(mpg ~ disp + wt + gear, data = mtcars)

plot_importance(Petal.Length ~ Species + Petal.Width, data = iris)

reprex package (v2.0.1) 創建於 2022-05-01

剛剛結束使用relaimpo package 並用@Allan Cameron 回答的 ggplot 顯示

library(relaimpo)

relative_importance <- calc.relimp(mymodel, type="lmg")$lmg

df = data.frame(
variable=names(relative_importance),
importance=round(c(relative_importance) * 100,2)
)

ggplot(df, aes(x = reorder(variable, -importance), y = importance)) +
  geom_col(fill = "deepskyblue4") + 
  geom_text(aes(label=importance), vjust=.3, hjust=1.2, size=3, color="white")+
  coord_flip() +
  labs(title = "Relative importance of variables") +
  theme_classic(base_size = 16)

暫無
暫無

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

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