为了解决数据中的异方差性,我使用异方差一致(“稳健”)标准误进行回归。我使用了 SPSS,但据我目前所知,它只能输出以下值(列): 我还想报告 i) 标准化贝塔值和置信区间,ii) 容差和 iii) VIF。有没有办法用 R 获得这些值?具有稳健 SE 的参数估计的 R 输出,例如使用三明治包似乎并不容易提供它们。我希望能够生成一个类似于此图中第一个表的表: ,但另外还有 beta 的置信区间(而不是非标准化系数)。
提前非常感谢!每一点点都有帮助。
从 SPSS 到 R 一开始会很困难,当您习惯于直接从默认输出获取进行回归诊断所需的系数时。但是,您使用 R 的时间越多,您就越能认识到它通过提供丰富的可能性和选项所提供的自由。
以下是获得您想要的结果的方法:
#------------------------
# Load required packages
#------------------------
library (dplyr)
library (car)
#------------------------
# Fit a linear regression model (using the iris dataset in this example)
# Sepal.Length is the dependent variable
# Sepal.Width, Petal.Length, Petal.Width are the independent variables (predictors)
#------------------------
fit <- iris %>%
lm (Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data=.)
#------------------------
# Create an object containing the model summary information
#------------------------
mod_summary <- summary (fit)
#------------------------
# Create a data.frame containing 95%CIs for Estimate
#------------------------
conf_ints <- confint (fit, level = 0.95) |>
as.data.frame () |>
tibble::rownames_to_column("Variables") |> # make rownames a column called "Variables"
`colnames<-`(c("Variables", "95%CI_low", "95%CI_hi")) # set column names
#------------------------
# Create a data.frame containing VIF & Tolerance
#------------------------
VIF_tol = vif(fit) |> # calculate VIF
as.data.frame () |>
tibble::rownames_to_column("Variables") |>
mutate (Tolerance = 1/`vif(fit)`) |> # calculate Tolerance given by 1/VIF
`colnames<-`(c("Variables", "VIF", "Tolerance"))
#------------------------
# Put it all together using left_join by "Variables", format & arrange columns
#------------------------
output <- mod_summary$coefficients |>
as.data.frame () |>
tibble::rownames_to_column("Variables") |>
left_join (conf_ints, by = "Variables") |> # left_join with conf_ints data.frame
left_join (VIF_tol, by = "Variables") |> # left_join with VIF_tol data.frame
mutate (across(c(2:4, 6:9), .fns = function(x) {format(round(x, 2), nsmall = 2)})) |> # set decimal numbers for all columns (except p-values) to 2
relocate (`95%CI_low`, .after = Estimate) |>
relocate (`95%CI_hi`, .after = `95%CI_low`)
output[ ,7] <- format.pval(output[ ,7], eps = .001, digits = 3) # format small p-values < 0.001 nicely
output
Variables Estimate 95%CI_low 95%CI_hi Std. Error t value Pr(>|t|) VIF Tolerance
1 (Intercept) 1.86 1.36 2.35 0.25 7.40 <0.001 NA NA
2 Sepal.Width 0.65 0.52 0.78 0.07 9.77 <0.001 1.27 0.79
3 Petal.Length 0.71 0.60 0.82 0.06 12.50 <0.001 15.10 0.07
4 Petal.Width -0.56 -0.81 -0.30 0.13 -4.36 <0.001 14.23 0.07