使用glm在R中指定公式而不明确声明每个协变量

S.R*_*.R. 21 program-entry-point regression r glm

我想强制特定的变量进入glm回归而不完全指定每个变量.我的真实数据集有大约200个变量.到目前为止,我还没有在我的在线搜索中找到这样的样本.

例如(只有3个变量):

n=200
set.seed(39) 
samp = data.frame(W1 = runif(n, min = 0, max = 1), W2=runif(n, min = 0, max = 5)) 
samp = transform(samp, # add A
A = rbinom(n, 1, 1/(1+exp(-(W1^2-4*W1+1))))) 
samp = transform(samp, # add Y
Y = rbinom(n, 1,1/(1+exp(-(A-sin(W1^2)+sin(W2^2)*A+10*log(W1)*A+15*log(W2)-1+rnorm(1,mean=0,sd=.25))))))
Run Code Online (Sandbox Code Playgroud)

如果我想包含所有主要术语,这有一个简单的快捷方式:

glm(Y~., family=binomial, data=samp)
Run Code Online (Sandbox Code Playgroud)

但是说我想要包括所有主要术语(W1,W2和A)加上W2 ^ 2:

glm(Y~A+W1+W2+I(W2^2), family=binomial, data=samp)
Run Code Online (Sandbox Code Playgroud)

这有什么捷径吗?

[在发布之前编辑自己:]这个有效! glm(formula = Y ~ . + I(W2^2), family = binomial, data = samp)

好的,那么这个呢!

我想省略一个主要的术语变量,只包括两个主要术语(A,W2)和W2 ^ 2和W2 ^ 2:A:

glm(Y~A+W2+A*I(W2^2), family=binomial, data=samp)
Run Code Online (Sandbox Code Playgroud)

显然只有几个变量不需要快捷方式,但我使用高维数据.当前数据集"仅"有200个变量,但其他一些变量有成千上万个.

Ani*_*iko 21

.创造性地使用包含所有或几乎所有变量的公式是一种良好而干净的方法.另一个有用的选项是以编程方式将公式构建为字符串,然后使用as.formula以下公式将其转换为公式:

vars <- paste("Var",1:10,sep="")
fla <- paste("y ~", paste(vars, collapse="+"))
as.formula(fla)
Run Code Online (Sandbox Code Playgroud)

当然,您可以使fla对象更复杂.


Jor*_*eys 16

Aniko回答了你的问题.延长一点:

您还可以使用 - 来排除变量:

glm(Y~.-W1+A*I(W2^2), family=binomial, data=samp)
Run Code Online (Sandbox Code Playgroud)

对于大型变量组,我经常创建一个用于对变量进行分组的框架,这允许您执行以下操作:

vars <- data.frame(
    names = names(samp),
    main = c(T,F,T,F),
    quadratic =c(F,T,T,F),
    main2=c(T,T,F,F),
    stringsAsFactors=F
)


regform <- paste(
    "Y ~",
    paste(
      paste(vars[vars$main,1],collapse="+"),
      paste(vars[1,1],paste("*I(",vars[vars$quadratic,1],"^2)"),collapse="+"),
      sep="+"
    )
)
> regform
[1] "Y ~ W1+A+W1 *I( W2 ^2)+W1 *I( A ^2)"

> glm(as.formula(regform),data=samp,family=binomial)
Run Code Online (Sandbox Code Playgroud)

使用所有条件(在名称,结构上,等等)来填充数据框,允许我在大型数据集中快速选择变量组.