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

21

我想要将特定变量强制输入到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))))))

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

glm(Y~., family=binomial, data=samp)
但是假设我想要包含所有主要术语 (W1、W2 和 A),再加上 W2 的平方:
glm(Y~A+W1+W2+I(W2^2), family=binomial, data=samp)

有没有这个的快捷方式?

[发布之前编辑自己:] 这个可以用!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)

显然,如果只有少量变量,就不需要真正的快捷方式,但是我处理高维数据。当前数据集仅有"200"个变量,但其他一些数据集有成千上万个变量。


1
哦,哇,非常抱歉,我刚刚也解决了我的第二个问题!glm(Y~.-W1+A*I(W2^2), family=binomial, data=samp)希望这能帮助其他人,所以把它放在这里也不错。 - S.R.
2个回答

23

使用.巧妙地构建包含所有或几乎所有变量的公式是一种好的、干净的方法。另一个有时很有用的选项是以字符串的形式编写公式,然后使用as.formula将其转换为公式:

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

当然,您可以让fla对象更加复杂。


16
安妮克回答了你的问题。稍微补充一下:
你也可以使用“-”来排除变量:
glm(Y~.-W1+A*I(W2^2), family=binomial, data=samp)

对于大量的变量,我经常会创建一个框架来对变量进行分组,这样可以方便地执行以下操作:

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)

使用各种条件(按名称、按结构等)来填充数据框,可以使我在大型数据集中快速选择变量组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接