Saltar al contenido principal
LibreTexts Español

7.7: Respuestas a ejercicios

  • Page ID
    150006
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Respuesta a la pregunta de las estrellas.

    Primero, cargue los datos y como se sugirió anteriormente, convierta las coordenadas en decimales:

    Código\(\PageIndex{1}\) (R):

    s50 <- read.table("data/stars.txt", h=T, sep="	", as.is=T, quote="")
    str(s50)
    RA10 <- as.numeric(substr(s50$RA, 1, 2)) + as.numeric(substr(s50$RA, 4, 5))/60 +  as.numeric(substr(s50$RA, 7, 10))/3600
    DEC10 <- sign(as.numeric(substr(s50$DEC, 1, 3))) *  (as.numeric(substr(s50$DEC, 2, 3)) +  as.numeric(substr(s50$DEC, 5, 6))/60 +  as.numeric(substr(s50$DEC, 8, 9))/3600)
    coo <- cbind(RA10, DEC10)

    A continuación, algunas parcelas preliminares (por favor hágalas tú mismo):

    Código\(\PageIndex{2}\) (R):

    s50 <- read.table("data/stars.txt", h=T, sep="	", as.is=T, quote="")
    RA10 <- as.numeric(substr(s50$RA, 1, 2)) + as.numeric(substr(s50$RA, 4, 5))/60 + as.numeric(substr(s50$RA, 7, 10))/3600
    DEC10 <- sign(as.numeric(substr(s50$DEC, 1, 3)))*(as.numeric(substr(s50$DEC, 2, 3))+as.numeric(substr(s50$DEC, 5, 6))/60+as.numeric(substr(s50$DEC, 8, 9))/3600
    coo <- cbind(RA10, DEC10)
    oldpar <- par(bg="black", fg="white", mar=rep(0, 4))
    plot(coo, pch="*", cex=(3 - s50$VMAG))
    Hulls(coo, as.numeric(factor(s50$CONSTEL)), # asmisc.r usecolors=rep("white", nlevels(factor(s50$CONSTEL))))
    points(runif(100, min(RA10), max(RA10)), runif(100, min(DEC10), max(DEC10)), pch=".")
    par(oldpar)
    plot(coo, type="n")
    text(coo, s50$CONSTEL.A)
    plot(coo, type="n")
    text(coo, s50$NAME)

    Ahora, cargue el paquete dbscan e intente encontrar donde el número de “constelaciones” es máximo:

    Código\(\PageIndex{3}\) (R):

    library(dbscan)
    s50 <- read.table("data/stars.txt", h=T, sep="	", as.is=T, quote="")
    RA10 <- as.numeric(substr(s50$RA, 1, 2)) + as.numeric(substr(s50$RA, 4, 5))/60 +  as.numeric(substr(s50$RA, 7, 10))/3600
    DEC10 <- sign(as.numeric(substr(s50$DEC, 1, 3)))*(as.numeric(substr(s50$DEC, 2, 3))+as.numeric(substr(s50$DEC, 5, 6))/60+as.numeric(substr(s50$DEC, 8, 9))/3600
    coo <- cbind(RA10, DEC10)
    for (eps in 1:20) cat(c(eps, ":", names(table(dbscan(coo, eps=eps)$cluster))), "
    ")

    Trazar el “cielo nocturno” prettificado (Figura\(\PageIndex{1}\)) con constelaciones encontradas:

    Código\(\PageIndex{4}\) (R):

    library(dbscan)
    s50 <- read.table("data/stars.txt", h=T, sep="	", as.is=T, quote="")
    RA10 <- as.numeric(substr(s50$RA, 1, 2)) + as.numeric(substr(s50$RA, 4, 5))/60 +  as.numeric(substr(s50$RA, 7, 10))/3600
    DEC10 <- sign(as.numeric(substr(s50$DEC, 1, 3)))*(as.numeric(substr(s50$DEC, 2, 3))+as.numeric(substr(s50$DEC, 5, 6))/60+as.numeric(substr(s50$DEC, 8, 9))/3600
    coo <- cbind(RA10, DEC10)
    s50.db <- dbscan(coo, eps=9)
    oldpar <- par(bg="black", fg="white", mar=rep(0, 4))
    plot(coo, pch=8, cex=(3 - s50$VMAG))
    Hulls(coo, s50.db$cluster, # asmisc.r usecolors=c("black", "white", "white", "white"))
    points(runif(100, min(RA10), max(RA10)),  runif(100, min(DEC10), max(DEC10)), pch=".")
    par(oldpar)

    dev.off ()

    Para acceder a un acuerdo entre dos clasificaciones (dos sistemas de constelaciones) podríamos usar el índice Rand ajustado que cuenta correspondencias:

    Screen Shot 2019-01-28 a las 9.40.08 PM.png
    Figura\(\PageIndex{1}\) Cincuenta estrellas más brillantes con “constelaciones” encontradas con DBSCAN.

    Código\(\PageIndex{5}\) (R):

    s50 <- read.table("data/stars.txt", h=T, sep="	", as.is=T, quote="")
    library(dbscan)
    RA10 <- as.numeric(substr(s50$RA, 1, 2)) + as.numeric(substr(s50$RA, 4, 5))/60 +  as.numeric(substr(s50$RA, 7, 10))/3600
    DEC10 <- sign(as.numeric(substr(s50$DEC, 1, 3)))*(as.numeric(substr(s50$DEC, 2, 3))+as.numeric(substr(s50$DEC, 5, 6))/60+as.numeric(substr(s50$DEC, 8, 9))/3600
    coo <- cbind(RA10, DEC10)
    s50.db <- dbscan(coo, eps=9)
    Adj.Rand(as.numeric(factor(s50$CONSTEL)), s50.db$cluster) # asmisc.r

    (Por supuesto, es bajo.)

    Respuesta al ejercicio de clasificación de cerveza. Para hacer la clasificación jerárquica, primero necesitamos hacer la matriz de distancia. Echemos un vistazo a los datos:

    Código\(\PageIndex{6}\) (R):

    beer <- read.table("data/beer.txt", sep="	", h=TRUE)
    head(beer)

    Los datos son binarios y por lo tanto necesitamos el método específico de cálculo de distancia. Vamos a utilizar aquí Jaccard distancia implementado en función vegdist () desde el paquete vegano. También es posible usar aquí otros métodos como “binary” de la función core dist (). El siguiente paso sería la construcción del dendrograma (Figura\(\PageIndex{2}\)):

    Código\(\PageIndex{7}\) (R):

    beer <- read.table("data/beer.txt", sep="	", h=TRUE)
    library(vegan)
    beer.d <- vegdist(beer, "jaccard")
    plot(hclust(beer.d, method="ward.D"), main="", xlab="", sub="")
    Screen Shot 2019-01-28 a las 9.46.07 PM.png
    Figura Clasificación\(\PageIndex{2}\) jerárquica de los tipos de cerveza rusa.

    Hay dos grandes grupos (en aproximadamente el nivel de disimilitud 1.7), podemos llamarlos “Baltika” y “Budweiser”. En la siguiente división (aproximadamente en 1.4 disimilitud), hay dos subgrupos en cada grupo. Todas las demás divisiones son significativamente más profundas. Por lo tanto, es posible realizar la siguiente clasificación jerárquica:

    • Grupo Baltika
      • Subgrupo Baltika: Baltika.6, Baltika.9, ochak.Dark, afanas.Light, Sibirskoe, tula.Duro
      • Subgrupo de Tula: Zhigulevsk, Khamovn, Tula.Arsenal, Tula.orig
    • Grupo Budweiser
      • Subgrupo Budweiser: Sinebryukh, Vena.porter, Sokol.soft, Budweiser, Sokol.light
      • Subgrupo Ochak: Baltika.3, Klinsk.Dark, Oldm.Light, Vena.Peterg, Ochak.class, OChak.Special, Klinsk.Gold, Sibir.Orig, Efes, Bochk.Light, Heineken

    También es una buena idea verificar la clasificación resultante con cualquier otro método de clasificación, como agrupación no jerárquica, escalado multidimensional o incluso PCA. Cuanto más consistente sea la clasificación anterior con este segundo enfoque, mejor.

    Respuesta al ejercicio de clasificación de especies vegetales de árboles. El árbol se explica por sí mismo pero tenemos que construirlo primero (Figura\(\PageIndex{3}\)):

    Código\(\PageIndex{8}\) (R):

    eq <- read.table("data/eq.txt", h=TRUE)
    eq.tree <- tree(eq[, 1] ~ ., eq[,-1])
    plot(eq.tree); text(eq.tree)

    Respuesta a la pregunta de kubricks (Figura\(\PageIndex{3}\)). Esto es solo un plan, ya que aún necesitará realizar estos pasos individualmente:

    1. Abra R, abra Excel o cualquier software de hoja de cálculo y cree el archivo de datos. Este archivo de datos debe ser la tabla donde las especies kubrick son filas y los caracteres son columnas (variables). Cada fila debe comenzar con un nombre de kubrick (es decir, letra), y cada columna debe tener un encabezado (nombre del carácter). Para los caracteres, son preferibles los nombres cortos en mayúsculas sin espacios.

    Screen Shot 2019-01-28 a las 9.49.04 PM.png
    Figura El árbol de\(\PageIndex{3}\) clasificación muestra que dos especies de cola de caballo difieren según el carácter N.REB (número de crestas del tallo)

    La celda de Topleft podría permanecer vacía. En todas las demás celdas, debe haber 1 (carácter presente) o 0 (carácter ausente). Para el personaje, podrías usar “presencia de tallo” o “presencia de tres bocas”, o “habilidad para hacer fotosíntesis”, o algo parecido. Dado que hay 8 kubricks, se recomienda inventar\(N+1\) (en este caso, 9) caracteres.

    2. Guarde su tabla como un archivo de texto, preferiblemente separado por tabulaciones (use enfoques descritos en el segundo capítulo), luego cárguela en R con read.table (.., h=true, fila.names=1).

    3. Aplicar clustering jerárquico con el método distance aplicable para datos binarios (0/1), por ejemplo binario de dist () u otro método (como Jaccard) del vegan: :vegdist ().

    4. Hacer el dendrograma con hclust () usando el algoritmo de clustering apropiado.

    En el directorio de datos, hay un archivo de datos, kubricks.txt. Es solo un ejemplo por lo que no es necesariamente correcto y no contiene descripciones de caracteres. Dado que es bastante obvio cómo realizar la agrupación jerárquica (ver el ejemplo de “cerveza” anterior), presentamos a continuación otras dos posibilidades.

    Primero, usamos MDS más el MST, árbol de expansión mínimo, el conjunto de líneas que muestran la ruta más corta conectando todos los objetos en la gráfica de ordenación (Figura\(\PageIndex{4}\)):

    Código\(\PageIndex{9}\) (R):

    kubricks <- read.table("data/kubricks.txt", h=TRUE, row.names=1)
    kubricks.d <- dist(kubricks, method="binary")
    kubricks.c <- cmdscale(kubricks.d)
    plot(kubricks.c, type="n", axes=FALSE)
    text(kubricks.c, labels=row.names(kubricks), cex=2)
    library(vegan)
    lines(spantree(kubricks.d), kubricks.c[, 1:2], lty=2)
    Screen Shot 2019-01-28 a las 9.53.06 PM.png
    Figura Árbol de expansión\(\PageIndex{4}\) mínimo de kubricks.

    Segundo, podemos tomar en cuenta que los kubricks son objetos biológicos. Por lo tanto, con la ayuda de paquetes ape y phangorn podemos intentar construir el árbol de filogenia más parsimonioso (es decir, el más corto) para kubricks. Aceptemos que kubrick H es el grupo externo, el más primitivo:

    Código\(\PageIndex{10}\) (R):

    kubricks <- read.table("data/kubricks.txt", h=TRUE, row.names=1)
    library(phangorn)
    k <- as.phyDat(data.frame(t(kubricks)), type="USER", levels = c(0, 1))
    kd <- dist.hamming(k) # Hamming distance for morphological data
    kdnj <- NJ(kd) # neighbor-joining tree
    kp <- optim.parsimony(kdnj, k)
    ktree <- root(kp, outgroup="H", resolve.root=TRUE) # re-root
    plot(ktree, cex=2)

    (Haz y revisa esta parcela tú mismo.)


    7.7: Respuestas a ejercicios is shared under a not declared license and was authored, remixed, and/or curated by LibreTexts.