Применить функцию или цикл в R: не числовой, возвращает NA

Я работаю с процедурой передискретизации в R (как с начальной загрузкой). У меня есть матрица ответов / независимых переменных, и я хотел бы сделать 999 выборок из этой матрицы для расчета для каждой статистики. Я работаю с их средним значением, средним отклонением и доверительным интервалом. Итак, я написал функцию для вычисления и возврата списка:

mydata <- data.frame(a=rnorm(20, 1, 1), b = rnorm(20,1,1))

myfun <- function(data, n){
  sample <- data[sample(n, replace = T),]
  model1 <- lm(sample[,1]~sample[,2])
  return(list(model1[[1]][[1]], model1[[1]][[2]]))
}

result <- as.numeric()
result <- replicate(99, myfun(mydata, 10))

Затем у меня есть матрица в качестве вывода, в которой строки - это статистика, а столбцы - выборки (nrow = 2 и ncol = 99). Мне нужны среднее значение и SD для каждой строки, но когда я пытаюсь использовать функцию применения или даже цикл, появляется следующее сообщение:

In mean.default (newX [, i], ...): аргумент
не является числовым или логическим: возвращается NA

Кроме того:

is.numeric(result)
[1] FALSE

Мне это показалось странным, потому что у меня никогда не было такой проблемы с подобными процедурами.

Есть предположения?


person Luiz Henrique Varzinczak    schedule 22.12.2016    source источник
comment
Может ли это быть из-за того, что вы возвращаете list? Если вы запустите is.numeric(result[[1]]), вы получите ожидаемое TRUE.   -  person Nick Criswell    schedule 22.12.2016
comment
Другой способ - вернуть вектор, а не список: return(c(model1[[1]][[1]], model1[[1]][[2]]))   -  person R. Schifini    schedule 22.12.2016


Ответы (4)


Используйте следующее:

myfun <- function(dat, n){
  dat1 <- dat[sample(n, replace = T),]
  model1 <- lm(dat1[,1] ~ dat1[,2])
  return(coef(model1))
  }

replicate(99, myfun(mydata, 10))
person Zheyuan Li    schedule 22.12.2016

Причина в том, что «результат» - это list из 198 элементов с атрибутами измерения. Нам нужно unlist "результат" и предоставить атрибуты измерения

result1 <- `dim<-`(unlist(result), dim(result))

а затем используйте apply

person akrun    schedule 22.12.2016

Просто замените list () на c () в своей функции myfun ()

mydata <- data.frame(a=rnorm(20, 1, 1), b = rnorm(20,1,1))

myfun <- function(data, n){
  sample <- data[sample(n, replace = T),]
  model1 <- lm(sample[,1]~sample[,2])
  return(c(model1[[1]][[1]], model1[[1]][[2]]))
}

result <- as.numeric()
result <- replicate(99, myfun(mydata, 10))

apply(result, FUN=mean, 1)
apply(result, FUN=sd, 1)
person Yo B.    schedule 22.12.2016
comment
Как вы отметили, coef () вернет соответствующий формат данных и является эффективным способом решения этой проблемы. Тем не менее, для этого примера, явно показывающего ожидаемый формат данных с помощью c (), могло бы быть больше поучительности и помощи в обобщении! - person Yo B.; 22.12.2016
comment
Вы тоже правы. Я пытался применить цикл к списку, но правильнее было заменить его на c () для создания вектора. Большое Вам спасибо. - person Luiz Henrique Varzinczak; 31.12.2016

Это сработало для меня:

mydata <- data.frame(a=rnorm(20, 1, 1), b = rnorm(20,1,1))

myfun <- function(data, n){
  sample <- data[sample(n, replace = T),]
  model1 <- lm(sample[,1]~sample[,2])
  return(data.frame(v1 = model1[[1]][[1]], v2 = model1[[1]][[2]]))
}

result <- do.call("rbind",(replicate(99, myfun(mydata, 10), simplify = FALSE)))
person Derek Corcoran    schedule 22.12.2016