我有这个代码用于创建一个artifitial数据集:
N=200
X1 <- rnorm(N);
X2 <- rnorm(N);
smallData <- data.frame(Y=1+X1+2*X2+3*X1*X2 + rnorm(N), X1=X1, X2=X2)
我现在使用caret
来学习线性模型。我想包括二阶因子以及线性,即我正在寻找类型
Y= a*X1 + b*X2 + c*X1*X2 + d
我可以通过两种方式实现这一点(均在下面的代码中显示)。
trainCtrl <- trainControl(method='cv', number=10, savePredictions=TRUE);
set.seed(1);
smallModel1 <- train(Y~X1+X2+X1*X2, data=smallData, trControl=trainCtrl, method='glm');
smallData$X1X2=X1*X2
set.seed(1);
smallModel2 <- train(Y~., data=smallData, trControl=trainCtrl, method='glm');
两个调用都返回相同的模型,即系数和RMSE值相同。
但是,假设我还想包含X1*X1
的因素,即我有
smallData <- data.frame(Y=1+X1+2*X2+3*X1*X1 + rnorm(N), X1=X1, X2=X2)
(请注意,现在我有X1*X1
而不是X1*X2
)
如果我运行与以前相同的代码,即
trainCtrl <- trainControl(method='cv', number=10, savePredictions=TRUE);
set.seed(1);
smallModel1 <- train(Y~X1+X2+X1*X1, data=smallData, trControl=trainCtrl, method='glm');
smallData$X1X1=X1*X1
set.seed(1);
smallModel2 <- train(Y~., data=smallData, trControl=trainCtrl, method='glm');
现在,smallModel2
仍然符合一个好的功能,但smallModel1
完全失败。有什么想法吗?
我怀疑问题是我滥用符号*
。我认为它只是意味着“使用这两列的产品*或类似的东西,但显然它没有。有没有提及如何在整个caret
手册中编写公式,就我所知,我处于领先地位。我没有想法。
答案 0 :(得分:1)
X1*X1
不是公式中的二次项。它表明了互动。公式中的X1 * X1将自身转换为X1 + X1 + X1:X1
。
如果您想要二次项,则需要使用I(X1^2)