Как я могу нарезать этот набор данных

#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))