Discussion:
[R-es] Construir matriz de distancias
Juan Abasolo
2018-09-07 06:35:45 UTC
Permalink
¡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.
--
Juan Abasolo

Hizkuntzaren eta Literaturaren Didaktika Saila
Bilboko Hezkuntza Fakultatea
Euskal Herriko Unibertsitatea
UPV/EHU

Sarriena auzoa z/g
48940 Leioa
Bizkaia

[[alternative HTML version deleted]]
Marcelino de la Cruz Rot
2018-09-07 08:33:07 UTC
Permalink
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
Post by Juan Abasolo
¡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.
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
Juan Abasolo
2018-09-07 09:38:38 UTC
Permalink
Me encantaría saber pensar así de una.
Creo que entiendo bien lo que me decís, pero no lo puedo poner en marcha en
mi computadora, por algo que no sé qué será.
Post by Marcelino de la Cruz Rot
cosa<-aline(w1=x,w2=y)
En RStudio me dice que R sufrió algo. Probé directamente desde la consola
Post by Marcelino de la Cruz Rot
cosa<-aline(w1=x,w2=y)
*** stack smashing detected ***: /usr/lib/R/bin/exec/R terminated
Aborted

Supongo que ese es un problema que no tiene nada que ver con el original,
pero de alguna manera se juntó todo
Post by Marcelino de la Cruz Rot
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]
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)
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))
}
aline.dist(x0, namesx0)
Hmm, seguro que salen unos dendrogramas muy interesantes ;-)
plot(hclust(aline.dist(x0, namesx0)))
Saludos,
Marcelino
Post by Juan Abasolo
¡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.
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
Post by Juan Abasolo
intentar reinventar la rueda, pero con alineR::aline(x).
También capaz que pueda evitar que aparezcan los NA sin mellar el
trabajo.
Post by Juan Abasolo
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
--
Juan Abasolo

Hizkuntzaren eta Literaturaren Didaktika Saila
Bilboko Hezkuntza Fakultatea
Euskal Herriko Unibertsitatea
UPV/EHU

Sarriena auzoa z/g
48940 Leioa
Bizkaia

[[alternative HTML version deleted]]
Marcelino de la Cruz Rot
2018-09-07 12:13:25 UTC
Permalink
Vaya, qué mala suerte. Yo lo probé en la consola de Windows y funcionó
sin problema.
¿Tal vez sea por la versión  de alineR? La mía es la 1.1.4.

Saludos
Post by Juan Abasolo
Me encantaría saber pensar así de una.
Creo que entiendo bien lo que me decís, pero no lo puedo poner en
marcha en mi computadora, por algo que no sé qué será.
Post by Marcelino de la Cruz Rot
cosa<-aline(w1=x,w2=y)
En RStudio me dice que R sufrió algo. Probé directamente desde la
Post by Marcelino de la Cruz Rot
cosa<-aline(w1=x,w2=y)
*** stack smashing detected ***: /usr/lib/R/bin/exec/R terminated
Aborted
Supongo que ese es un problema que no tiene nada que ver con el
original, pero de alguna manera se juntó todo
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]
ok<-!is.na <http://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)
aline.dist<- function(x0, namesx0){
    require(alineR)
    ok<-!is.na <http://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))
}
aline.dist(x0, namesx0)
Hmm, seguro que salen unos dendrogramas muy interesantes ;-)
plot(hclust(aline.dist(x0, namesx0)))
Saludos,
Marcelino
Post by Marcelino de la Cruz Rot
¡Buenas, listeros!
Supongo que lo que planteo es muy básico, pero estoy trabado y
no lo veo.
Post by Marcelino de la Cruz Rot
Tengo una función que da la distancia lingüística ALINE,
alineR::aline(),
Post by Marcelino de la Cruz Rot
pero que no genera matrices.
Tengo que hacer matrices de distancias ALINE de unos datos tipo
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
Post by Marcelino de la Cruz Rot
method = "ALINE" quiere decir que use la función `aline()`. O si
tengo que
Post by Marcelino de la Cruz Rot
intentar reinventar la rueda, pero con alineR::aline(x).
También capaz que pueda evitar que aparezcan los NA sin mellar
el trabajo.
Post by Marcelino de la Cruz Rot
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
--
Juan Abasolo
Hizkuntzaren eta Literaturaren Didaktika Saila
Bilboko Hezkuntza Fakultatea
Euskal Herriko Unibertsitatea
UPV/EHU
Sarriena auzoa z/g
48940 Leioa
Bizkaia
--
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
Juan Abasolo
2018-09-08 11:47:22 UTC
Permalink
Es algo más mágico que eso, aparentemente.
Seguí todos tus pasos y, lo comentado, R se cae.
Actualicé tooodos los paquetes y RStudio, y R se cae.

Probé con mis datos (codificados según IPA... masomeno) y... FUNCIONA!!!
Ahora tengo que ver si sirve para lo que me propongo... aprendiendo a
trabajar con dendogramas y clusters, no para sorpresa tuya ;-)

Muchísimas gracias.
Post by Marcelino de la Cruz Rot
Vaya, qué mala suerte. Yo lo probé en la consola de Windows y funcionó
sin problema.
¿Tal vez sea por la versión de alineR? La mía es la 1.1.4.
Saludos
Post by Juan Abasolo
Me encantaría saber pensar así de una.
Creo que entiendo bien lo que me decís, pero no lo puedo poner en
marcha en mi computadora, por algo que no sé qué será.
Post by Marcelino de la Cruz Rot
cosa<-aline(w1=x,w2=y)
En RStudio me dice que R sufrió algo. Probé directamente desde la
Post by Marcelino de la Cruz Rot
cosa<-aline(w1=x,w2=y)
*** stack smashing detected ***: /usr/lib/R/bin/exec/R terminated
Aborted
Supongo que ese es un problema que no tiene nada que ver con el
original, pero de alguna manera se juntó todo
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]
ok<-!is.na <http://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)
aline.dist<- function(x0, namesx0){
require(alineR)
ok<-!is.na <http://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))
}
aline.dist(x0, namesx0)
Hmm, seguro que salen unos dendrogramas muy interesantes ;-)
plot(hclust(aline.dist(x0, namesx0)))
Saludos,
Marcelino
Post by Marcelino de la Cruz Rot
¡Buenas, listeros!
Supongo que lo que planteo es muy básico, pero estoy trabado y
no lo veo.
Post by Marcelino de la Cruz Rot
Tengo una función que da la distancia lingüística ALINE,
alineR::aline(),
Post by Marcelino de la Cruz Rot
pero que no genera matrices.
Tengo que hacer matrices de distancias ALINE de unos datos tipo
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
Post by Marcelino de la Cruz Rot
method = "ALINE" quiere decir que use la función `aline()`. O si
tengo que
Post by Marcelino de la Cruz Rot
intentar reinventar la rueda, pero con alineR::aline(x).
También capaz que pueda evitar que aparezcan los NA sin mellar
el trabajo.
Post by Marcelino de la Cruz Rot
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
--
Juan Abasolo
Hizkuntzaren eta Literaturaren Didaktika Saila
Bilboko Hezkuntza Fakultatea
Euskal Herriko Unibertsitatea
UPV/EHU
Sarriena auzoa z/g
48940 Leioa
Bizkaia
--
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
--
Juan Abasolo

Hizkuntzaren eta Literaturaren Didaktika Saila
Bilboko Hezkuntza Fakultatea
Euskal Herriko Unibertsitatea
UPV/EHU

Sarriena auzoa z/g
48940 Leioa
Bizkaia

[[alternative HTML version deleted]]
Loading...