2014-09-01 2 views
0

J'ai un ensemble de données de longueur et de hauteur pour les coques, mais certaines années, la hauteur n'a pas été enregistrée. J'essaie d'utiliser une régression linéaire des années de données où la taille et la longueur ont été enregistrées afin de générer des hauteurs pour les années avec NA. En plus de cela, je veux faire cette régression pour chacun de mes domaines d'évaluation.Régression de boucle Lm et remplacement NAs

Jusqu'ici c'est ce que j'ai;

for(a in unique(all_data$Assessment_area)) { 
r1 <- lm(Height_t2~Length_t2,data=all_data[!is.na(all_data$Height_t2)&all_data$Assessment_area==a,]) #Regression model for all shells with L&H 
print(a) 
print(r1) 
} 

qui me donne la sortie que j'ai besoin pour chaque domaine d'évaluation (que je puis insérer dans le code ci-dessous et à savoir 0,8871 0,5143 mais pour le moment, un par un). Le prochain bit de mon code crée une nouvelle colonne comme suit, où je tapais à chaque fois les valeurs générées. Y a-t-il un moyen d'incorporer ces lignes dans la boucle précédente?

all_data$Height_r1 <- all_data$Length_t2*0.8871+0.5143 #Apply regression relationship to new column 
all_data$Height_r1[!is.na(all_data$Height_t2)] <-all_data$Height_t2[!is.na(all_data$Height_t2)] #Add original heights 

Toute aide appréciée

+0

Qu'est-ce que 08871 et 0.5143? Est-ce le résultat du lm à l'étape précédente? – bsg

+0

Oui mais il y a 5 zones d'évaluation donc il y a 5 ensembles de résultats, donc je dois aussi spécifier de ne remplacer que les valeurs de hauteur pour chaque zone d'évaluation en utilisant la régression calculée pour cette zone. Auparavant, lorsque j'ai utilisé ce code, je viens d'utiliser une seule équation de régression pour toutes les coquilles, mais je pense qu'il serait plus exact d'avoir des régressions d'échelle régionale/assessment_area. –

Répondre

1

Vous pouvez accéder au résultat d'une régression linéaire en utilisant l'opérateur $ sur la fonction sommaire. Dans ce cas, vous feriez

r1coefs <- summary(r1)$coefficients 
intercept <- r1coeffs[1] 
slope <- r1coeffs[2] 

Vous pouvez ensuite les intégrer dans votre boucle comme suit:

for(a in unique(all_data$Assessment_area)) 

{ r1 <- lm(Height_t2~Length_t2,data=all_data[!is.na(all_data$Height_t2)&all_data$Assessment_area==a,]) #Regression model for all shells with L&H 
print(a) 
print(r1) 
#access the linear regression coefficients and store them   
r1coefs <- summary(r1)$coefficients 
intercept <- r1coeffs[1] 
slope <- r1coeffs[2] 

#use the stored regression coefficients on the new data 
all_data$Height_r1 <- all_data$Length_t2*slope+intercept #Apply regression relationship to new column 
all_data$Height_r1[!is.na(all_data$Height_t2)] <-all_data$Height_t2[!is.na(all_data$Height_t2)] #Add original heights 
} 
+0

Merci bsg, ce code fonctionne bien mais quand je vérifie la sortie certains d'entre eux sont un peu. Une seule des cinq hauteurs de zones d'évaluation est telle que je peux les générer sur une calculatrice. Beaucoup ne sont pas tout à fait raison par exemple. Pour la zone d'évaluation A, la pente imprimée est 0.8877 et Intercept 0.8175 donc pour une longueur de 44 * 0.8877 + 0.8175 j'obtiens 39.8763 mais r génère 39.3548 ce qui est assez de différence pour que certaines hauteurs atteignent le mauvais mm. Je ne peux pas imaginer pourquoi cela pourrait être le cas? –

+0

Ah On dirait qu'il n'utilise qu'une seule équation pour tous, c'est pourquoi une zone d'évaluation est comme il se doit et les autres ne le sont pas. Il doit y avoir quelque chose qui manque à la boucle. –

0

Problème résolu :) Juste besoin de quelques bits supplémentaires pour spécifier Assessment_area lorsque vous utilisez les régressions enregistrées sur les données ;

for(a in unique(all_data$Assessment_area)) { 
r1 <- lm(Height_t2~Length_t2,data=all_data[!is.na(all_data$Height_t2) &all_data$Assessment_area==a,]) 
#Regression model for all shells with L&H 
print(a) 
print(r1) 
#access the linear regression coefficients and store them   
r1coeffs <- summary(r1)$coefficients 
    intercept <- r1coeffs[1] 
slope <- r1coeffs[2] 

    #use the stored regression coefficients on the new data 

    all_data[all_data$Assessment_area==a,"Height_r1"] <- all_data [all_data$Assessment_area==a,"Length_t2"]*slope+intercept #Apply regression relationship to new column 

} 

#Add original heights   
all_data$Height_r1[!is.na(all_data$Height_t2)] <-all_data$Height_t2[!is.na(all_data$Height_t2)] 
Questions connexes