У вас есть основная идея: вы должны создать список фреймов данных, а затем использовать lapply
, чтобы применить функцию к каждому элементу списка. К сожалению, в вашем коде есть несколько странностей.
Нет смысла случайным образом генерировать начальное число, а затем устанавливать его. Вам нужно всего лишь использовать set.seed
для того, чтобы сделать воспроизводимые случайные числа. Отрежь линии
seed <- round(runif(10)*1000000)
и, возможно,
set.seed(x)
rep(1:3, c(rep(3, 3)))
совпадает с rep(1:3, each = 3)
.
Не вызывайте ваши переменные var
или matrix
, , поскольку они будут маскировать имена этих функций. , поскольку это сбивает с толку.
3:ncol(x)
опасно. Если x
имеет менее 3 столбцов, он не делает то, что вы думаете.
... а теперь проблема, которую вы на самом деле хотели решить.
Проблема в строке out <- lm(gdt[x]$yvar ~ gdt[x][, ind[ind]])
.
lapply
передает фреймы данных в anovp
, а не указывает, поэтому x
является фреймом данных в gdt[x]
. Который выдает ошибку.
Еще одна вещь. Когда вы переписываете эту строку, обратите внимание, что lm
принимает аргумент данных, поэтому вам не нужно делать такие вещи, как gdt$some_column
; Вы можете просто ссылаться на some_column
напрямую.
РЕДАКТИРОВАТЬ: Дальнейшие советы.
Вы, кажется, всегда используете формулу yvar ~ X1 + X2 + X3 + X4 + X5 + X6 + X7 + X8 + X9 + X10
. Так как каждый раз одно и то же, создайте его перед вызовом lapply
.
independent_vars <- paste(colnames(gdt[[1]])[-1:-2], collapse = " + ")
model_formula <- formula(paste("yvar", independent_vars, sep = " ~ "))
Возможно, я бы не стал беспокоиться о функции anovp
. Просто сделай
models <- lapply(gdt, function(data) lm(model_formula, data))
Затем включите дополнительный вызов lapply
, чтобы поиграть с коэффициентами, если необходимо. Следующая строка копирует ваш код anovp
, но не будет работать, потому что model$coefficients
- это вектор (поэтому размеры не верны). Отрегулируйте, чтобы получить бит, который вы на самом деле хотите.
coeffs <- lapply(models, function(model) do.call(rbind, model$coefficients[,4][2]))