R中的折叠数据用于基于条件的k折叠交叉验证

时间:2016-08-10 23:18:55

标签: r validation fold

我正在使用随机效应模型研究黑尾鹿的资源选择如下:

  suma<-read.csv("sum_active.csv", header=TRUE) 
suma$bps1<-as.factor(suma$bps)
suma$sclass1<-as.factor( suma$sclass1)
suma$sclass2<-as.factor( suma$sclass2)
suma$sclass3<-as.factor( suma$sclass3)
suma$sclass4<-as.factor( suma$sclass4)
suma$sclass5<-as.factor( suma$sclass5)
suma$sclass6<-as.factor( suma$sclass6)


stdsuma<- suma
stdsuma$cc <- scale(stdsuma$cc)
stdsuma$edgedensi <- scale(stdsuma$edgedensi)
stdsuma$dem <- scale(stdsuma$dem)
stdsuma$dist <- scale(stdsuma$dist)
stdsuma$waterdst <- scale(stdsuma$waterdst)
stdsuma$vrm <- scale(stdsuma$vrm)
stdsuma$slp <- scale(stdsuma$slp)
stdsuma$sin <- scale(stdsuma$sin)
stdsuma$cos <- scale(stdsuma$cos)
stdsuma$july <- scale(stdsuma$july)

sumaf1<-glmer( UA ~ dem+cos+sin+slp+edgedensi+bps1*sclass1+vrm+(1 | ID), data=stdsuma, family=binomial, glmerControl(optimizer="bobyqa", optCtrl = list(maxfun = 100000)))

我正在进行5倍交叉验证,以使用公式

测试我最佳模型假设的稳健性
##Divide the data
k = 5 #Folds

# sample from 1 to k, nrow times (the number of observations in the data)
data$id <- sample(1:k, nrow(data), replace = TRUE)
list <- 1:k

# prediction and testset data frames that we add to with each iteration over
# the folds

prediction <- data.frame()
testsetCopy <- data.frame()

#Creating a progress bar to know the status of CV
progress.bar <- create_progress_bar("text")
progress.bar$init(k)


PTOT=NULL
for (i in 1:k)
  {
    # remove rows with id i from dataframe to create training set
    # select rows with id i to create test set
    trainingset <- subset(data, id %in% list[-i])
    testset <- subset(data, id %in% c(i))
  M1 <- glmer( UA ~ dem+cos+sin+slp+edgedensi+bps1*sclass1+vrm+(1 | ID),  data = trainingset, family=binomial, glmerControl(optimizer="bobyqa", optCtrl = list(maxfun = 100000)))

  P1=predict(M1, testset)
  names(P1)=NULL
  P1
  PTOT= c(PTOT, P1)
}

然而,鉴于我的位置数据嵌套在每个人中,我担心当我将数据集随机分成5个部分时,来自同一个体的位置会被拆分并放入不同的折叠中,这会影响预测能力。我的验证。

为了解决这个问题,我创建了一个基于我个人使用的夏季范围的列(它们聚集在我的研究区域内的5个不同的夏季范围内),并希望使用一个聚类作为测试集,并将其余的随机化为四个折叠为训练集并将其循环遍历每个群集。

P.S。链接到数据:https://www.dropbox.com/s/33u1lqav8v718ah/sum_active.csv?dl=0

0 个答案:

没有答案