regresión polinómica

Implementación en R Markdown La siguiente función en R implementa la regresión polinómica por mínimos cuadrados para un grado arbitrario.

#' Ajuste Polinómico por Mínimos Cuadrados
#'
#' @param x_vals Vector con los valores de x.
#' @param y_vals Vector con los valores de y.
#' @param degree Grado del polinomio a ajustar.
#' @return Una lista que contiene los coeficientes y una función del polinomio.
#' 
#' 
least_squares_poly <- function(x_vals, y_vals, degree) {
  n_points <- length(x_vals)
  
  # Construir la matriz de diseño X
  X_matrix <- matrix(0, nrow = n_points, ncol = degree + 1)
  for (j in 0:degree) {
    X_matrix[, j + 1] <- x_vals^j
  }
  
  # Resolver el sistema de ecuaciones normales: A = (X'X)^-1 * X'Y
  XtX <- t(X_matrix) %*% X_matrix
  XtY <- t(X_matrix) %*% y_vals
  
  coefs <- solve(XtX, XtY)
  
  # Crear la función del polinomio
  poly_func <- function(x) {
    terms <- sapply(0:degree, function(d) coefs[d + 1] * x^d)
    return(sum(terms))
  }
  
  return(list(coefficients = as.vector(coefs), polynomial = poly_func))
}

Datos del problema proporcionado

datos <- read.delim("G:/Mi unidad/0 Agosto-25/MN-clases/Semana 5/datos.txt", header=FALSE)
X <- datos$V1
Y <- datos$V2
plot(X,Y)
grid()

datos <- data.frame(X, Y)

# Intento 1: Ajuste lineal (Grado 1), como sugería el comentario del archivo original
fit_lineal <- least_squares_poly(X, Y, degree = 1)
print("Coeficientes del ajuste lineal (a0, a1):")
## [1] "Coeficientes del ajuste lineal (a0, a1):"
print(fit_lineal$coefficients)
## [1]  2.765627 -0.525000
# Intento 2: Ajuste cuadrático (Grado 2), observando la forma de los datos
#fit_cuadratico <- least_squares_poly(X, Y, degree = 2)
#print("Coeficientes del ajuste cuadrático (a0, a1, a2):")
#print(fit_cuadratico$coefficients)

# Intento 3: Ajuste cúbico (Grado 3)
fit_cubico <- least_squares_poly(X, Y, degree = 4)
print("Coeficientes del ajuste cúbico (a0, a1, a2, a3, a4):")
## [1] "Coeficientes del ajuste cúbico (a0, a1, a2, a3, a4):"
print(fit_cubico$coefficients)
## [1]  10.8750063 -12.9791603   0.6874871   1.5416713  -0.2500005
# Graficar los resultados para comparar
library(ggplot2)

# Crear puntos para las curvas de ajuste
x_range <- seq(0, 5, length.out = 100)
y_lineal <- sapply(x_range, fit_lineal$polynomial)
#y_cuadratico <- sapply(x_range, fit_cuadratico$polynomial)
y_cubico <- sapply(x_range, fit_cubico$polynomial)

ggplot(datos, aes(x = X, y = Y)) +
  geom_point(color = "black", size = 3, shape = 21, fill = "gray") +
  geom_line(data = data.frame(x=x_range, y=y_lineal), aes(x=x, y=y, color = "Lineal (Grado 1)"), size=1) +
#  geom_line(data = data.frame(x=x_range, y=y_cuadratico), aes(x=x, y=y, color = "Cuadrático (Grado 2)"), size=1) +
  geom_line(data = data.frame(x=x_range, y=y_cubico), aes(x=x, y=y, color = "Cúbico (Grado 3)"), size=1.2) +
  labs(title = "Comparación de Ajustes por Mínimos Cuadrados",
       subtitle = "Datos del archivo proporcionado",
       x = "Variable Independiente X", y = "Variable Dependiente Y",
       color = "Modelo de Ajuste") +
  scale_color_manual(values = c("Lineal (Grado 1)" = "orange", "Cuadrático (Grado 2)" = "red", "Cúbico (Grado 3)" = "blue")) +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.