R:多变量正交回归,无需明确编写变量名称

时间:2015-08-25 16:30:48

标签: r linear-regression polynomials orthogonal

我有一个数据帧train(21个预测变量,1个响应,1012个观测值),我怀疑响应是预测变量的非线性函数。因此,我想对所有预测变量执行响应的多元多项式回归,然后尝试理解哪些是最重要的术语。为了避免标准多元多项式回归的共线性问题,我想使用带有polym()的多元正交多项式。但是,我有很多预测因子,他们的名字并不遵循一个简单的规则。例如,在train中,我的预测变量名为X2X3X5,但不是X1X4。回复是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="")
 )

你能帮助我吗?

1 个答案:

答案 0 :(得分:2)

这种方法存在一些问题,其中一个你已经看到了,但即使点可以在polym范围内扩展,当2出现时你仍然会遇到错误要进行评估,因为degreepolym参数列表中“点”之后的参数,因此它必须作为命名参数提供,而不是仅仅按位置提供。

使用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中最后一个例子的应用。