# Regression Variance Inflation Factor (VIF)

**URL:** <https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233>\
**Category:** Statistics\
**Tags:** question, glm\
**Created:** [April 29, 2021, 11:12am UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233 "2021-04-29T11:12:18Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Storopoli](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/storopoli/32/209278_2.png) [@Storopoli](https://discourse.julialang.org/u/Storopoli)\
**Post date:** [April 29, 2021, 11:12am UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233/1 "2021-04-29T11:12:18Z")

</div>

Hello, how do I check for VIF [Variance inflation factor - Wikipedia](https://en.wikipedia.org/wiki/Variance_inflation_factor) in a GLM.jl `lm` model? I went through the JuliaStats org repositories and package documentations and could not find anything.

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [April 29, 2021, 9:20pm UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233/2 "2021-04-29T21:20:37Z")

</div>

Hey. The following works w/ GLM:

```julia
using DataFrames, GLM

# Make data
N=10_000; 
X0 = ones(N); X1=randn(N); X2=randn(N); X3=randn(N); ε = randn(N);
β_0 = 4.0; β_1 = 2.0; β_2 =10.5; β_3 =-9.5; σ_ε =1.0;
y = β_0*X0 .+ β_1*X1 .+ β_2*X2 .+ β_3*X3 .+ σ_ε*ε
X = [one.(X1) X1 X2 X3] 
d = DataFrame(X1=X1, X2=X2, X3=X3, y=y)

# linear algebra
β_LS = X \ y

# GLM
m_y = lm(@formula(y ~ 1 + X1 + X2 + X3), d)
m_X1 = lm(@formula(X1 ~ 1 + X2 + X3), d)
m_X2 = lm(@formula(X2 ~ 1 + X1 + X3), d)
m_X3 = lm(@formula(X3 ~ 1 + X1 + X2), d)

vif_X1 = 1.0/(1.0-r2(m_X1))
vif_X2 = 1.0/(1.0-r2(m_X2))
vif_X3 = 1.0/(1.0-r2(m_X3))

```

---

<div class="post-metadata">

**Author:** ![Storopoli](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/storopoli/32/209278_2.png) [@Storopoli](https://discourse.julialang.org/u/Storopoli)\
**Post date:** [April 29, 2021, 9:30pm UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233/3 "2021-04-29T21:30:56Z")

</div>

Ok, so it has to be done by hand…

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [April 29, 2021, 9:43pm UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233/4 "2021-04-29T21:43:10Z")

</div>

1. Correct. GLM.jl currently does not have a `vif` function.
2. [RegTools](https://github.com/wakakusa/RegTools).jl, has it, but is no longer maintained…
3. It’s easy to do w/ linear algebra or to define your own function

```julia
using Statistics, LinearAlgebra
vifm = diag(inv(cor(X[:,2:end])))
vifm ≈ [vif_X1; vif_X2; vif_X3;] # verify result above

# own function 
vif_GLM(mod) = diag(inv(cor(mod.model.pp.X[:,2:end])))

julia> vif_GLM(m_y) ≈ vifm ≈ [vif_X1; vif_X2; vif_X3;]
true

```

---

<div class="post-metadata">

**Author:** ![Albert\_Zevelev](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/albert_zevelev/32/11844_2.png) [@Albert\_Zevelev](https://discourse.julialang.org/u/Albert_Zevelev)\
**Post date:** [April 29, 2021, 9:56pm UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233/5 "2021-04-29T21:56:15Z")

</div>

Try w/ “real” data:

```julia
using DataFrames, GLM, Statistics, LinearAlgebra, RDatasets 
airquality = rename(dataset("datasets", "airquality"), "Solar.R" => "Solar_R")
#
y = airquality.Wind
X1 = airquality.Temp    
X2 = airquality.Solar_R  
X3 = airquality.Ozone 
d = DataFrame(X1=X1, X2=X2, X3=X3, y=y)
d = d[completecases(d), :]
X = [one.(d.X1) d.X1 d.X2 d.X3] .|> Float64
y = d.y .|> Float64
#
β_LS = X \ y
vifm = diag(inv(cor(X[:,2:end])))
#
m_y = lm(@formula(y ~ 1 + X1 + X2 + X3), d)
m_X1 = lm(@formula(X1 ~ 1 + X2 + X3), d)
m_X2 = lm(@formula(X2 ~ 1 + X1 + X3), d)
m_X3 = lm(@formula(X3 ~ 1 + X1 + X2), d)

vif_X1 = 1.0/(1.0-r2(m_X1))
vif_X2 = 1.0/(1.0-r2(m_X2))
vif_X3 = 1.0/(1.0-r2(m_X3))
#
vifm ≈ [vif_X1; vif_X2; vif_X3;]
#
vif_GLM(mod) = diag(inv(cor(mod.model.pp.X[:,2:end])))
vif_GLM(m_y) ≈ vifm ≈ [vif_X1; vif_X2; vif_X3;]

```

---

<div class="post-metadata">

**Author:** ![Storopoli](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/storopoli/32/209278_2.png) [@Storopoli](https://discourse.julialang.org/u/Storopoli)\
**Post date:** [April 30, 2021, 1:03am UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233/6 "2021-04-30T01:03:10Z")

</div>

Thank you!

---

<div class="post-metadata">

**Author:** ![math4mad](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/math4mad/32/49486_2.png) [@math4mad](https://discourse.julialang.org/u/math4mad)\
**Post date:** [August 31, 2023, 5:16pm UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233/7 "2023-08-31T17:16:11Z")

</div>

Wrap R function

```julia
    using RCall
    formula=@formula(Price~Baths+Beds+Size+Lot)
     function computing_vif(data::AbstractDataFrame,formula::FormulaTerm)
        @rput data;@rput formula
        R"""
            library(car)
            model <- lm(formula, data = data)
            vif_data=vif(model)
        """
        return @rget vif_data
     end

```

---

<div class="post-metadata">

**Author:** ![nalimilan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nalimilan/32/147_2.png) [@nalimilan](https://discourse.julialang.org/u/nalimilan)\
**Post date:** [September 1, 2023, 5:54am UTC](https://discourse.julialang.org/t/regression-variance-inflation-factor-vif/60233/8 "2023-09-01T05:54:45Z")

</div>

A pure-Julia solution is:

```julia
using MixedModelsExtras
vif(my_glm_model)
# or
gvif(my_glm_model, scale = true) # This produces GVIF^(1/(2*Df))

```

See discussion at [Add VIF? · Issue #428 · JuliaStats/GLM.jl · GitHub](https://github.com/JuliaStats/GLM.jl/issues/428) and linked issues.
