【发布时间】:2017-08-08 14:32:33
【问题描述】:
我需要在 R 中拟合一个线性 SVM,它有一个特征作为响应,模型中每个其他特征的线性二次项和交互项作为预测变量。 是否有一个函数可以帮助计算其余预测变量(大约 15 个单独的预测变量)的线性、二次和交互项
【问题讨论】:
标签: r statistics svm
我需要在 R 中拟合一个线性 SVM,它有一个特征作为响应,模型中每个其他特征的线性二次项和交互项作为预测变量。 是否有一个函数可以帮助计算其余预测变量(大约 15 个单独的预测变量)的线性、二次和交互项
【问题讨论】:
标签: r statistics svm
y ~ . :这里.被解释为用于拟合模型的数据框中除y之外的所有变量。它相当于预测变量的线性组合。例如y ~ var1 + var2 + var3+...+var15
y ~ . ^ 2 将给出数据框中变量的所有线性(主效应)和二阶交互项。相当于y ~ var1 + var2 + ...+var15 + var1:var2 + var1:var3 + var1:var4...and so on
y ~ var1 + var2 + ...+var15 + I(var1^2) + I(var2^2) + I(var3^2)...+I(var15^2):这里I(var^2)表示数据框中一个变量的二次多项式。
y ~ poly(var1, degree = 2) + poly(var2, degree = 2)+...poly(var15, degree = 2)
或
y ~ poly(var1, var2, var3, ....var15, degree = 2) 将等价于上述表达式。
poly(var1, degree = 2) 等价于 var1 + I(var1^2)。
要获得三次多项式,请在poly() 或I(var1^3) 中使用degree = 3。
使用poly与I(var, 2)有一个注意事项,就是在拟合模型后,它们各自会产生不同的系数,但拟合值是等价的,因为它们代表了同一模型的不同参数化。建议使用I(var, 2) 而不是poly() 以避免出现poly() 中看到的汇总效果。
总而言之,要获得线性、二次和二阶交互项,您将有如下表达式
y ~ .^2 + I(var1^2) + I(var2^2)+...I(var15^2)
四个变量的演示:
old <- reformulate( 'y ~ x1+x2+x3+x4' )
new <- reformulate( " y ~ .^2 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2) ")
tmp <- .Call(stats:::C_updateform, old, new)
tmp
# ~y ~ (x1 + x2 + x3 + x4)^2 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2)
# attr(,".Environment")
# <environment: R_GlobalEnv>
terms.formula(tmp, simplify = TRUE )
# ~y ~ x1 + x2 + x3 + x4 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2) +
# x1:x2 + x1:x3 + x1:x4 + x2:x3 + x2:x4 + x3:x4
# attr(,"variables")
# list(~y, x1, x2, x3, x4, I(x1^2), I(x2^2), I(x3^2), I(x4^2))
# attr(,"factors")
# x1 x2 x3 x4 I(x1^2) I(x2^2) I(x3^2) I(x4^2) x1:x2 x1:x3 x1:x4 x2:x3 x2:x4 x3:x4
# ~y 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# x1 1 0 0 0 0 0 0 0 1 1 1 0 0 0
# x2 0 1 0 0 0 0 0 0 1 0 0 1 1 0
# x3 0 0 1 0 0 0 0 0 0 1 0 1 0 1
# x4 0 0 0 1 0 0 0 0 0 0 1 0 1 1
# I(x1^2) 0 0 0 0 1 0 0 0 0 0 0 0 0 0
# I(x2^2) 0 0 0 0 0 1 0 0 0 0 0 0 0 0
# I(x3^2) 0 0 0 0 0 0 1 0 0 0 0 0 0 0
# I(x4^2) 0 0 0 0 0 0 0 1 0 0 0 0 0 0
# attr(,"term.labels")
# [1] "x1" "x2" "x3" "x4" "I(x1^2)" "I(x2^2)" "I(x3^2)" "I(x4^2)"
# [9] "x1:x2" "x1:x3" "x1:x4" "x2:x3" "x2:x4" "x3:x4"
# attr(,"order")
# [1] 1 1 1 1 1 1 1 1 2 2 2 2 2 2
# attr(,"intercept")
# [1] 1
# attr(,"response")
# [1] 1
# attr(,".Environment")
# <environment: R_GlobalEnv>
【讨论】: