Saltar al contenido

Cómo hacer un bucle / repetir una regresión lineal en R

Solución:

¿Quiere ejecutar 22.000 regresiones lineales y extraer los coeficientes? Eso es fácil de hacer desde el punto de vista de la codificación.

set.seed(1)

# number of columns in the Lung and Blood data.frames. 22,000 for you?
n <- 5 

# dummy data
obs <- 50 # observations
Lung <- data.frame(matrix(rnorm(obs*n), ncol=n))
Blood <- data.frame(matrix(rnorm(obs*n), ncol=n))
Age <- sample(20:80, obs)
Gender  <- factor(rbinom(obs, 1, .5))

# run n regressions
my_lms <- lapply(1:n, function(x) lm(Lung[,x] ~ Blood[,x] + Age + Gender))

# extract just coefficients
sapply(my_lms, coef)

# if you need more info, get full summary call. now you can get whatever, like:
summaries <- lapply(my_lms, summary)
# ...coefficents with p values:
lapply(summaries, function(x) x$coefficients[, c(1,4)])
# ...or r-squared values
sapply(summaries, function(x) c(r_sq = x$r.squared, 
                                adj_r_sq = x$adj.r.squared))

Los modelos se almacenan en una lista, donde el modelo 3 (con DV Lung[, 3] y sangre intravenosa[,3] + Edad + Sexo) está en my_lms[[3]] etcétera. Puede utilizar funciones de aplicación en la lista para realizar resúmenes, de los cuales puede extraer los números que desee.

La pregunta parece ser sobre cómo llamar a funciones de regresión con fórmulas que se modifican dentro de un ciclo.

Así es como puede hacerlo (usando el conjunto de datos de diamantes):

attach(ggplot2::diamonds)
strCols = names(ggplot2::diamonds)

formula <- list(); model <- list()
for (i in 1:1) {
  formula[[i]] = paste0(strCols[7], " ~ ", strCols[7+i])
  model[[i]] = glm(formula[[i]]) 

  #then you can plot or do anything else with the result ...
  png(filename = sprintf("diamonds_price=glm(%s).png", strCols[7+i]))
  par(mfrow = c(2, 2))      
  plot(model[[i]])
  dev.off()
  }
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *