#r
#r
Вопрос:
Я хотел бы нарезать результаты в его компонентах x, y для каждой строки так же, как я нарезаю данные
то есть я хотел бы изолировать каждый столбец [,1][,2][,..] и разделите его так же, как dat, чтобы мой код правильно разделял test_index. разделив его на размер фактического набора данных, а не на размер dat, который равен 100.
вот макет результатов и данных.
> results
[,1] [,2] [,3] [,4] [,5]
x Numeric,100 Numeric,500 Numeric,1000 Numeric,5000 Numeric,10000
y Numeric,100 Numeric,500 Numeric,1000 Numeric,5000 Numeric,10000
> dat
x y
1 68.30298 66.44188
2 69.41395 69.54029
3 68.19536 65.46259
4 72.90762 73.38170
5 70.83796 68.87421
6 64.21743 69.51929
7 69.19132 71.34144
и вот код, который я использую
n <- c(100,500,1000,5000,10000)
Sigma <- 9*matrix(c(1.0, 0.5, 0.5, 1.0), 2, 2)
dat <- MASS::mvrnorm( 100, c(69, 69), Sigma) %>%
data.frame() %>% setNames(c("x", "y"))
dat
set.seed(1, sample.kind="Rounding")
training <- function(y) {
rmse<-replicate(100,{test_index <- createDataPartition(y, times = 1, p = 0.5, list = FALSE)
train_set = dat %>% slice(-test_index)
test_set = dat %>% slice(test_index)
fit <- lm(y ~ x, data = train_set)
y_hat <- fit$coef[1] fit$coef[2]*test_set$x
sqrt(mean((y_hat - test_set$y)^2))
})
structure(c(mean(rmse),sd(rmse)),names=c("mean","sd"))
}
df<-c(n,mean(n),sd(n))
set.seed(1, sample.kind="Rounding")
results<-sapply(n,function(n){
Sigma<- 9*matrix(c(1.0, 0.5, 0.5, 1.0), 2, 2)
dat<- MASS::mvrnorm(n, c(69,69), Sigma) %>%
data.frame() %>%
setNames(c("x","y"))
})
y<-results[2,]
results
set.seed(1, sample.kind="Rounding")
results<- map(y,training)
results
Комментарии:
1. Я в
replicate
том, что вам может понадобитьсяsimplify = FALSE
2. похоже, это мало что дало, оно по-прежнему возвращает ошибку
Error in UseMethod("slice_") : no applicable method for 'slice_' applied to an object of class "c('matrix', 'array', 'list')"
3. Я это не проверял. извините
4. Нет, не волнуйтесь, я ценю помощь, несмотря ни на что
Ответ №1:
dat1<-do.call(rbind, Map(data.frame, x=results[,1]$x, y=results[,1]$y))
Я сделал это действительно хакерски и, по сути, создал единый набор данных для каждого столбца
Ответ №2:
Другой способ решить эту проблему — поместить репликатор в sapply, это избавит от необходимости нарезать набор данных и показано здесь
results <- sapply(n, function(n){
Sigma <- 9*matrix(c(1.0, 0.5, 0.5, 1.0), 2, 2)
dat <- MASS::mvrnorm(n, c(69, 69), Sigma) %>%
data.frame() %>% setNames(c("x", "y"))
rmse <- replicate(100, {
test_index <- createDataPartition(dat$y, times = 1, p = 0.5, list = FALSE)
train_set <- dat %>% slice(-test_index)
test_set <- dat %>% slice(test_index)
fit <- lm(y ~ x, data = train_set)
y_hat <- predict(fit, newdata = test_set)
sqrt(mean((y_hat-test_set$y)^2))