Как увеличить количество перестановок в функции перекрестной проверки GLM `cv.glm`

Мне интересно, есть ли у кого-нибудь опыт указания количества перестановок в функции перекрестной проверки GLM cv.glm (пакет: загрузка)? Я использую настройки K=2 для разделения наборов для обучения и проверки примерно на две равные группы. Мои результаты $delta могут сильно различаться в некоторых случаях в зависимости от случайного начального числа. Из справки ?cv.glm я не вижу возможности увеличить количество перестановок.

Пример

require(boot)

DF <- structure(list(Y = c(0.158507483, 0.008510161, 0.002684648, 0.009587276, 
0.001803681, 0.010173461, 0.002273384, 0.00345826, 0.051424454, 
0.029937484, 0.194813452, 0.042138033, 0.022944148, 0.729585218, 
0.887009621, 0.008899131, 0.001588576, 0.0216036, 0.001409499, 
0.161051383, 0.026504919, 0.001495132, 0.059066545, 0.008317594, 
0.490868633, 0.057027831), X1 = c(0.0974369543591941, -0.11971810600977, 
-0.168908964300336, -0.0011723143713434, -0.200018273737778, 
0.0536459384966756, -0.188248143615029, -0.154736748196712, 0.0529959236206016, 
-0.152396350558232, 0.103766445240172, -0.0693365907826557, -0.114615555500542, 
0.488829422819801, 0.561719898192691, -0.0469180067616361, 0.0631502939411764, 
-0.135689617930714, 0.0343957489602316, -0.0749974069726867, 
-0.107592097416425, 0.067741017650224, -0.167713403634508, 0.275062271178857, 
0.276065626134302, -0.0926000525628916), X2 = c(-0.19192408577628, 
0.116576354094024, 0.208731289320505, -0.138772290234524, 0.364065047213473, 
-0.1574052089755, 0.285540178523006, 0.29343767019163, -0.203222931158516, 
0.0835579872715545, -0.157325117354138, -0.0242157560597033, 
-0.175123479037643, 0.174087353210292, 0.246559485637939, -0.43074835446357, 
-0.0181308378901971, 0.0525230701557242, -0.121813588478372, 
-0.0549274842561502, -0.115591654073407, -0.0190993986035446, 
0.124566313208749, 0.138414677580375, -0.0981459346380045, -0.319191657096572
)), .Names = c("Y", "X1", "X2"), class = "data.frame", row.names = c(NA, 
-26L))

fmla1 <- formula(Y ~ X1 + X2)
glm1 <- glm(fmla1, DF, family=gaussian(link="log"))
summary(glm1)

set.seed(111)
cv1 <- cv.glm(DF, glm1, K=2)
cv2 <- cv.glm(DF, glm1, K=2)
cv3 <- cv.glm(DF, glm1, K=2)
cv4 <- cv.glm(DF, glm1, K=2)

cv1$delta; cv2$delta; cv3$delta; cv4$delta # RESULTS
#[1] 0.007317702 0.005484949
#[1] 0.12918099 0.06621125
#[1]  1.029601e+31 -3.602880e+16
#[1] 0.02860412 0.01581949
    

r glm
person Marc in the box    schedule 26.09.2013    source источник
comment
Под перестановками вы имеете в виду, что хотите запустить двойную перекрестную проверку несколько раз? Если это так, то в cv.glm нет возможности сделать это, но это было бы очень легко реализовать, даже с помощью простого цикла. Однако рассматривали ли вы возможность использования большего количества складок, если хотите оценить изменчивость? Рассматривали ли вы начальную загрузку (которая кажется особенно полезной для того, что вы хотите сделать)?   -  person nograpes    schedule 12.12.2013
comment
Я не знал, что у тебя всего 26 очков. Если это ваши реальные данные, то вы получите очень плохую сходимость на моделях, соответствующих 13 точкам.   -  person nograpes    schedule 12.12.2013
comment
@nograpes - Спасибо за ваши усилия. Я думаю, что у вас есть правильный подход ниже. Хотя это неподходящее место, чтобы спрашивать об этом, знаете ли вы какие-либо практические правила для этих K настроек, т. е. как выбрать между крайностями двухкратной перекрестной проверки и исключения одного, учитывая количество выборок в модель?   -  person Marc in the box    schedule 12.12.2013
comment
У меня нет эмпирического правила. Я думаю, что в этом случае, если вы заинтересованы в оценке того, насколько ваши бета-версии изменятся из-за изменчивости выборки, дисперсия — это лучшее, что вы можете получить. Поскольку параметры glm имеют легко вычисляемую дисперсию, почему бы просто не использовать ее? Кроме того, рассмотрите возможность добавления термина взаимодействия, если вы начертите данные, вы увидите, что вы поймаете несколько выбросов.   -  person nograpes    schedule 12.12.2013


Ответы (1)


В качестве примера многократного запуска функции вы можете сделать:

f<-function() cv.glm(DF,glm1,K=2)$delta
set.seed(111)
replicate(4,f())
#             [,1]       [,2]       [,3]     [,4]
# [1,] 0.013848041 0.05176088 0.06215253 12512004
# [2,] 0.008418343 0.02743163 0.03268880  6256002

Это дает вам матрицу результатов nx2. Просто добавьте n по вкусу. (Обратите внимание, что модель очень часто не сходится с данными, которые вы предоставили. 26 строк недостаточно, чтобы разделить данные на две части.)

person nograpes    schedule 12.12.2013