2013-07-01 2 views
1

Я использую glm(), чтобы создать несколько разных моделей, основанных на значениях в векторе, который я делаю (h1_lines). Я хочу, чтобы sapply возвращал модель для каждого значения в векторе. Вместо этого мой код в настоящее время возвращает список списков, в которых одна часть списка является моделью. Кажется, он возвращает все, что я делаю внутри функции sapply.sapply() Возвращающийся Удивительный результат - R

train = data.frame(scores=train[,y_col], total=train[,4], history=train[,5], line=train[,6]) 
h1_lines<- c(65, 70, 75) 

models <- sapply(h1_lines, function(x){ 
       temp_set<-train 
       temp_set$scores<-ifelse(temp_set$scores>x,1, 
            ifelse(temp_set$scores<x,0,rbinom(dim(temp_set)[1],1,.5))) 

       mod<-glm(scores ~ total + history + line, data=temp_set, family=binomial) 
            }) 

Я хотел бы код, чтобы работать так, после этих строк я могу сделать:

predict(models[1,], test_case) 
predict(models[2,], test_case) 
predict(models[3,], test_case) 

Но сейчас я не могу сделать это вызвать sapply возвращается больше, чем просто модель .. Если я печатаю (тусклый (модели)), он говорит, что модели имеют 30 строк и 3 столбца?

EDIT TO ADD QUESTION;

Используя это предложение, код работает отлично, я могу сделать прогноз (модели [[1]], test_case), и он отлично работает. Как я могу вернуть/сохранить модели, чтобы я мог получить к ним доступ с помощью ключа, который я использовал для их создания? Например, с помощью h1_scores это может быть что-то вроде следующего:

predict(models[[65]], test_case)) 

predict(models[[key==65]], test_case) 
+0

Можете ли вы предоставить образцы данных? 'train' ссылается на себя. – Thomas

+1

Кроме того, ваша функция в 'sapply' (которая должна быть' lapply', за ответ @ Señor O), вероятно, должна «возвращать» что-то. – Thomas

+1

Технически 'mod' будет возвращен, так как это последняя строка брекетов, но я согласен, что лучше явно указать, что возвращается для удобочитаемости. –

ответ

6

Вы должны использовать lapply вместо sapply.

sapply упрощает слишком много. Попробуйте:

lapply(ListOfData, function(X) lm(y~x, X)) 
sapply(ListOfData, function(X) lm(y~x, X)) 

Я не знаю точно, различие, но если вы когда-либо ожидать, что выход каждого элемента sapply иметь извлекаемые части (т.е. Item$SubItem), вы должны использовать вместо lapply.

Update

Отвечая на ваш следующий вопрос, вы можете сделать что-либо:

names(models) <- h1_lines 
names(h1_lines) <- h1_lines ## Before lapply 

И называть их

models[["65"]] 

Не забывайте использовать кавычки вокруг чисел. В качестве побочного примечания наименования элементов списка с номерами не всегда являются лучшей идеей. Обходной путь может быть следующим:

models[[which(h1_lines==65)]] 
+3

'sapply' пытается использовать' simplify2array', когда все значения имеют одинаковую длину. –

+0

его иронично, что sapply пытается «упростить», но возвращает более сложный и «тщательный» результат, чем lapply – appleLover

+0

senor o, который отлично работает, я обновил выше с последующим вопросом – appleLover

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