在 r 插入符号中使用二次项

Using quadratic terms in r caret

我有用于创建人工数据集的代码:

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');

两者调用 return 相同的模型,即系数和 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 STILL 适合很好的功能,但 smallModel1 完全失败。有什么想法吗?


我怀疑问题是我误用了符号*。我认为它只是意味着“使用这两列的乘积*或类似的东西,但显然它没有。没有提到如何在整个 caret 手册,至少我能看到它。我没有想法。

X1*X1 不是公式术语中的二次项。它表示相互作用。公式中的 X1*X1 将其自身翻译为 X1 + X1 + X1:X1

如果你想要一个二次项你需要使用I(X1^2)

查看 this website

上的所有公式交互