2017-08-18 3 views
1

Pour une étude médicale, je voudrais calculer l'eGFR, une mesure de la fonction rénale, avec une équation qui nécessite certaines valeurs d'entrée: Scr (sérum créatinine), ScysC (cystatine C sérique), l'âge et les valeurs selon le sexe, qui sont tous disponibles dans mon ensemble de données.convertir les équations mathématiques en code avec ifelse et min/max dans R Studio

Veuillez voir l'image ci-jointe pour les équations. Donc, je suis principalement aux prises avec les instructions ifelse et les nombres min/max. Comment puis-je créer un code pour récupérer la sortie avec cette équation?

Ma première pensée est de créer une fonction de boucle, mais je ne sais pas exactement comment. Ainsi, toute l'aide et le temps est très apprécié :)

-Edit- AVIS: il est important que le rapport entre min/max est toujours < 1. par exemple une femelle avec Scr = 0.9 donne Scr/k = 0.9/0.7 = 1.28 et résulte en min = 1 et max = 1.28. Une femelle avec Scr = 0,6 donne Scr/k = 0,6/0,7 = 0,86 et donne min = 0,86 et max = 1.

Voici un échantillon de mes données:

df <- data.frame(ID = c(1,2,3), AGE = c(36,36, 36), 
    CYSC = c(0.757, 1.34, 1.34), SCR = c(0.58, 0.68, 0.68), SEX = c(1,1,0)) 
     #Male = 1, Female 0 

#equation: 
eGFR = 135*((min(Scr/k,1)**a))*((max(Scr/k,1)**-0.601))*(min(Scysc/0.8,1)**-0.375)* (max(Scysc/0.8,1)**-0.711) * (0.995**Age) (*0.969 if female) 

(With k=0.7 if F and k=0.9 if M, a=-0.248 if F and a=-0.207 if M) 
+1

Je vous recommande d'utiliser '' pmax' et pmin' à la place. Ceux-ci sont correctement vectorisés. Et utilisez 'ifelse()' pour la partie "if". – MrFlick

+0

Je suis confus par la structure de votre dataframe. On dirait qu'il y a 7 colonnes, mais seulement 5 en-têtes. Pouvez-vous fournir une spécification 'data.frame' appropriée pour que nous puissions vous aider? (c'est à dire quelque chose comme 'df <- data.frame (ID = c (1, 2), AGE = c (36, 36), CYSC = c (3.7487, 3.3494), ... etc' – TTNK

Répondre

1

Ok, donc je devine que la structure de votre data.frame. J'ai fourni comment j'ai créé le mien pour le test car il semble y avoir plus de nombres que row.names. J'ai également supposé que 1 est un homme et 0 est une femme. Enfin, j'ai ajouté une troisième patiente pour le test, avec les mêmes résultats cliniques que le mâle n ° 2.

df <- data.frame(ID = c(1,2,3), AGE = c(36,36, 36), CYSC = c(51.614, 47.669, 47.669), SCR = c(0.75776, 1.34, 1.34), SEX = c(1,1,0)) 

male.idx <- df$SEX == 1 

k <- rep(0.7, nrow(df)) 
k[male.idx] <- 0.9 

a <- rep(-0.248, nrow(df)) 
a[male.idx] <- -0.207 

eGFR <- 135*pmin(df$SCR/k,1)**a*((pmax(df$SCR/k,1)**-0.601))*(pmin(df$CYSC/0.8,1)**-0.375)* 
    (pmax(df$CYSC/0.8,1)**-0.711) * ifelse(male.idx, 0.995, 0.969)**df$AGE 

[édité pour réponse plus précise]

+0

Merci pour le commentaire, @sgroen Ce que j'ai oublié de mentionner, c'est qu'il est important que le rapport entre min/max soit toujours <1. par exemple une femelle avec Scr = 0.9 donne Scr/k = 0.9/0.7 = 1.28 et les résultats en min = 1 et max = 1,28 Une femme avec Scr = 0,6 donne Scr/k = 0,6/0,7 = 0,86 et les résultats en min = 0,86 et max = 1 – Endrie

+0

Je suis revenu à travers et min ne traite pas bien avec la vectorisation, J'ai donc utilisé pmin à la place.Je crois que cela devrait fonctionner [édité la réponse] – csgroen

+0

Merci @csgroen et @ MrFlick le pmin pmax a fait l'affaire :) – Endrie