我有一个数据帧train
(21个预测变量,1个响应,1012个观测值),我怀疑响应是预测变量的非线性函数。因此,我想对所有预测变量执行响应的多元多项式回归,然后尝试理解哪些是最重要的术语。为了避免标准多元多项式回归的共线性问题,我想使用带有polym()
的多元正交多项式。但是,我有很多预测因子,他们的名字并不遵循一个简单的规则。例如,在train
中,我的预测变量名为X2
,X3
和X5
,但不是X1
和X4
。回复是X14
。有没有办法在lm
中编写公式而无需明确写出所有预测变量的名称?写
OrthoModel=lm(X14~polym(.,2),data=train)
返回错误
Error in polym(., 2) : object '.' not found
谢谢!
编辑:我想要的模型包含大约35亿个术语,所以它没用。适合仅包含主要效果,互动和第二学位术语的术语 - > 231条款。我写了一个标准(非正交)二次多项式的公式:`as.formula(paste(" X14 ~ (", paste0(names(Xtrain), collapse="+"), ")^2", collapse=""))`
Xtrain
通过删除响应列train
获得X14
。但是,当我尝试在正交基础上表达多项式时,我得到一个解析文本错误:
as.formula(
paste(" X14 ~ (", paste0(names(Xtrain), collapse="+"), ")^2", "+",
paste( "poly(", paste0(names(Xtrain), ", degree=2)",
collapse="+"),
collapse="")
)
)
你能帮助我吗?
答案 0 :(得分:2)
这种方法存在一些问题,其中一个你已经看到了,但即使点可以在polym
范围内扩展,当2
出现时你仍然会遇到错误要进行评估,因为degree
是polym
参数列表中“点”之后的参数,因此它必须作为命名参数提供,而不是仅仅按位置提供。
使用as.formula
的方法成功(在pkg中使用'Orthodont'数据框:nlme(虽然使用'Sex'作为因变量在统计上是无意义的。)我从数据中取出了“主题”列,还从传递给paste
的名字中取出了“性别”:
data(Orthodont, package="nlme")
lm( as.formula( paste("Sex~polym(" ,
paste(names(Orthodont[-(3:4)]), collapse=","),",degree=2)")),
data=Orthodont[-3])
Call:
lm(formula = as.formula(paste("Sex~polym(", paste(names(Orthodont[-(3:4)]),
collapse = ","), ",degree=2)")), data = Orthodont[-3])
Coefficients:
(Intercept) polym(distance, age, degree = 2)1.0
1.4433 -2.5849
polym(distance, age, degree = 2)2.0 polym(distance, age, degree = 2)0.1
0.4651 1.3353
polym(distance, age, degree = 2)1.1 polym(distance, age, degree = 2)0.2
-7.6514
可以使用as.formula
从文本输入创建公式对象。这基本上是?as.formula
中最后一个例子的应用。