Estimados

En el correo anterior copie y pegue mal. Este es el correcto.

Copio y pego un código reproducible donde está la pregunta, yo lo realicé con 
en un archivo cmd pero si no me equivoco en rstudio o cualquier otro debería 
ser leído sin problemas al cortar y pegar.

---
title: "Pregunta"
author: "Javier Marcuzzi"
format: html
editor: visual
---

## Consulta y descripción del problema

De un libro estoy siguiendo unos problemas, este libro se está convirtiendo en 
referencia en un área muy específica, tal es así que el año pasado realizaron 
la cuarta edición del mismo.

Como se va convirtiendo en referencia y ser un libro donde no utilizan 
programas o lenguajes informáticos, distintas personas realizan en diversos 
lenguajes replicas de los ejemplos del libro. Tal es así, que la misma 
editorial publica en R la respuestas aportada por terceros.

En R tengo tres versiónes, la mía que da una falla, la de un tercero citada por 
la editorial y la de un Phd de una universidad de Estados Unidos.

La diferencia entre el Phd y el recomendado por la editorial, es que el primero 
utiliza una función para diseñar la matriz, función casi idéntica a otra 
universidad de Canadá, en cambio el recomendado utiliza model.matrix. Ambas 
formas son idénticas pero luego difieren, y esta diferencia la colocaré en 
ejemplos en esta consulta a la lista.

El libro tiene todo escrito en matemática, álgebra, me refiero a que no tiene 
ni una línea de código, por lo que cada persona es libre de utilizar papel y 
lápiz o la computadora.

El ejemplo en R con la función escrita por el phd de Estados Unidos, coincide 
con el libro, es fiel a este. Sin embargo continuando con los pasos para la 
resolución del problema, hay error, el mensaje es el siguiente: Error in 
solve.default(LHS, RHS) : Lapack routine dgesv: system is exactly singular: 
U\[21,21\] = 0

En cambio el otro ejemplo recomendado por la editorial, no da este error y 
llega a la resolución, pero no coincide con el libro, no es una copia fiel en 
el "armado" de la matriz.

La mejor forma de explicar la pregunta es compartiendo un código reproducible.

## Datos

Los datos son los mismos, los copio antes de continuar el trabajo, uno se llama 
data y el otro data0. La copia es porque al colocar "factor" no puedo 
utilizarlos en ambos casos. Se comprenderá en el ejemplo.

```{r}
cow = rep(seq(4, 8), each = 2)
fy = c(201, 280, 150, 200, 160, 190, 180, 250, 285, 300)
hys = c(1, 3, 1, 4, 2, 3, 1, 3, 2, 4)
pairity = rep(c(1,2), 5)

data = data.frame(cow, pairity, hys, fy)
data0 = data.frame(cow, pairity, hys, fy)
```

## Preparación de datos

Para utilizar con model.matrix, utilizo factor. En este caso se llaman data.

```{r}
data$pairity = as.factor(pairity)
data$hys = as.factor(hys)
data$hys = relevel(factor(hys), ref = "1")
data$cow = factor(data$cow)
```

Para utilizar la función de diseño, uso los datos originales (sin factor). Como 
no tienen "trabajo extra" para preprar los datos se llaman datos0.

## La función de diseño de matriz es la siguiente:

```{r}
# función para crear el diseño de matriz 
desgn <- function(v) {
  if (is.numeric(v)) {
    va = v
    mrow = length(va)
    mcol = max(va)
  }
  if (is.character(v)) {
    vf = factor(v)
    # Guarda el indice para cada nivel
    va = as.numeric(vf)
    mrow = length(va)
    mcol = length(levels(vf))
  }
  
  # Inicio la martiz
  X = matrix(data = c(0), nrow = mrow, ncol = mcol)
  
  for (i in 1:mrow) {
    ic = va[i]
    X[i, ic] = 1
  }
  return(X)
}
```

## Armado de las matrices

### Forma 1

Utilizando la función de diseño, hace una fiel coincidencia con el libro, me 
refiero a que el libro tiene todo escrito en forma matemática, sin utilizar 
lenguajes informáticos, se puede hacer con lápiz y papel, no hay otro 
requerimiento. Pero luego este armado de matrices da error (singularidad).

Como se puede reproducir, el ejemplo son dos matrices que se unen con cbind.

```{r}
# Matriz X, relaciona los registros de HYS y partos
# dideño para HYS
x1 = desgn(data0$hys)
x1
# diseño para Partos
x2 = desgn(data0$pairity)
x2
# Matriz X segín libro
XLibro = cbind(x1,x2)

t(XLibro)
```

### Forma 2

Utilizando los datos con model.matrix, de esta forma también luego el mismo 
error (singularidad) y no coincide con el libro.

```{r}
X = model.matrix(fy ~ -1 + pairity + hys, data = data)
X
```

### Forma 3 X\[,-4\]

La diferencia con el anterior está en X\[,-4\], como este es el que funciona lo 
llamo XOK.

Funciona quiere decir que no da error, los resultados coinciden con el libro, 
pero no visualmente cuando leo las matrices. Este punto se ejemplifica en la 
comparación. La única diferencia con los resultados del libro, es que "elimina" 
los dos casos donde da 0,000.

```{r}
XOK = X[,-4]
```

## Comparación

Para analizar comparo las tres formas de armado de la matriz, las dos primeras 
luego dan singularidad y la tercera no,

### Libro pero que da singularidad (forma 1)

```{r}
XLibro
```

### model.matrix que también da singularidad (forma 2)

```{r}
X
```

### model.matrix que da los resultados correctos (forma 3 X\[,-4\])

```{r}
XOK
```

## Pregunta

Si se observa, Xlibro, X y XOK, todos tienen 10 filas, esto está bién, pero 
Xlibro tiene 6 columnas, X tiene 5 columnas y XOK tiene 4 columnas.

El de 6 columnas es identico al libro, pero da singularidad, el de 4 columnas 
da los resultados del libro, con una pequeña diferencia en los dos que dan 
0,000, pero el "armado" con model.matrix difiere.

¿Alguien puede explicarme model.matrix? En el diseño, o en la forma de armar 
optimiza algo, pero no comprendo como realiza la convinación, en forma 
automática eliminina \[,-4\] los dos que darían 0.

Recuerdo, la formula es fy \~ -1 + pairity + hys o dos matrices unidas con 
cbind (libro).

¿Cómo leer lo siguiente?

```{r}
XLibro
X
XOK
```

## 

_______________________________________________
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es

Responder a