D'Inflation de la Variance du Facteur en Python
Je suis en train de calculer le facteur d'inflation de la variance (VIF) pour chaque colonne dans un simple jeu de données dans python:
a b c d
1 2 4 4
1 2 6 3
2 3 7 4
3 2 8 5
4 1 9 4
J'ai déjà fait cela dans R en utilisant le vif fonction de la usdm bibliothèque qui donne les résultats suivants:
a <- c(1, 1, 2, 3, 4)
b <- c(2, 2, 3, 2, 1)
c <- c(4, 6, 7, 8, 9)
d <- c(4, 3, 4, 5, 4)
df <- data.frame(a, b, c, d)
vif_df <- vif(df)
print(vif_df)
Variables VIF
a 22.95
b 3.00
c 12.95
d 3.00
Cependant, lorsque je fais la même chose en python à l'aide de la statsmodel vif fonction, mes résultats sont:
a = [1, 1, 2, 3, 4]
b = [2, 2, 3, 2, 1]
c = [4, 6, 7, 8, 9]
d = [4, 3, 4, 5, 4]
ck = np.column_stack([a, b, c, d])
vif = [variance_inflation_factor(ck, i) for i in range(ck.shape[1])]
print(vif)
Variables VIF
a 47.136986301369774
b 28.931506849315081
c 80.31506849315096
d 40.438356164383549
Les résultats sont très différents, même si les entrées sont les mêmes. En général, les résultats de l'statsmodel VIF fonction semblent être mauvais, mais je ne sais pas si c'est parce que de la façon dont je l'appelle ou si c'est un problème avec la fonction elle-même.
J'espérais que quelqu'un pourrait m'aider à comprendre si j'ai eu tort d'appeler la statsmodel fonction ou d'expliquer les écarts dans les résultats. Si c'est un problème avec la fonction alors, y a-VIF alternatives en python?
OriginalL'auteur Nizag | 2017-03-07
Vous devez vous connecter pour publier un commentaire.
Je crois que la raison pour cela est dû à une différence de Python LO. LO, qui est utilisé dans le python d'inflation de la variance du facteur de calcul, ne pas ajouter une interception par défaut. Vous voulez certainement une interception dans la il cependant.
Ce que vous voulez faire est d'ajouter une colonne à votre matrice, ck, rempli avec ceux de représenter une constante. Ce sera le terme constant de l'équation. Une fois que ceci est fait, vos valeurs doivent correspondre correctement.
Modifié: remplacer les zéros avec ceux
faute de frappe: colonne constante doit être rempli avec (pas de zéros).
Bon appel sur mon erreur de frappe. Édité mon post original avec le correctif.
Qui fait sens. Ajout d'une colonne de 1s a fait le tour. Merci!
OriginalL'auteur Drverzal
Comme mentionné par d'autres, et dans ce post par Josef Perktold, la fonction de l'auteur,
variance_inflation_factor
s'attend à la présence d'une constante dans la matrice des variables explicatives. On peut utiliseradd_constant
de statsmodels pour ajouter la constante pour le dataframe avant de transmettre ses valeurs à la fonction.Je crois que vous pourriez aussi ajouter la constante de la colonne la plus à droite de la dataframe à l'aide de
assign
:Le code source en lui même est plutôt concis:
Il est également assez simple de modifier le code pour renvoyer tous les Expédie en tant que série:
X = add_constant(df.dropna())
dans le cas de valeurs manquantes.OriginalL'auteur Alexander
Pour les futurs arrivants à ce fil (comme moi):
Ce code donne
[MODIFIER]
En réponse à un commentaire, j'ai essayé d'utiliser
DataFrame
autant que possible (numpy
est nécessaire pour inverser une matrice).Le code donne
Les éléments de la diagonale donner VIF.
Semble bon. Pour obtenir exactement l'Expédie en tant que Série:
vifs = pd.Series(np.linalg.inv(df.corr().values).diagonal(), index=df_cor.index)
OriginalL'auteur T_T
Exemple pour Boston Données:
VIF est calculée par les auxiliaires de régression, donc ne dépend pas de la réelle ajustement.
Voir ci-dessous:
OriginalL'auteur Saqib Mujtaba
Dans le cas où vous ne voulez pas traiter avec
variance_inflation_factor
etadd_constant
et veux juste utiliser la formule. Veuillez considérer la fonction suivante.OriginalL'auteur steven
J'ai écrit cette fonction basée sur quelques autres postes que j'ai vu sur Pile et CrossValidated. Il montre les caractéristiques qui sont supérieures à ce seuil et retourne une nouvelle dataframe avec les fonctionnalités supprimées.
OriginalL'auteur Chef1075