我的数据mydata由 R 中的 x1,x2,..,x100,y 列组成。但我正在考虑一个具有二阶项的线性模型,例如 y ~ x1^2 + x2^2 + x1*x2 + ... 如何我应该在公式中还是在 R 中以任何其他方式实现这一点?
当我在上面尝试时,我的模型pls忽略了所有二阶项。我必须手动创建这些列吗?
我的数据mydata由 R 中的 x1,x2,..,x100,y 列组成。但我正在考虑一个具有二阶项的线性模型,例如 y ~ x1^2 + x2^2 + x1*x2 + ... 如何我应该在公式中还是在 R 中以任何其他方式实现这一点?
当我在上面尝试时,我的模型pls忽略了所有二阶项。我必须手动创建这些列吗?
R的公式文档显示了如何执行此操作。简而言之,您使用poly(). 例如,制作一些二次数据:
x <- rnorm(100)
y <- x + x**2 * 0.5 + rnorm(100)
现在使用这样的二阶多项式(即x和x**2)来拟合它
mod <- lm(y ~ poly(x, 2))
请注意,这将拟合正交多项式,因此它不会恢复 1 和 0.5 作为生成分布中的系数。如果出于某种原因您想要这样做,请使用poly(x, 2, raw=TRUE). 一般来说,你不会出于稳定性的原因,所以坚持使用煮熟的版本。
还有polym如下情况:lm(y ~ polym(x, z, degree=2)对于具有完整交叉变量集的模型,解释起来有点麻烦,但这对于数百个变量可能并不重要。
类型 :
lm(y ~ x1 + x2 + I(x1*x2) + I(x1^2) + ...)
以下是原则上如何做到这一点,在一个只有 10 个预测变量的较小数据集上进行说明:
# Make fake data
mydata = as.data.frame(matrix(rnorm(1100), 100))
names(mydata) = c(paste0("x", 1:10), "y")
# Form a matrix containing all predictor columns but not y
x = as.matrix(mydata[, 1:10])
# Use poly() to form all 2-way interactions and 2nd order terms
x2 = poly(x, degree = 2, raw = TRUE)
# Resave as a data frame including y
mydata2 = as.data.frame(cbind(x2, y = mydata$y))
# Fit the complete linear model
lm2 = lm(y ~ ., data = mydata2)
但是,您有 100 个预测变量。根据我的经验,如果预测变量超过 10-15 个,R 通常无法为包含每个 2 向交互的矩阵分配足够的内存。你会得到无用的错误,或者 R 会简单地崩溃。
如果是这样,请考虑您是否真的需要所有双向交互。也许只是一个子集是有意义的。例如,您可以使用poly()上述方法在 x 的一个子集内形成所有双向交互,然后再次在 x 的另一个子集之间形成交互,但在这些子集之间没有任何交互。