Exemple avec R: Hédonique

Le calcul d’un indice de prix hédonique linéaire est très facile dans R.

# Apportez quelques données
df <- read.csv("csv/data.csv")
df
##    period price chicken liver salmon
## 1       0     2       1     0      0
## 2       0     4       1     0      0
## 3       0     3       1     0      0
## 4       0     4       1     0      0
## 5       0     5       1     0      0
## 6       0     1       0     1      0
## 7       0     3       0     1      0
## 8       0     2       0     1      0
## 9       0     1       0     1      0
## 10      0     1       0     1      0
## 11      0     5       0     0      1
## 12      0     7       0     0      1
## 13      0     8       0     0      1
## 14      0     4       0     0      1
## 15      1     5       1     0      0
## 16      1     3       1     0      0
## 17      1     2       0     1      0
## 18      1     2       0     1      0
## 19      1     1       0     1      0
## 20      1     3       0     1      0
## 21      1     1       0     1      0
## 22      1     1       0     1      0
## 23      1     9       0     0      1
## 24      1     8       0     0      1
## 25      1     5       0     0      1

Il s’agit d’un ensemble de données simple pour la nourriture pour chat, avec trois caractéristiques — est-ce de la nourriture pour chat de poulet, de la nourriture pour chat de foie ou de la nourriture pour chat de saumon? Pour évaluer l’impact d’un indice de prix hédonique, il est utile de calculer un indice de prix de transaction simple en regroupant les transactions pour les trois types d’aliments pour chats ensemble.

# Calculer l'indice de prix commun
pooled <- lm(log(price) ~ period, df)
exp(coef(pooled)[2]) * 100
##   period 
## 93.86748

L’indice hédonique linéaire général est facile à calculer avec une simple régression linéaire. La seule astuce consiste à se souvenir de supprimer la moyenne de chaque caractéristique dans le terme d’interaction.

# Calculer l'indice d'imputation hédonique
hedonic_imputation <- lm(log(price) ~ period + liver + salmon + 
                           period:(I(liver - mean(liver)) + I(salmon - mean(salmon))), 
                         df)
exp(coef(hedonic_imputation)[2]) * 100
##   period 
## 112.2817

C’est le même que le calcul en deux étapes qui est normalement effectué pour un indice d’imputation hédonique.

# Régression période 0
hi0 <- lm(log(price) ~ liver + salmon, df, subset = period == 0)

# Régression de la période 1
hi1 <- lm(log(price) ~ liver + salmon, df, subset = period == 1)

# Calculer l'indice à l'aide des prix prévus
exp(mean(predict(hi1, df) - predict(hi0, df))) * 100
## [1] 112.2817

C’est également la même chose que le calcul manuel de l’indice stratifié.

# Apportez dans la bibliothèque gpindex
library(gpindex)

# Poids de la nourriture pour chats par sa fréquence
weights <- colSums(df[-(1:2)])

# Calculer un indice pour chaque type de nourriture pour chat
strata_indices <- 
  sapply(list(subset(df, chicken == 1), 
              subset(df, liver == 1), 
              subset(df, salmon == 1)),
         function(x) with(x, geometric_mean(price[period == 1]) / geometric_mean(price[period == 0]))
         )

# Agrégat
geometric_mean(strata_indices, weights) * 100
## [1] 112.2817

Les résultats sont très similaires si un modèle temporel est utilisé à la place.

# Indice temporel factice
time_dummy <- lm(log(price) ~ period + liver + salmon, df)
exp(coef(time_dummy)[2]) * 100
##   period 
## 112.2246

L’ajout de pondérations pour les transactions dans chaque strate peut facilement être effectué avec une régression pondérée.

# Faites des poids
df$weights <- 1:25 / sum(1:25)

# Calculer l'indice d'imputation hédonique pondéré
hedonic_imputation <- lm(log(price) ~ period + liver + salmon + 
                           period:(I(liver - weighted.mean(liver, weights)) + 
                                   I(salmon - weighted.mean(salmon, weights))), 
                         df, weights = weights)
exp(coef(hedonic_imputation)[2]) * 100
##   period 
## 111.1855

Cela donne la même réponse que le calcul en deux étapes.

# Régression période 0
hi0 <- lm(log(price) ~ liver + salmon, df, subset = period == 0, weights = weights)

# Régression de la période 1
hi1 <- lm(log(price) ~ liver + salmon, df, subset = period == 1, weights = weights)

# Calculer l'indice à l'aide de prix prédits pondérés
exp(weighted.mean(predict(hi1, df) - predict(hi0, df), df$weights)) * 100
## [1] 111.1855