[R-es] Construir matriz de distancias

Marcelino de la Cruz Rot m@rcelino@del@cruz @ending from urjc@e@
Vie Sep 7 10:33:07 CEST 2018


Hola Juan,

# No conozco ninguna función que haga lo que propones, pero no es muy 
difícil implementarlo en R.
# Suponiendo que estos son tus datos de partida,

x0<- c("cansado", "cansadisimo","cansau","reventado","reventao",NA,"canso")
namesx0<-LETTERS[1:7]


# Lo de los NA's deberías resolverlo (eliminarlos) al principio, es decir:

ok<-!is.na(x0)
x0.ok<-x0[ok]
namesx0.ok<-namesx0[ok]



# Una vez eliminados, como aline() calcula distancias entre elementos 
pareados de dos vectores, lo primero que tienes que hacer es justamente 
crear esos vectores con todos los valores pareados con todos
x<- rep(x0.ok, length(x0.ok))
y<-rep(x0.ok, each=length(x0.ok))

# es decir,
cbind(x,y)

# ahora calculas la distancia aline entre los elementos
cosa<-aline(w1=x,w2=y)

# y lo formateas coo matriz simétrica

cosa.m<- matrix(cosa, nr=length(x0.ok),nc=length(x0.ok))
cosa.m


# le pones los nombres a las filas y columnas
dimnames(cosa.m)<-list(namesx0.ok, namesx0.ok)
cosa.m

# y lo presentas como matriz de distancias.
as.dist(cosa.m)



Aunque ya puestos, ¿porqué no implementarlo como una función?:



aline.dist<- function(x0, namesx0){
    require(alineR)
    ok<-!is.na(x0)

    x0.ok<-x0[ok]
    namesx0.ok<-namesx0[ok]
    x<- rep(x0.ok, length(x0.ok))
    y<-rep(x0.ok, each=length(x0.ok))

    cosa<-aline(w1=x,w2=y)

    cosa.m<- matrix(cosa, nr=length(x0.ok),nc=length(x0.ok))
   dimnames(cosa.m)<-list(namesx0.ok, namesx0.ok)
   return(as.dist(cosa.m))

}


# A ver qué tal:

aline.dist(x0, namesx0)

Hmm, seguro que salen unos dendrogramas muy interesantes ;-)

plot(hclust(aline.dist(x0, namesx0)))




Saludos,

Marcelino


El 07/09/2018 a las 8:35, Juan Abasolo escribió:
> ¡Buenas, listeros!
>
> Supongo que lo que planteo es muy básico, pero estoy trabado y no lo veo.
>
> Tengo una función que da la distancia lingüística ALINE, alineR::aline(),
> pero que no genera matrices.
>
> Tengo que hacer matrices de distancias ALINE de unos datos tipo esto:
>
> A cansado
> B cansadísimo
> C cansau
> D reventado
> E reventao
> F NA
> G canso
>
> alineR::aline("cansado", "cansado")
> # 0
>
> Necesito así, as.dist(miresultado)...
>   A B C D ...
> A 0
> B 0.2 0
> C 0.1 0 0
> D 0.9 0.89 0
> ...
>
> No sé si le puedo explicar a la función dist() o a alguna amiga suya que
> method = "ALINE" quiere decir que use la función `aline()`. O si tengo que
> intentar reinventar la rueda, pero con alineR::aline(x).
>
> También capaz que pueda evitar que aparezcan los NA sin mellar el trabajo.
>
> Gracias por la pacencia.
>

-- 
Marcelino de la Cruz Rot
Depto. de Biología y Geología
Física y Química Inorgánica
Universidad Rey Juan Carlos
Móstoles España



Más información sobre la lista de distribución R-help-es