我想强制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^2:
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个变量,但其他一些变量有数千个。
发布于 2010-08-28 21:21:40
创造性地使用.来构建包含所有或几乎所有变量的公式是一种很好的、干净的方法。另一个有时有用的选项是以编程方式将公式构建为字符串,然后使用as.formula将其转换为公式:
vars <- paste("Var",1:10,sep="")
fla <- paste("y ~", paste(vars, collapse="+"))
as.formula(fla)当然,您可以使fla对象变得更加复杂。
发布于 2010-08-29 16:34:51
Aniko回答了你的问题。要扩展一点,请执行以下操作:
您还可以使用-排除变量:
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)使用所有类型的条件(on name、on structure等)来填充数据框架,使我能够快速选择大型数据集中的变量组。
https://stackoverflow.com/questions/3588961
复制相似问题