2013-07-01 4 views
1

J'utilise glm() pour créer quelques modèles différents basés sur les valeurs dans un vecteur que je fais (h1_lines). Je veux vraiment retourner un modèle pour chaque valeur du vecteur. Au lieu de cela, mon code renvoie actuellement une liste de listes où une partie de la liste est le modèle. Il semble retourner tout ce que je fais à l'intérieur de la fonction saphylle.sapply() Retour Surprenant Résultat - 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) 
            }) 

Je voudrais que le code fonctionne donc après ces lignes que je peux faire:

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

Mais maintenant je ne peux pas le faire causer sapply est de retour plus que le modèle .. Si je fais imprimer (dim (modèles)) il dit que les modèles ont 30 lignes et 3 colonnes ??

ÉDITER POUR AJOUTER UNE QUESTION; Utilisation de la suggestion ci-dessous le code fonctionne très bien, je peux faire prédire (modèles [[1]], test_case) et cela fonctionne parfaitement. Comment puis-je retourner/sauvegarder les modèles pour pouvoir y accéder avec la clé que j'ai utilisée pour les créer? Par exemple, en utilisant les h1_scores il pourrait être quelque chose comme ce qui suit:

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

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

Pouvez-vous fournir des exemples de données? 'train' se référence lui-même. – Thomas

+1

De plus, votre fonction dans 'sapply' (qui devrait être' lapply', par réponse à @ Señor O) devrait probablement 'retourner' quelque chose. – Thomas

+1

Techniquement 'mod' sera retourné puisque c'est la dernière ligne des accolades, mais je suis d'accord qu'il est préférable de mentionner explicitement ce qui est retourné pour la lisibilité. –

Répondre

6

Vous devez utiliser lapply au lieu de sapply.

sapply simplifie trop. Essayez:

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

Je ne sais pas exactement la distinction, mais si vous êtes toujours attendre la sortie de chaque élément de sapply à avoir des parties extractibles (à savoir Item$SubItem), vous devez utiliser lapply à la place.

Mise à jour

Répondre à votre question suivante, vous pouvez le faire soit:

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

Et les appeler par

models[["65"]] 

Rappelez-vous d'utiliser les guillemets autour des chiffres. En guise de remarque, nommer des éléments de liste avec des nombres n'est pas toujours la meilleure idée. Une solution de contournement peut être:

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

'spply' essaye d'utiliser' simplify2array' quand tous les valeurs sont de la même longueur. –

+0

son ironique que sapply essaie de "simplifier", mais renvoie un résultat plus compliqué et "approfondi" que lapply – appleLover

+0

senor o, qui fonctionne très bien, j'ai mis à jour ci-dessus avec une question de suivi – appleLover