Saya ingin menentukan satu set variabel untuk digunakan di berbagai model di R. Di Stata, saya dapat menulis sesuatu seperti berikut:

global controls c1 c2 c3
reg y x1 $controls
reg y x1 x2 $controls
reg y c.x1##c.x2 $controls

Saya bisa mendapatkan hasil yang sama di R (saya pikir) dengan yang berikut:

attach(data)
lm(y ~ x1 + c1 + c2 + c3)
lm(y ~ x1 + x2 + c1 + c2 + c3)
lm(y ~ x1 * x2 + c1 + c2 + c3)

Apakah ada cara di R untuk menghindari keharusan menempelkan "+ c1 + c2 + c3" untuk setiap model baru?

r
0
kwela12 12 Mei 2021, 18:39

2 jawaban

Jawaban Terbaik

Saya akan selalu merekomendasikan menggunakan argumen data= daripada attach(), dan menggunakan reformulate() (@ WillHipson's answer using as.formula(paste(...)) berhasil tetapi reformulate() lebih bagus):

controls <- c("c1", "c2", "c3")  ## or paste0("c", 1:3)
lm(reformulate(c("x1",    controls), response="y"), data=data)
lm(reformulate(c("x1+x2", controls), response="y"), data=data)
lm(reformulate(c("x1*x2", controls), response="y"), data=data)

Atau bahkan lebih baik

modvars <- c("x1", "x1+x2", "x1*x2")
lapply(modvars, function(v) { lm(reformulate(c(v, controls), response="y"), data=data) })

Atau jika Anda suka dengan rapi

purrr::map(modvars, ~ lm(reformulate(c(., controls), response="y"), data=data))
1
Ben Bolker 12 Mei 2021, 16:08

Anda mungkin menginginkan sesuatu seperti di postingan blog:

outcome <- "mpg"
variables <- c("cyl", "disp", "hp", "carb")

f <- as.formula(
  paste(outcome, 
        paste(variables, collapse = " + "), 
        sep = " ~ "))
print(f)
> mpg ~ cyl + disp + hp + carb

model <- lm(f, data = mtcars) 
0
Will Hipson 12 Mei 2021, 16:00