Codage des valeurs 0

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

amelie lemiale
Messages : 19
Enregistré le : 15 Fév 2007, 17:47

Codage des valeurs 0

Messagepar amelie lemiale » 24 Fév 2007, 15:13

Bonjour,

Ya t il qqun qui peut m'expliquer ces deux messages d'erreur sachant que je travail des series temporelles :
1)-
ADF.test(wts=lcap, itsd=c(1,1,c(0)), regvar=0, selectlags=list(mode=c(1,2), Pmax=NULL))
Erreur dans lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
NA/NaN/Inf dans un appel à une fonction externe (argument 1)

Ma variable est "lcap" est exprimée en log. Mes données vont de 1971 à 2001, mais de 1971 à 1989 ma variable "lcap" est égale à 0 (zéro). Pensez vous que c pour ca que R n'accepte pas le test ADF. Et dans ce cas là comment faut il coder les valeurs 0 pour que je puisse entamer le test?
2)-
Mon test ADF m'indique que la constante n'est pas significative (P value =0.9):
> out <- ADF.test(wts=lcost, itsd=c(1,1,c(0)), regvar=0, selectlags=list(mode="signf", Pmax=NULL))
Warning message:
p-value is greater than printed p-value in: interpolpval(code = code, stat = adfreg[, 3], N = N)
> out@regvarcoefs
Estimate Std. Error t value Pr(>|t|)
Intercept 0.054794931 0.4850685042 0.1129633 0.91089539
Trend -0.001558912 0.0007438563 -2.0957160 0.04561766

Je fais alors un test ADF sans la constante c(0,1,c(0)) au lieu de c(1,1,c(0)) et voila ce que j'obtient:

ADF.test(wts=diff(lcost), itsd=c(0,1,c(0)), regvar=0, selectlags=list(mode="signf", Pmax=NULL))
Erreur dans rep.default(NA, ncol(table)) : rep() type incorrect pour le second argument
Ca veut dire quoi ce message d'erreur?

Merci

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 26 Fév 2007, 05:43

bonjour,

NA/NaN/Inf dans un appel à une fonction externe (argument 1)


Je crois que le message d'erreur est pour une fois assez clair. D'autant plus que tu transformes tes données avec un log alors que tu as des 0. Le log est une fonction qui tend vers -inf en 0. Donc voilà ton erreur. Ce n'est pas R qui ne veut pas faire ton test c'est tout simplement que c'est impossible. Donc à toi de voir comment tu peux coder les 0 suivant tes données mais par exemple une solution est d'utiliser la fonction log1p qui au lieu de faire simplement le log(x) fait log(x+1) donc il n'ya plus de 0 pour le log et mais en sortie tu les retrouve puisque log(1)=0
Pour ta 2ème question, je ne sais pas car je n'ai jamais utilisé ce test. Mais pourquoi utilises tu un diff ? Est ce que ce n'est pas à cet endroit que tu génères des Na en introduisant des valeurs négatives par exemple.

Pour finir quand tu codes ceci :

Code : Tout sélectionner

c(0,1,c(0))
, le

Code : Tout sélectionner

c(0)
est complètement inutile ceci

Code : Tout sélectionner

c(0,1,0)
te fais la même chose.

amelie lemiale
Messages : 19
Enregistré le : 15 Fév 2007, 17:47

Messagepar amelie lemiale » 26 Fév 2007, 16:23

Nicolas Péru a écrit :bonjour,

NA/NaN/Inf dans un appel à une fonction externe (argument 1)


Je crois que le message d'erreur est pour une fois assez clair. D'autant plus que tu transformes tes données avec un log alors que tu as des 0. Le log est une fonction qui tend vers -inf en 0. Donc voilà ton erreur. Ce n'est pas R qui ne veut pas faire ton test c'est tout simplement que c'est impossible. Donc à toi de voir comment tu peux coder les 0 suivant tes données mais par exemple une solution est d'utiliser la fonction log1p qui au lieu de faire simplement le log(x) fait log(x+1) donc il n'ya plus de 0 pour le log et mais en sortie tu les retrouve puisque log(1)=0
Pour ta 2ème question, je ne sais pas car je n'ai jamais utilisé ce test. Mais pourquoi utilises tu un diff ? Est ce que ce n'est pas à cet endroit que tu génères des Na en introduisant des valeurs négatives par exemple.

Pour finir quand tu codes ceci :

Code : Tout sélectionner

c(0,1,c(0))
, le

Code : Tout sélectionner

c(0)
est complètement inutile ceci

Code : Tout sélectionner

c(0,1,0)
te fais la même chose.


Bonjour,
Merci pour ta réponse. En ce qui concerne le codage des variable, je vois pas tres bien comment je peux utiliser la fonction log1p. Au fait la variable (lcap) prend la valeur Zéro de 1971 à 1986 ensuite elle prend des valeurs positives. Ce que j'ai fait est que sur les données EXCEL initiales j'ai remplacé les valeurs 0 par 1,
cap initialement
0
0
0
0
0
cap ensuite
1
1
1
1
1


ce qui fait qu'en sortie (sur un graphique par exemple) j'ai une ligne confondue ave l'axe des abcisses de 1971 à 1986 ensuite une droite croissante qui correspond à logcap. C'est en faisant ainsi que j'ai reussi à faire le test ADF. Je souhaite alors savoir si la méthode est bonne ou pas ?

Pour la fonction log1p, j'ai ecris comme commande :
lcap <- log(1+cap)

Mais je ne sais pas comment lui dire de prendre en considération log(1+cap) uniquement pour la periode entre 1971 et 1986. A parir de 1986 je voudrai revenir a la fonction log et pas log+1.
Sais tu comment le faire ??

Merci
Amélie

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 26 Fév 2007, 16:45

Pour transformer qu'une partie de tes données il suffit de le faire avant en passant par un vecteur intermédiaire où tu ne change que ce qui t'intéresse.
Ceci dit, tu n'as pas vraiment le droit de ne transformer qu'une partie de tes données et ensuite d'analyser tout ça ensemble comme si c'était un seul et même bloc.
log1p fait exactement ce que tu as fait manuellement c'est à dire que cette fonction donne : log(x) = log (x+1) donc ta variable cap passer à 1 lorsqu'elle est initialement égale à 0 et ainsi le log pourra être calculé sans générer de -Inf.
Mais dans tous les cas tu dois appliquer la transformation à TOUT ton jeu de données si tu comptes l'analyser de façon homogène et il semble que c'est ton cas. En fait on ajoute 1 car on suppose que cela n'affecte pas beaucoup les données notamment si tu as des grands effectfis. Mais on pourrait très bien transformer les données en x+1000 pour linéariser l'ensemble du jeu...là c'est sûr on écrase totalement la variabilité :D

pour répondre tout de même à ta question tu pourrais faire :

Code : Tout sélectionner

cap[cap>=1971 & cap<=1986] = log(cap[cap>=1971 & cap<=1986])


c'est u peu brutal mais ça doit marcher...j'ai pas testé.:)
Sinon avec la fonction if tu pourrais t'en sortir aussi ssi tu n'as des valeurs en 0 que sur cette plage chronologique.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité