作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,考虑 R 中的基本回归模型:
form1 <- Petal.Length ~ Sepal.Length + Sepal.Width
fit1 <- lm(form1, iris)
form2 <- . ~ Sepal.Length*Sepal.Width + I(Sepal.Length^2) + I(Sepal.Width^2)
fit2 <- update(fit1, form2)
vars <- attr(terms(form1), "term.labels")
squared_terms <- sprintf("I(%s^2)", vars)
inter_terms <- combn(vars, 2, paste, collapse = "*")
form2 <- reformulate(c(inter_terms, squared_terms), ".")
library(lazyeval)
library(dplyr)
square <- function (v) interp(~ I(v1^2), v1 = as.name(v))
inter <- function(v) interp(~ v1*v2, v1 = as.name(v[1]), v2 = as.name(v[2]))
vars <- attr(terms(form1), "term.labels")
squared_terms <- lapply(vars, square) %>%
set_names(paste0(vars, " ^2"))
inter_terms <- combn(vars, 2, inter, simplify = FALSE) %>%
set_names(combn(vars, 2, paste, collapse = " x "))
fit2 <- model.frame(fit1) %>%
mutate_(.dots = squared_terms) %>%
mutate_(.dots = inter_terms) %>%
lm(Petal.Length ~ ., data = .)
formula
的目的。首先。
library(lazyeval)
library(dplyr)
square <- function (v) interp(~ I(v1^2), v1 = as.name(v))
inter <- function(v) interp(~ v1*v2, v1 = as.name(v[1]), v2 = as.name(v[2]))
squared_terms <- apply.formula(form1, squared_terms)
inter_terms <- combn.formula(form1, 2, inter)
fit2 <- form1 %>%
append.formula(squared_terms) %>%
append.formula(inter_terms) %>%
update(fit1, .)
dplyr
除此之外,这里有两个杀手级功能:
最佳答案
好的,这里有很多动人的部分,但这里有一些非常具体的帮助函数
extract_rhs_symbols <- function(x) {
as.list(attr(delete.response(terms(x)), "variables"))[-1]
}
symbols_to_formula <- function(x) {
as.call(list(quote(`~`), x))
}
sum_symbols <- function(...) {
Reduce(function(a,b) bquote(.(a)+.(b)), do.call(`c`, list(...), quote=T))
}
square_terms <- function(x) {
symbols_to_formula(sum_symbols(sapply(extract_rhs_symbols(x), function(x) bquote(I(.(x)^2)))))
}
interact_rhs<-function(x) {
x[[length(as.list(x))]] <- bquote((.(x[[length(as.list(x))]]))^2)
x
}
add_rhs_dot <- function(x) {
x[[length(as.list(x))]] <- sum_symbols(quote(.), x[[length(as.list(x))]])
x
}
add_terms<-function(f, x) {
update(f, add_rhs_dot(x))
}
my.formula <- Petal.Length ~ Sepal.Length + Sepal.Width + Other
add_terms(my.formula, square_terms(my.formula))
interact_rhs(my.formula)
add_terms(interact_rhs(my.formula), square_terms(my.formula))
Petal.Length ~ Sepal.Length + Sepal.Width + Other + I(Sepal.Length^2) +
I(Sepal.Width^2) + I(Other^2) + Sepal.Length:Sepal.Width +
Sepal.Length:Other + Sepal.Width:Other
关于r - 以编程方式构建公式而无需字符串操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29690068/
我是一名优秀的程序员,十分优秀!