2015-10-26 1 views
0

Je souhaite construire une fonction qui calcule l'entropie relative entre deux distributions de probabilité discrètes.Fonction d'entropie relative dans R

La tentative suivante fonctionne:

H <- function(p1, p2, p3 = 1 - p1 - p2, q1, q2, q3 = 1 - q1 - q2) { 
     p <- c(p1, p2, p3) 
     q <- c(q1, q2, q3) 
     return(sum(log(p^p) - log(q^p))) 
} 

mais je voulais simplifier afin que les arguments étaient juste le vecteur:

D<-function(x,y){ 
    return(sum(log(x^x)-log(y^x))) 
} 

qui ne fonctionne pas. Quel est le problème ici? Ne pouvez-vous pas définir des fonctions avec des entrées qui sont des vecteurs?

Exemple:

a<-c(0.2,0.5,0.3) 
b<-c(0.4,0.4,0.2) 

puis

H(0.2,0.5,0.3,0.4,0.4,0.2) 
0.094 

qui est correct, mais:

D(a,b) 
Inf 

qui n'est pas correct

+0

Veuillez montrer un exemple de données. Et quel message d'erreur obtenez-vous? –

+0

Je ne comprends pas le résultat de votre 'D (a, b)'. J'ai essayé votre définition de 'D' et les données pour' a' et 'b' et' D (a, b) 'ont donné:' [1] 0.09458187'. – Bhas

Répondre

1

Cela fonctionne:

p1 <- 1 
p2 <- 2 
q1 <- 4 
q2 <- 5 

H <- function(p1, p2, q1, q2){ 
    p3 <- 1 - p1 - p2 
    q3 <- 1 - q1 - q2 
    p <- c(p1, p2, p3) 
    q <- c(q1, q2, q3) 
    return(sum(log(p^p) - log(q^p))) 
} 
H(p1, p2, q1, q2) 
# [1] -0.4462871 

x <- c(p1, p2, 1 - p1 - p2) 
y <- c(q1, q2, 1 - q1 - q2) 

D <- function(x, y){ 
    return(sum(log(x^x)-log(y^x))) 
} 
D(x, y) 
# [1] -0.4462871 
+0

merci, donc juste pour clarifier je dois définir la forme de mes arguments avant de définir la fonction? pourquoi D ne fonctionne qu'après avoir spécifié la forme de x, y? – dimebucker91

+0

'D (c (p1, p2, 1 - p1 - p2), c (q1, q2, 1 - q1 - q2))' fonctionne également. –