2013-02-13 2 views
1

Функция lm (...) возвращает объект класса 'lm'. Как создать массив таких объектов? Я хочу сделать следующее:создание объектов определенного класса в R

my_lm_array <- rep(as.lm(NULL), 20) 
#### next, populate this array by running lm() repeatedly: 
for(i in 1:20) { 
    my_lm_array[i] <- lm(my_data$results ~ my_data[i,]) 
} 

Очевидно, что линия "my_lm < - представитель (as.lm (NULL), 20)" не работает. Я пытаюсь создать массив объектов типа 'lm'. Как мне это сделать?

+1

Действительно ли это 'my_data [i,]' в вашем 'lm' вызове, а не' my_data [, i] '? – juba

+0

Поскольку вы, очевидно, говорите об одном измеренном объекте (на самом деле нестандартном), тогда вам следует избегать использования слова «массив», которое в качестве конкретного значения используется в синтаксисе R. –

+0

Да, я думаю, вы правы (я все еще относительно новичок с R). – user2069819

ответ

2

Не уверен, что он ответит на ваш вопрос, но если то, что вы хотите сделать, это запустить серию lm из переменной против различных столбцов фрейма данных, вы можете сделать что-то вроде этого:

data <- data.frame(result=rnorm(10), v1=rnorm(10), v2=rnorm(10)) 
my_lms <- lapply(data[,c("v1","v2")], function(v) { 
    lm(data$result ~ v) 
}) 

Тогда my_lms будет списком элементов класса lm.

+0

Я вижу, что это делает. Позвольте мне попробовать. благодаря – user2069819

1

Ну, вы можете создать массив пустых/бессмысленные lm объектов следующим образом:

z <- NA 
class(z) <- "lm" 
lm_array <- replicate(20,z,simplify=FALSE) 

, но это, вероятно, не самый лучший способ решить эту проблему. Вы можете просто создать пустой список соответствующей длины (vector("list",20)) и заполнить элементы по мере продвижения: R достаточно слабо напечатан, что не будет против вас заменять NULL значениями с объектами lm. Более идиоматически, хотя, вы можете запустить lapply в списке имен предикторов:

my_data <- data.frame(result=rnorm(10), v1=rnorm(10), v2=rnorm(10)) 
prednames <- setdiff(names(my_data),"result") ## extract predictor names 
lapply(prednames, 
function(n) lm(reformulate(n,response="result"), 
       data=my_data)) 

Или, если вы не чувствуете, как создать анонимную функцию, вы можете сначала создать список формул (с помощью lapply) и затем запустить lm на них:

formList <- lapply(prednames,reformulate,response="result") ## create formulae 
lapply(formList,lm,data=my_data) ## run lm() on each formula in turn 

создаст тот же список lm объектов в качестве первой стратегии выше.

В целом рекомендуется избегать использования синтаксиса, такого как my_data$result внутри формул моделирования; вместо этого попытайтесь настроить все, чтобы все переменные в модели были взяты изнутри объекта data. Таким образом, методы, подобные predict и update, с большей вероятностью будут работать правильно ...

Смежные вопросы