2011-05-02 6 views
1

Je dois faire une boucle (ce que je n'ai pas fait auparavant) et étant donné les observations (colonne 1), je dois déterminer (i) laquelle des combinaisons parmi les variables (s1- s5) sont significatifs (P < 0,05), (ii) ne garder que les combinaisons significatives entre les variables avec les p valeurs correspondantes. Je pensais que ce serait une bonne façon d'apprendre comment faire une boucle dans l'affaire R. Les données d'origine est grand et est similaire à celui-ci:Faire une boucle dans R

ob <- c(120,100,85,56,87) 
s1 <- c("ab","aa","ab","aa","bb") 
s2 <- c("aa","aa","ab","bb","bb") 
s3 <- c("bb","ab","aa","ab","ab") 
s4 <- c("aa","ab","bb","ab","aa") 
s5 <- c("bb","ab","aa","ab","bb") 
dset <- data.frame(ob,s1,s2,s3,s4,s5) 

dset

ob s1 s2 s3 s4 s5 
120 ab aa bb aa bb 
100 aa aa ab ab ab 
85 ab ab aa bb aa 
56 aa bb ab ab ab 
87 bb bb ab aa bb 

Toute aide serait apprécié!

Baz

+0

comment déterminez-vous la signification? Comment les colonnes s1 - s5 jouent-elles dans la signification? Il y a presque certainement une solution vectorisée qui n'aura pas besoin d'utiliser un for-loop ici, mais je peux me tromper là-dessus. – Chase

+0

@Chase, le niveau de signification serait P <0,05 et s1-s5 sont des ensembles de cisailles qui auraient influencé la performance des bovins dans le troupeau. – baz

+0

alors maintenant vous voulez exécuter une régression linéaire pour toutes les combinaisons de s1 à s5? Est-ce correct? – Chase

Répondre

1

Peut-être que je manque quelque chose, mais je ne vois pas comment il est logique d'ajouter une colonne des valeurs de p dans votre data.frame sans transposition de la data.frame. Comment savez-vous quelle valeur p correspond à quelle variable indépendante si elles sont dans des colonnes différentes? Voici une approche utilisant une boucle for pour exécuter les ANOVA est pour chaque variable indépendante et de les stocker sur un nouveau vecteur:

#Use grep to return the columns that match the pattern "s". This returns their column index. 
#This is what we'll use in the for loop 
vars <- grep("s", names(dset)) 

#Create a new vector to hold the anova results and name it 
dat <- vector("integer", length = ncol(dset)) 
names(dat) <- colnames(dset) 

#Run for loop, assigning the p-value from the anova to the proper spot in the vector we made 
for (var in vars) { 
    dat[var] <- anova(lm(ob ~ dset[, var], data = dset))$"Pr(>F)"[1] 
} 

Toutes ces donnera:

> dat 
     ob  s1  s2  s3  s4  s5 
0.0000000 0.7219532 0.3108441 0.4668372 0.6908916 0.6908916 

Je vais laisser à vous de savoir comment vous voulez relier cela à l'original data.frame.

+0

oui vous avez raison! la question était confuse et je m'excuse pour cela. Je viens de l'éditer et j'espère que ça a du sens, j'espère! – baz