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 <- 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.