R:多元正交回归,无需明确写出变量名
R: multivariate orthogonal regression without having to write the variable names explicitly
我有一个数据框 train
(21 个预测变量,1 个响应,1012 个观测值),我怀疑响应是预测变量的非线性函数。因此,我想对所有预测变量的响应执行多元多项式回归,然后尝试了解哪些是最重要的术语。为了避免标准多元多项式回归的共线性问题,我想使用 polym()
的多元正交多项式。但是,我有很多预测变量,它们的名称并不遵循简单的规则。例如,在 train
中,我有名为 X2
、X3
和 X5
的预测变量,但没有 X1
和 X4
。响应是 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
被评估,因为 degree
是 polym
参数列表中 "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
中最后一个示例的应用。
我有一个数据框 train
(21 个预测变量,1 个响应,1012 个观测值),我怀疑响应是预测变量的非线性函数。因此,我想对所有预测变量的响应执行多元多项式回归,然后尝试了解哪些是最重要的术语。为了避免标准多元多项式回归的共线性问题,我想使用 polym()
的多元正交多项式。但是,我有很多预测变量,它们的名称并不遵循简单的规则。例如,在 train
中,我有名为 X2
、X3
和 X5
的预测变量,但没有 X1
和 X4
。响应是 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
被评估,因为 degree
是 polym
参数列表中 "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
中最后一个示例的应用。