2

我有一个数据框train(21 个预测变量、1 个响应、1012 个观察值),我怀疑响应是预测变量的非线性函数。因此,我想对所有预测变量的响应执行多元多项式回归,然后尝试了解哪些是最重要的术语。为了避免标准多元多项式回归的共线性问题,我想将多元正交多项式与polym(). 但是,我有相当多的预测变量,它们的名称并不遵循简单的规则。例如,在train我有名为X2, X3and的预测变量X5,但不是X1and 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=""))` 

whereXtraintrain通过删除响应列获得的X14。但是,当我尝试在正交基础上表达多项式时,会出现解析文本错误:

    as.formula( 
         paste(" X14 ~ (", paste0(names(Xtrain), collapse="+"), ")^2", "+", 
               paste( "poly(", paste0(names(Xtrain), ", degree=2)", 
                      collapse="+"), 
               collapse="")
     )
     
 )
4

1 回答 1

2

这种方法有几个问题,您已经看到其中一个问题,但即使点可以在内部展开,您仍然会在需要评估polym时遇到错误,因为是“点”之后的参数" 在参数列表中,因此它必须作为命名参数提供,而不仅仅是位置提供。2degreepolym

一种使用as.formula成功的方法(使用 pkg:nlme 中的“Orthodont”数据框(尽管使用“Sex”作为因变量在统计上是无稽之谈)。我从数据中取出“主题”列,并从中取出“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

于 2015-08-25T17:31:36.573 回答