在 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
上的所有公式交互
我有用于创建人工数据集的代码:
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
上的所有公式交互