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

R: multivariate orthogonal regression without having to write the variable names explicitly

我有一个数据框 train(21 个预测变量,1 个响应,1012 个观测值),我怀疑响应是预测变量的非线性函数。因此,我想对所有预测变量的响应执行多元多项式回归,然后尝试了解哪些是最重要的术语。为了避免标准多元多项式回归的共线性问题,我想使用 polym() 的多元正交多项式。但是,我有很多预测变量,它们的名称并不遵循简单的规则。例如,在 train 中,我有名为 X2X3X5 的预测变量,但没有 X1X4。响应是 X14。有没有一种方法可以在 lm 中编写公式而不必显式写入所有预测变量的名称?写作

OrthoModel=lm(X14~polym(.,2),data=train)

returns错误

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="")
     )
     
 )

这种方法有几个问题,其中一个你已经看到了,但即使点可以在 polym 内扩展,你仍然会在 2 被评估,因为 degreepolym 参数列表中 "dots" 之后的参数,因此它必须作为命名参数提供,而不仅仅是位置提供。

使用 as.formula 的方法成功了(在 pkg:nlme 中使用 'Orthodont' 数据框(尽管使用 'Sex' 作为因变量在统计上是无意义的)。我取出了"Subject" 列,并从传递给 paste 的名称中取出 "Sex":

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