Tôi muốn chạy qua một vectơ dài các biến giải thích tiềm năng, sẽ thay đổi biến trả lời trên mỗi biến. Thay vì dán cùng nhau công thức mô hình, tôi đang nghĩ đến việc sử dụng reformulate()
, as demonstrated here.Bất kỳ cạm bẫy nào khi sử dụng các công thức được lập trình sẵn?
Chức năng fun()
bên dưới dường như thực hiện công việc, phù hợp với mô hình mong muốn. Tuy nhiên, lưu ý rằng nó ghi lại trong phần tử gọi của nó là tên của đối tượng công thức được xây dựng thay vì giá trị của nó.
## (1) Function using programatically contructed formula
fun <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
#
# Call:
# lm(formula = ff, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
#
# Call:
# lm(formula = mpg ~ cyl + disp, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
Câu hỏi của tôi: Có bất kỳ nguy hiểm trong việc này? Ví dụ, điều này có thể trở thành vấn đề nếu sau này tôi muốn áp dụng update
hoặc predict
hoặc một số chức năng khác cho đối tượng phù hợp với mô hình, (có thể từ một số môi trường khác)?
Một sự thay thế hơi khó xử hơn, tuy nhiên, hãy ghi lại quyền gọi được ghi lại là sử dụng eval(substitute())
. Đây có phải là cách xây dựng an toàn hơn không?
fun2 <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
eval(substitute(lm(FF, data=mtcars), list(FF=ff)))
}
fun2(XX=c("cyl", "disp"))$call
## lm(formula = mpg ~ cyl + disp, data = mtcars)
Tôi nghĩ rằng vấn đề sẽ được cẩn thận bằng cách sử dụng 'update' xem [http://stackoverflow.com/questions/13690184/update-inside-a-function-only-searches-the-global-environment]. Bạn thường có thể tìm ra những cạm bẫy này bằng cách cố gắng sử dụng 'data.table' - xem [http://stackoverflow.com/questions/15096811/why-is-using-update-on-a-lm-inside-a- grouped-data-table-loss-its-model-data/15376891 # 15376891] – mnel
Tác phẩm này: 'do.call (" lm ", danh sách (ff, quote (mtcars)))' –
@ G.Gothendieck - Cảm ơn . Điều đó có vẻ tốt, và có vẻ như nó không nên đặt ra bất kỳ vấn đề xuống đường. (Ngoài ra, cảm ơn mnel cho các liên kết thú vị.) –