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

时间:2016-03-16 10:33:56

标签: r r-caret

我有这个代码用于创建一个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手册中编写公式,就我所知,我处于领先地位。我没有想法。

1 个答案:

答案 0 :(得分:1)

X1*X1不是公式中的二次项。它表明了互动。公式中的X1 * X1将自身转换为X1 + X1 + X1:X1

如果您想要二次项,则需要使用I(X1^2)

查看this website

上的所有公式互动