Skip to content

[R-es] Incluir un rango de varias variables explicativas a un modelo

7 messages · Carlos Ortega, Juan Abasolo, Jorge I Velez +1 more

#
Hola,

Quiero especificar una ecuación con varias variables explicativas de una
manera eficiente sin necesidad de escribir todas y cada una. Tengo un
conjunto de variables (junto con otras) dentro de una base de datos que se
llaman pot23 pot311 pot312 pot 316 pot317........... pot80. No
necesariamente están secuenciadas. Quisiera saber cómo indicar que incluya
todas las variables de pot23 a pot80 en una ecuación.

He intentado lo siguiente, pero no funciona:
wageszm14)
Error: Can't find columns `pot24`, `pot25`, `pot26`, `pot27`, `pot28`, ...
(and 273 more) in `.data`.

De igual forma, después estaría interesado en obtener el logaritmo de todas
esas variables pot~

Gracias de antemano por cualquier tipo de ayuda.
#
Hola,

Mira la función "*as.formula()*".
Incluye un ejemplo muy parecido a lo que estás queriendo hacer.

Saludos,
Carlos Ortega
www.qualityexcellence.es

El lun., 3 jun. 2019 a las 1:00, Rolando Valdez (<rvaldezr en gmail.com>)
escribió:

  
    
#
Hola, gracias por la respuesta,

No me funcionó debido a que los nombres de las variables no están seriadas,
es decir, los nombres de las variables son del tipo: x23 x25 x30, x301
x320, x80. Entonces me da este error:
Error in eval(predvars, data, env) : object 'pot24' not found. Debido a que
pot24 no existe, ya que de pot23 se brinca a pot30.

En Stata es algo muy simple de hacer, solo tengo que especificar gl
indepvars "x23-x80" y ya. En R no logro hacerlo.

¿Alguna otra sugerencia?

Gracias de antemano.

El lun., 3 de jun. de 2019 a la(s) 04:50, Carlos Ortega (
cof en qualityexcellence.es) escribió:

  
    
1 day later
#
Meto cuchara y disculpen si es una tontería:
Y si creás un objeto con los nombres de las variables? y si solamente te
interesan las que cumplan no sé qué característica en el nombre, pedirlo.

pabuscar <- sort(names(tudataframe))
pabuscar[grep('x', pabuscar)]

Los que saben seguro que lo hacen más lindo, pero yo creo que eso te
funcionaría y no es difacil. Suerte

Hau idatzi du Rolando Valdez (rvaldezr en gmail.com) erabiltzaileak (2019 eka.
4, ar. (05:43)):

  
    
#
Hola,

Mira este código para construir tu fórmula a partir de los nombres de tus
variables...

#-------------------------------

library(dplyr)
library(randNames)

set.seed(1234)

# Creo unos nombres aletaorios como nombres de variables
# Esto lo tendrías de tu data.frame con "names(tu_data_frame)"
my_names <- 25 %>%
  rand_names(nationality = 'ES') %>%
  select(name.first)

mynam_vec <- as.vector(my_names$name.first)
mynam_vec

# Construyo una formula con los nombres de las variables
myformula <- vector()
for(i in 1:length(mynam_vec)) {
  tmp <- mynam_vec[i]
  if(i != length(mynam_vec)) {
      myformula <- paste0(myformula, tmp, sep=" + ", collapse = "")
  } else {
      myformula <- paste0(myformula, tmp, sep= '' )
  }
}
myform_end <- paste("lweg ~ ", myformula, sep = " ")
myform_end
class(myform_end)

# Y con la cadena la transformo en una formula
como_formula <- as.formula(myform_end)
como_formula
class(como_formula)
#-----------------------

Que produce este resultado:
+   rand_names(nationality = 'ES') %>%
+   select(name.first)
[1] "sonia"     "elisa"     "adrian"    "irene"     "laura"     "joaquin"
  "raquel"
 [8] "eva"       "rodrigo"   "carmelo"   "vicenta"   "jordi"     "nuria"
  "enrique"
[15] "luz"       "mohamed"   "alfredo"   "nieves"    "fatima"    "santiago"
 "francisco"
[22] "joaquin"   "jose"      "manuel"    "andrea"
+   tmp <- mynam_vec[i]
+   if(i != length(mynam_vec)) {
+       myformula <- paste0(myformula, tmp, sep=" + ", collapse = "")
+   } else {
+       myformula <- paste0(myformula, tmp, sep= '' )
+   }
+ }
[1] "lweg ~  sonia + elisa + adrian + irene + laura + joaquin + raquel +
eva + rodrigo + carmelo + vicenta + jordi + nuria + enrique + luz + mohamed
+ alfredo + nieves + fatima + santiago + francisco + joaquin + jose +
manuel + andrea"
[1] "character"
lweg ~ sonia + elisa + adrian + irene + laura + joaquin + raquel +
    eva + rodrigo + carmelo + vicenta + jordi + nuria + enrique +
    luz + mohamed + alfredo + nieves + fatima + santiago + francisco +
    joaquin + jose + manuel + andrea
[1] "formula"

#-----------------


Saludos,
Carlos Ortega
www.qualityexcellence.es


El mar., 4 jun. 2019 a las 5:43, Rolando Valdez (<rvaldezr en gmail.com>)
escribió:

  
    
#
Hola Rolando,

Quizás subset() sea tu amigo en este caso.  Intenta:

## selecciona la variable dependiente y las variables independientes
d0 <- subset(wageszm14, select = c(lwage, SEXO:marr, pot23:pot317)

## ajusta el modelo
fit <- qregspiv(lwage ~ ., shpfile = zm15, tau = 0.5, nboot = 70, data = d0)

## resultados
summary(fit)

Saludos,
Jorge.-
On Sun, Jun 2, 2019 at 6:00 PM Rolando Valdez <rvaldezr en gmail.com> wrote:

            

  
  
#
Sí, más o menos así lo resolví:

nn <-names(wageszm14)
lvadd <- nn[grep("^lvadd", nn)]
(eqreg <- as.formula(paste("lwage ~ age + educ + percmen + marr + natlang
+", paste(lvadd, collapse = "+"))))
lwage ~ age + educ + percmen + marr + natlang + lvadd23_pot23 +
    lvadd3133_pot3133 + lvadd_commer_pot_commer +
lvadd_communic_pot_communic +
    lvadd_hserv_pot_hserv + lvadd62_pot62 + lvadd_host_pot_host +
    lvadd81_pot81

Con eso quedó resuelto.

Gracias a todos por sus respuestas.



El mié., 5 de jun. de 2019 a la(s) 14:15, Juan Abasolo (juan.abasolo en ehu.eus)
escribió: