具有不同样本大小的k倍交叉验证

时间:2015-12-07 05:05:35

标签: r dplyr r-caret subsampling

我有来自3个站点的组合数据集,并且想知道通用关系如何与站点特定关系进行比较。该计划是k倍交叉验证。基于此cross validated question,我需要按比例从不同的站点进行采样,因为它们包含不同数量的观测值。我之前使用caret完成了k-fold cv:

library(dplyr)
library(caret)   
dF=data_frame(y=runif(100,1,6),x1=runif(100),x2=runif(100),site=c(rep('a',20),rep('b',20),rep('c',60)) %>% group_by(site)
train_control<- trainControl(method="repeatedcv", number = 4, repeats = 3, savePredictions = TRUE)
model<- train(y~x1*x2+I(x2^2), data=dF, trControl=train_control, method='glmStepAIC',family=gaussian(link='log'))# no need to preprocess because x1 and x2 both have theoretical values (0,1].

但现在还没有弄清楚如何改变分区,以便观察更多的网站不会对模型技能造成不公平的影响。

因此,我喜欢的最终结果是r2的数据帧和站点a,b和c以及所有数据的平均绝对误差。同样,我想知道每个模型场景中x1和x2的参数。

修改 我在插入符号文档中发现了downSample,我认为应该对此有所帮助但我一直收到错误。有人知道为什么会这样吗? OSX 10.11.1,R 3.2.2,caret_6.0-58

down_train <- downSample(x = dplyr::select(datadF,-basin), y = as.factor(datadF$basin))
Error in sample.int(length(x), size, replace, prob) : 
  cannot take a sample larger than the population when 'replace = FALSE'

1 个答案:

答案 0 :(得分:0)

我最终写下这些函数做我需要的:

我调用的函数partition_data计算出每个盆地中有多少个洞,取所有盆地中的最小值,然后用frac样本从每个盆地取出多少个样本。< / p>

第二个帮助函数基本上只从createDataPartition包中为每个盆地调用caret(使用dplyr中的split / apply / combine),其中perc是观察的百分比这应该被划分以适合每个特定的盆地。

partition_data = function(dF,frac) {
    numobs = dF %>% group_by(basin) %>% summarise(nrw = n()) %>% summarise(frac*min(nrw)) %>% as.numeric
    print(numobs)
    testdata = dF %>% group_by(basin) %>%
        do(site_partition(.,numobs))
}

site_partition = function(dF,numobs) { 
perc=numobs/nrow(dF)    
print(paste(unique(dF$basin),': perc =', perc))     
ind = createDataPartition(dF$snowdepth,
                        p = perc,
                        list = FALSE,
                        times = 1)  
return(dF[ind,]) 
}


datadF=data_frame(y=runif(100,1,6),x1=runif(100),x2=runif(100),site=c(rep('a',20),rep('b',20),rep('c',60)) %>% group_by(site)
testdata = partition_data(datadF,0.6)#fit using this data.
valdata=anti_join(datadF,testdata)#independent validation with this data