重要函数总结:
dummyVars(survived ~ ., data = etitanic)
nzv <- nearZeroVar(mdrrDescr)
findCorrelation(descrCor, cutoff = .75)
Dummy Variable
哑变量(Dummy Variable),也叫虚拟变量,引入哑变量的目的是,将不能够定量处理的变量量化,如职业、性别对收入的影响,战争、自然灾害对GDP的影响,季节对某些产品(如冷饮)销售的影响等等。 这种“量化”通常是通过引入“哑变量”来完成的。根据这些因素的属性类型,构造只取“0”或“1”的人工变量,通常称为哑变量(dummy variables),记为D。
对于有n个分类的自变量,需要产生n-1个哑变量,当所有n-1个哑变量取值都为0的时候,这就是该变量的第n类属性,即我们将这类属性作为参照。
什么情况下需要设置哑变量
1. 对于无序多分类变量,引入模型时需要转化为哑变量
举一个例子,如血型,一般分为A、B、O、AB四个类型,为无序多分类变量,通常情况下在录入数据的时候,为了使数据量化,我们常会将其赋值为1、2、3、4。
从数字的角度来看,赋值为1、2、3、4后,它们是具有从小到大一定的顺序关系的,而实际上,四种血型之间并没有这种大小关系存在,它们之间应该是相互平等独立的关系。如果按照1、2、3、4赋值并带入到回归模型中是不合理的,此时我们就需要将其转化为哑变量。
2. 对于有序多分类变量,引入模型时需要酌情考虑
例如疾病的严重程度,一般分为轻、中、重度,可认为是有序多分类变量,通常情况下我们也常会将其赋值为1、2、3(等距)或1、2、4(等比)等形式,通过由小到大的数字关系,来体现疾病严重程度之间一定的等级关系。
但需要注意的是,一旦赋值为上述等距或等比的数值形式,这在某种程度上是认为疾病的严重程度也呈现类似的等距或等比的关系。而事实上由于疾病在临床上的复杂性,不同的严重程度之间并非是严格的等距或等比关系,因此再赋值为上述形式就显得不太合理,此时可以将其转化为哑变量进行量化。
3. 对于连续性变量,进行变量转化时可以考虑设定为哑变量
对于连续性变量,很多人认为可以直接将其带入到回归模型中即可,但有时我们还需要结合实际的临床意义,对连续性变量作适当的转换。例如年龄,以连续性变量带入模型时,其解释为年龄每增加一岁时对于因变量的影响。但往往年龄增加一岁,其效应是很微弱的,并没有太大的实际意义。
此时,我们可以将年龄这个连续性变量进行离散化,按照10岁一个年龄段进行划分,如0-10、11-20、21-30、31-40等等,将每一组赋值为1、2、3、4,此时构建模型的回归系数就可以解释为年龄每增加10岁时对因变量的影响。
以上赋值方式是基于一个前提,即年龄与因变量之间存在着一定的线性关系。但有时候可能会出现以下情况,例如在年龄段较低和较高的人群中,某种疾病的死亡率较高,而在中青年人群中,死亡率却相对较低,年龄和死亡结局之间呈现一个U字型的关系,此时再将年龄段赋值为1、2、3、4就显得不太合理了。
因此,当我们无法确定自变量和因变量之间的变化关系,将连续性自变量离散化时,可以考虑进行哑变量转换。
还有一种情况,例如将BMI按照临床诊断标准分为体重过低、正常体重、超重、肥胖等几种分类时,由于不同分类之间划分的切点是不等距的,此时赋值为1、2、3就不太符合实际情况,也可以考虑将其转化为哑变量。
caret package
library(earth)data(etitanic)head(model.matrix(survived ~ ., data = etitanic))dummies <- dummyVars(survived ~ ., data = etitanic)head(predict(dummies, newdata = etitanic))
Zero and Near Zero-Variance Predictors
处理的为连续变量:
去除几乎为单一元素的变量有两种衡量方法:
1. 最prevalent的value / 第二prevalent的value,如果0-variance,这个数值会很大。
2. unique values / 总个数, 如果0-variance,这个数值会很小 (不包括分类变量)。
nearZeroVar函数(同时利用以上2种衡量方法):
nzv <- nearZeroVar(mdrrDescr, saveMetrics= TRUE)nzv[nzv$nzv,][1:10,]dim(mdrrDescr)nzv <- nearZeroVar(mdrrDescr)filteredDescr <- mdrrDescr[, -nzv]dim(filteredDescr)
Identifying Correlated Predictors
节省计算空间等原因,删除高correlated的变量
upper.tri(matrix), 得到上半个matrix
findCorrelation函数:
findCorrelation(descrCor, cutoff = .75)
根据cutoff寻找correlaiton高的变量的位置。
descrCor <- cor(filteredDescr)highCorr <- sum(abs(descrCor[upper.tri(descrCor)]) > .999)descrCor <- cor(filteredDescr)summary(descrCor[upper.tri(descrCor)])highlyCorDescr <- findCorrelation(descrCor, cutoff = .75)filteredDescr <- filteredDescr[,-highlyCorDescr]descrCor2 <- cor(filteredDescr)summary(descrCor2[upper.tri(descrCor2)])
Linear Dependencies
很多线性模型需要去除线性相关变量,否则无法求线性最优解的逆矩阵
findLinearCombos(matrix) : 通过QR寻找linear dependent columns, 然后逐个删除
ltfrDesign <- matrix(0, nrow=6, ncol=6)ltfrDesign[,1] <- c(1, 1, 1, 1, 1, 1)ltfrDesign[,2] <- c(1, 1, 1, 0, 0, 0)ltfrDesign[,3] <- c(0, 0, 0, 1, 1, 1)ltfrDesign[,4] <- c(1, 0, 0, 1, 0, 0)ltfrDesign[,5] <- c(0, 1, 0, 0, 1, 0)ltfrDesign[,6] <- c(0, 0, 1, 0, 0, 1)comboInfo <- findLinearCombos(ltfrDesign)comboInfoltfrDesign[, -comboInfo$remove]
Pre-process Function






preProcess function
先对训练集建立preProcess object,然后用predict分别对train 和 testing 进行数据pre-Process
method =Possible values are “BoxCox”, “YeoJohnson”, “expoTrans”, “center”, “scale”, “range”, “knnImpute”, “bagImpute”, “medianImpute”, “pca”, “ica”, “spatialSign”, “corr”, “zv”, “nzv”, and “conditionalX”
scale 和 center只针对numerical variable,但是categorical不会报错。
set.seed(96)inTrain <- sample(seq(along = mdrrClass), length(mdrrClass)/2)training <- filteredDescr[inTrain,]test <- filteredDescr[-inTrain,]trainMDRR <- mdrrClass[inTrain]testMDRR <- mdrrClass[-inTrain]preProcValues <- preProcess(training, method = c("center", "scale"))trainTransformed <- predict(preProcValues, training)testTransformed <- predict(preProcValues, test)
Data Impute
Data imputation using either KNN or a bagged tree
caret包会自动把数据进行scale和center(所以caret kNN imputation应该不能impute categorical variable)
or using VIM package
preProcess_missingdata_model <-preProcess(train[,c('Embarked', 'Sex')], method='knnImpute')
library(VIM)kNN(data, variable = colnames(data), k =5)
Overall Process
incorporate nzv into the method in preProcess function
library(AppliedPredictiveModeling)data(schedulingData)str(schedulingData)pp_no_nzv <- preProcess(schedulingData[, -8],method = c("center", "scale", "YeoJohnson", "nzv"))pp_no_nzvpredict(pp_no_nzv, newdata = schedulingData[1:6, -8])
Class Dict
create new variables
centroids <- classDist(trainBC, trainMDRR)distances <- predict(centroids, testBC)distances <- as.data.frame(distances)head(distances)
