web-dev-qa-db-fra.com

Erreur dans la structure de données * tmp * remplacement a x données a y

Je suis débutant en R. Voici un code très simple dans lequel j'essaie de sauvegarder le terme résiduel:

# Create variables for child's EA:

dat$cldeacdi <- rowMeans(dat[,c('cdcresp', 'cdcinv')],na.rm=T)
dat$cldeacu <- rowMeans(dat[,c('cucresp', 'cucinv')],na.rm=T)

# Create a residual score for child EA:

dat$cldearesid <- resid(lm(cldeacu ~ cldeacdi, data = dat))

Je reçois le message suivant:

Error in `$<-.data.frame`(`*tmp*`, cldearesid, value = c(-0.18608488908881,  : 
  replacement has 366 rows, data has 367

J'ai cherché cette erreur mais je n'ai rien trouvé qui puisse résoudre ce problème. De plus, j'ai créé exactement le même code pour l'évaluation environnementale de la mère, ce qui a permis de conserver parfaitement le résidu, sans aucune erreur. Je serais reconnaissant si quelqu'un pouvait m'aider à résoudre ce problème.

9
Marishka Usacheva

J'ai l'impression que vous avez NAs dans vos données. Regardez cet exemple:

#mtcars data set
test <- mtcars
#adding just one NA in the cyl column
test[2, 2] <- NA

#running linear model and adding the residuals to the data.frame
test$residuals <- resid(lm(mpg ~ cyl, test))
Error in `$<-.data.frame`(`*tmp*`, "residuals", value = c(0.382245430809409,  : 
  replacement has 31 rows, data has 32

Comme vous pouvez le constater, cela entraîne une erreur similaire à la votre.

En guise de validation:

length(resid(lm(mpg ~ cyl, test)))
#31
nrow(test)
#32

Cela se produit parce que lm exécutera na.omit Sur le jeu de données avant d'exécuter la régression. Ainsi, si vous avez des lignes avec NA, celles-ci seront éliminées, ce qui donnera moins de résultats.

Si vous exécutez na.omit Sur votre ensemble de données dat (c'est-à-dire dat <- na.omit(dat)] au tout début de votre code, votre code devrait alors fonctionner.

11
LyzandeR

C'est un vieux fil, mais cela peut peut-être aider quelqu'un d'autre confronté au même problème. Au point de vue de LyzandeR, recherchez NA comme première ligne de défense. De plus, assurez-vous de ne pas avoir de facteurs dans x, car cela peut aussi causer l'erreur.

0
Dawson A. Verley