Я хочу выполнить перекрестное подтверждение 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.
На мой взгляд, проблема заключается в названиях списка. Попробуйте без десятичной запятой. Также используйте 'sqrt (mean (results_rmse [[i]] $ остаточный^2))'. 'i' является« 1.5P », и это не имя переменной в R. – nya
Что вы имеете в виду под« без десятичной запятой »? Я попробовал это с вашим предложением, но это тоже не сработало. – Chris
Я был неправ. Проблема при вызове элементов списка скорее состоит в том, что имя начинается с числа. Используйте 'paste0 (« P », i)' для имен. В противном случае исчисление исчисления находится в ответе. Я надеюсь, что это помогает. – nya