2009-12-01 3 views
0

J'essaye d'écrire une fonction qui utilise la méthode de Newton (coefficients+(inverse hessian)*gradient) pour trouver itérativement les coefficients pour un modèle log-linéaire.Problèmes avec la méthode de Newton pour trouver le coefficient et le hessien

J'utilise le code suivant:

##reading in the data 
    dat<-read.csv('hw8.csv') 
    summary(dat) 
    # data file containing yi and xi 
    attach(dat) 
    ##Creating column of x's 
    x<-cbind(1,xi) 

    mle<-function(c){ 
    gi<- 1-yi*exp(c[1]+c[2]*xi) 
    hi<- gi-1 
    H<- -1*(t(x)%*%hi%*%x) 
    g<-t(x)%*%gi 
    c<-c+solve(H)%*%g 
     return(c) 
    } 

    optim(c(0,1),mle,hessian=TRUE) 

Quand je lance le code, je reçois l'erreur suivante:

Error in t(x) %*% hi %*% x : non-conformable arguments 
RMate stopped at line 29 

Étant donné que la formule est tirée de l'ensemble des problèmes de Bill Greene, je ne pense pas que c'est un problème de formule. Je pense que je fais quelque chose de mal en passant ma fonction.

Comment puis-je résoudre ce problème?
Toute aide concernant cette fonction serait grandement appréciée.

+0

Vous devez indiquer la langue dans les balises. –

+0

Merci pour le commentaire. exp est une fonction de ligne de base pour les exponentielles dans r et yi et xi sont des colonnes dans la matrice de données de données intitulée dat –

+3

Les dimensions de votre opération sont erronées. Pouvez-vous juste imprimer les dimensions de 'x' et' hi' en utilisant 'dim'? –

Répondre

2

Comme Jonathan a dit dans les commentaires, vous avez besoin des dimensions appropriées:

R> X <- matrix(1:4, ncol=2) 
R> t(X) %*% X 
    [,1] [,2] 
[1,] 5 11 
[2,] 11 25 
R> 

Mais vous devriez également utiliser les outils appropriés alors regardez peut-être à la fonction loglin dans le paquet stats, et/ou la fonction loglm dans le paquet MASS. Les deux seront installés par défaut avec votre installation R.