J'ai trouvé une particularité lors de l'utilisation de Predict et de la fonction lm dans R. J'ai obtenu des résultats différents pour la trame de données et le vecteur pour les mêmes données.
Code du cadre de données:
data(mtcars)
fitCar<-lm(mtcars$mpg~mtcars$wt)
predict(fitCar,
data.frame(x=mean(mtcars$wt)),
interval="confidence")
Sortie:
fit lwr upr
1 23.282611 21.988668 24.57655
2 21.919770 20.752751 23.08679
3 24.885952 23.383008 26.38890
4 20.102650 19.003004 21.20230
5 18.900144 17.771469 20.02882
6 18.793255 17.659216 19.92729
7 18.205363 17.034274 19.37645
8 20.236262 19.136179 21.33635
9 20.450041 19.347720 21.55236
10 18.900144 17.771469 20.02882
11 18.900144 17.771469 20.02882
12 15.533127 14.064349 17.00190
13 17.350247 16.104455 18.59604
14 17.083024 15.809403 18.35664
15 9.226650 6.658271 11.79503
16 8.296712 5.547468 11.04596
17 8.718926 6.052112 11.38574
18 25.527289 23.927797 27.12678
19 28.653805 26.519252 30.78836
20 27.478021 25.554415 29.40163
21 24.111004 22.715653 25.50635
22 18.472586 17.319886 19.62529
23 18.926866 17.799465 20.05427
24 16.762355 15.452833 18.07188
25 16.735633 15.423002 18.04826
26 26.943574 25.112491 28.77466
27 25.847957 24.198041 27.49787
28 29.198941 26.963760 31.43412
29 20.343151 19.242185 21.44412
30 22.480940 21.268498 23.69338
31 18.205363 17.034274 19.37645
32 22.427495 21.219818 23.63517
Message d'alerte:
'newdata' a 1 ligne mais les variables trouvées ont 32 lignes
Quand je sépare les deux données en vecteur, je reçois une réponse différente
Code pour le vecteur
predict(fit,data.frame(x=mean(x)), interval="confidence")
Sortie:
fit lwr upr
1 20.09 18.99 21.19
Quelle est la raison de cette différence?
Il s'agit d'un problème d'utilisation de noms différents entre votre data
et votre newdata
et non d'un problème entre l'utilisation de vecteurs ou de cadres de données.
Lorsque vous adaptez un modèle à la fonction lm
et utilisez ensuite predict
pour faire des prédictions, predict
essaie de trouver les mêmes noms sur votre newdata
. Dans votre premier cas, x
entre en conflit avec mtcars$wt
et vous obtenez donc l'avertissement.
Voir ici une illustration de ce que je dis:
C'est ce que vous avez fait et n'avez pas eu d'erreur:
a <- mtcars$mpg
x <- mtcars$wt
#here you use x as a name
fitCar <- lm(a ~ x)
#here you use x again as a name in newdata.
predict(fitCar, data.frame(x = mean(x)), interval = "confidence")
fit lwr upr
1 20.09062 18.99098 21.19027
Vérifiez que dans ce cas, vous adaptez votre modèle en utilisant le nom x et vous utilisez également le nom x dans votre newdata
. De cette façon, vous n'obtenez aucun avertissement et c'est ce que vous attendez.
Voyons ce qui se passe quand je change le nom en autre chose quand je correspond au modèle:
a <- mtcars$mpg
#name it b this time
b <- mtcars$wt
fitCar <- lm(a ~ b)
#here I am using name x as previously
predict(fitCar, data.frame(x = mean(x)), interval = "confidence")
fit lwr upr
1 23.282611 21.988668 24.57655
2 21.919770 20.752751 23.08679
3 24.885952 23.383008 26.38890
4 20.102650 19.003004 21.20230
5 18.900144 17.771469 20.02882
Warning message:
'newdata' had 1 row but variables found have 32 rows
La seule chose que je faisais maintenant était de changer le nom x
lors de l'ajustement du modèle à b
, puis de le prédire en utilisant le nom x
dans le newdata
. Comme vous pouvez le voir, j'ai la même erreur que dans votre question.
J'espère que c'est clair maintenant!
Dans la formule de la fonction lm, ne faites pas référence aux variables utilisant le modèle nom_ensemble_données $ nom_variable. Utilisez plutôt variablename + variablename ... Cela ne jettera pas l'avertissement: 'newdata' a nrow (test) row mais les variables trouvées ont nrow (train) rangées.
Une façon de contourner cela sans se faire de noms est d'utiliser les éléments suivants:
fitCar<-lm(mpg ~ wt, mtcars) #here you use x as a name
predict(fitCar,data.frame(wt=mean(mtcars$wt)), interval="confidence")
J'ai eu le même problème lorsque j'utilisais le nom de variable conjointement avec le nom de données avec l'utilisation du signe $
.
Donc au lieu de:
fitCar<-lm(mtcars$mpg~mtcars$wt)
predict(fitCar,
data.frame(x=mean(mtcars$wt)),
interval="confidence")
Utilisez ceci:
fitCar<-lm(mpg~wt , data = mtcars)
predict(fitCar,
wt = mean(mtcars$wt), interval = "confidence")