2016-08-23 4 views
0

Я хочу выполнить перекрестное подтверждение IDW и выяснить, какая «мощность» -значения дает наименьшее значение RMSE. Для того, чтобы сделать это, я хочу, чтобы сохранить «власть» и «RMSE» -значения в списке и сортирует их по наименьшему RMSE, напримерR: Как вычислить и отсортировать две переменные с циклом for

Я хотел бы что-то вроде этого:

 RMSE Power 
[1,] 1.230 2.5 
[2,] 1.464 1.5 
[3,] 1.698 2.0 
[4,] 1.932 3.0 

То, что я до сих пор это:

require(sp) 
require(gstat) 
data("meuse") 

#### create grid: 
pixels <- 500 #define resolution 
#define extent 
raster.grd <- expand.grid(x=seq(floor(min(x=meuse$x)), 
          ceiling(max(x=meuse$x)), 
          length.out=pixels), 
         y=seq(floor(min(y=meuse$y)), 
          ceiling(max(y=meuse$y)), 
          length.out=pixels)) 
# convert the dataframe to a spatial points and then to a spatial pixels 
grd.pts <- SpatialPixels(SpatialPoints((raster.grd))) 
grd <- as(grd.pts, "SpatialGrid") 
gridded(grd) = TRUE 

#### perform IDW and loop through different power-values 
power = seq(from = 1.5, to = 3, by = 0.5) 
results=list() 
results.cv=list() 
for(i in power) { 
    results[[paste0(i,"P")]] <- gstat::idw(meuse$zinc ~ 1, meuse, grd, idp = i) 
    results.cv[[paste0(i,"P")]] <- krige.cv(zinc ~ 1, meuse, nfold = nrow(meuse),set = list(idp = i)) 
    } 

Теперь моя попытка вычислить и сохранить RMSE с для цикла:

results_rmse <- list() 
pwr <- names(results.cv) 

for(i in results.cv){ #for each Element (1.5P, 2P, etc) in results.cv 
    for(j in 1:length(pwr)){ #for each Power 
     results_rmse <- sqrt(mean(i$residual^2)) 
     print(pwr[j]) 
     } 
    print(paste("RMSE",results_rmse)) 
    } 

Но с этим циклом он печатает каждое RMSE индивидуально. Поэтому я изменил код, как этого

results_rmse[[i]] <- sqrt(mean(i$residual^2)) 

Но тогда я получаю сообщение об ошибке

Error in results_rmse[[i]] <- sqrt(mean(i$residual^2)) : invalid subscript type 'S4' 

Я попробовал несколько вариантов для петли, но я даже не мог понять, как хранить значение в списке, не говоря уже о том, чтобы отсортировать их по наименьшему RMSE.

+0

На мой взгляд, проблема заключается в названиях списка. Попробуйте без десятичной запятой. Также используйте 'sqrt (mean (results_rmse [[i]] $ остаточный^2))'. 'i' является« 1.5P », и это не имя переменной в R. – nya

+0

Что вы имеете в виду под« без десятичной запятой »? Я попробовал это с вашим предложением, но это тоже не сработало. – Chris

+0

Я был неправ. Проблема при вызове элементов списка скорее состоит в том, что имя начинается с числа. Используйте 'paste0 (« P », i)' для имен. В противном случае исчисление исчисления находится в ответе. Я надеюсь, что это помогает. – nya

ответ

0

В расчете RMSE есть дополнительный цикл для j, который не нужен, насколько я понимаю проблему. Кроме того, я перестроил цикл таким образом, что он циклически перемещается по последовательности элементов, а не вызывает их по их именам.

# Data, because your script doesn't run for me. The rest is identical from your code 
for(i in power) { 
    results.cv[[paste0(i,"P")]]$residual <- rnorm(50) 
} 

# Fixed loop 
for(i in 1:length(results.cv)){ 
    results_rmse[[i]] <- sqrt(mean(results.cv[[i]]$residual^2)) 
} 
names(results_rmse) <- names(results.cv) 

В качестве альтернативы, цикл for можно избежать с помощью функции apply. Результатом является именованный список, соответствующий именам ввода, поэтому последняя строка может быть опущена для достижения того же results_rmse.

results_rmse <- lapply(results.cv, function(x) sqrt(mean(x$residual^2))) 

Чтобы распечатать данные, как вы показали в вашем вопросе:

cbind(RMSE=unlist(results_rmse), Power=power) 
+0

Спасибо вам большое! Хотя for-loop по-прежнему не работает (я получаю 'Error in results.cv [[i]] $ остаточный^2: нечисловой аргумент двоичному оператору'. Я могу избежать этого сообщения об ошибке с удалением одного из '[]', вот так: 'results_rmse [[i]] <- sqrt (mean (results.cv [i] $ остаточный^2))'. Но тогда у меня все еще есть 'NaN' в выходе. предположительная функция 'lapply' работала отлично, и с добавлением функции' sort' я, наконец, получаю то, что хочу: 'Result_best <- cbind (RMSE = sort (unlist (results_rmse))). Еще раз спасибо! – Chris

Смежные вопросы