web-dev-qa-db-fra.com

Erreur dans R: arguments non conformes. Pas vrai?

voici mon code:

    #define likelihood function (including an intercept/constant in the function.)
lltobit <- function(b,x,y) {
  sigma <-  b[3]
  y  <- as.matrix(y)
  x <- as.matrix(x)
  vecones <- rep(1,nrow(x)) 
  x <- cbind(vecones,x)
  bx <- x %*% b[1:2] 
  d <- y != 0 
  llik <- sum(d * ((-1/2)*(log(2*pi) + log(sigma^2) + ((y - bx)/sigma)^2)) 
              + (1-d) * (log(1 - pnorm(bx/sigma))))
  return(-llik)
}

n <- nrow(censored) #define number of variables 
y <- censored$y #define y and x for easier use
x1 <- as.matrix(censored$x)
x <-  cbind(rep(1,n),x1) #include constant/intercept 
bols <- (solve(t(x) %*% x)) %*% (t(x) %*% y) #compute ols estimator (XX) -1 XY
init <- rbind(as.matrix(bols[1:nrow(bols)]),1) #initial values 

init

tobit1 <- optim(init, lltobit, x=x, y=y, hessian=TRUE, method="BFGS")

où censuré est ma table de données, y compris 200 valeurs (censurées) de y et 200 valeurs de x.

Tout fonctionne, mais lors de l'exécution de la commande optim, j'obtiens l'erreur suivante:

tobit1 <- optim(init, lltobit, x=x, y=y, hessian=TRUE, method="BFGS")
Error in x %*% b[1:2] : non-conformable arguments

Je sais ce que cela signifie, mais comme x est une matrice de 200 x 2 et b [1: 2] un vecteur de 2 par 1, qu'est-ce qui ne va pas? J'ai essayé de transposer les deux, ainsi que le vecteur des valeurs initiales, mais rien ne fonctionne. Quelqu'un peut-il m'aider?

7
pk_22

Je suis tombé sur un problème similaire aujourd'hui (erreur "arguments non conformes", même si tout semblait OK), et la solution dans mon cas était dans les règles de base pour la multiplication matricielle: ie nombre de colonnes du gauche matrice doit être le même que le nombre de lignes de la droite matrice = J'ai dû changer l'ordre dans l'équation de multiplication. En d'autres termes, dans la multiplication matricielle (contrairement à la multiplication ordinaire), A %*% B n'est pas la même chose que B %*% A.

7
Jan

J'offre un cas en régression en composantes principales (PCR) dans R, aujourd'hui j'ai rencontré ce problème lors de l'ajustement des données de test avec le modèle. il a renvoyé une erreur:

> pcr.pred = predict(pcr.fit, test.data, ncomp=6)
Error in newX %*% B[-1, , i] : non-conformable arguments
In addition: Warning message:

Le problème était que les données de test ont un nouveau niveau qui n'était pas auparavant contenu dans les données du train. Pour trouver quel niveau a le problème:

cols = colnames(train)
for (col in cols){
  if(class(ori.train[[col]]) == 'factor'){
    print(col)
    print(summary(train[[col]]))
    print(summary(test[[col]]))
  }
}

Vous pouvez vérifier quels attributs gênants ont ce nouveau niveau, puis vous pouvez remplacer ce "nouvel" attribut par d'autres valeurs communes, enregistrer les données avec write.csv et le recharger, et vous pouvez exécuter la prédiction de PCR.

0
Pistachio Guoguo