2015-12-07 49 views
0

我有3個站點的組合數據集,想知道普遍關係與站點特定關係的比較。該計劃是一個k-fold交叉驗證。根據這cross validated question,我需要從我的不同站點按比例抽樣,因爲它們由不同數量的觀察值組成。我已經做了K-CV倍與caret前:不同樣本大小的k倍交叉驗證

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' 
+0

採樣錯誤是因爲'sample(... replace = FALSE)'。 IE-你試圖畫出更多的樣本(沒有替換)比你有觀察 –

+0

但我建議使用觀察權重給你的總體目標。 –

+0

我對'downSample'的理解是,它只會從每個站點採樣儘可能多的obs,因爲從obs數量最少的站點可以獲得。那是不正確的?你能否詳細說明「觀察權重」? – Dominik

回答

0

我最後寫這些功能做什麼,我需要:

partition_data我叫數字有多少OBS中有功能每個盆地取所有盆地的最小值,然後用frac從每個盆地取樣多少個樣本。

第二輔助函數基本上只是調用createDataPartitioncaret包爲每個盆(使用分流/應用/從dplyr結合)其中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