R의 전통적인 루프와 관련된 대부분의 질문은 더 적은 코드로 일반적으로 더 유연하게 기능을 사용하여 설명됩니다.
그러나 나를 수정하십시오. 반복 순서가 중요 할 때 for 루프가 여전히 지배적이라고 생각합니다.
제 경우에는 순차적이고 누적 적으로 조정 된 로지스틱 회귀 모델 을 구축하고 조정 대상을 보여주는 열과 함께 OR / CI를 저장하고 싶습니다 . 이것은 내 예상 출력입니다.
Model OR CI
Biomarker
+Age
+Sex
+Smoking
내가 한 일은 다음과 같습니다.
df1 <- subset(df, select = c(age_cat, is_female, smoking_category,
bmi_calc, has_diabetes, sbp_mean,
alcohol_category, highest_education,
occupation, household_income))
model <- data.frame(NULL)
for (i in seq_along(df1)) {
model <- exp((cbind(OR = coef(glm(as.formula(paste("istroke ~ log2(hscrp_mgl)", i, sep = "+")),
family=binomial, data=df)),
confint(glm(as.formula(paste("istroke ~ log2(hscrp_mgl)", i, sep = "+")),
family=binomial, data=df)))))
}
내 결과 변수는 뇌졸중 (istroke, 0 또는 1)입니다. 내 관심 노출은 바이오 마커 (hscrp_mgl)입니다. 나는 내가 어딘가에서 근본적인 실수를하고 있다는 것을 안다. 다른 SO 게시물에서 찾았지만 대부분은 순차적이고 누적 적으로 조정 된 회귀 모델을 원하지 않습니다.
그럼에도 불구하고 이것이 중복인지, 그리고 불분명 한 것이 있으면 알려주세요.
편집하다
내 원래 데이터 세트 df에는 df1의 모든 변수, 결과 변수 및 일부가 포함됩니다. 다음은 재현 가능한 샘플입니다.
age_cat is_female smoking_category bmi_calc has_diabetes sbp_mean istroke
(59,69] 0 4 19.6 0 103.5 0
(59,69] 1 1 19.1 0 138 0
(29,59] 0 4 26.8 0 155.5 0
(29,59] 0 1 23.1 0 130 1
(29,59] 1 1 22.7 0 126 1
(59,69] 0 4 25 0 182.5 0
(29,59] 1 1 20 0 96 1
(29,59] 1 2 23.9 0 134.5 0
(59,69] 0 4 24.4 0 160.5 1
편집 더 재현 가능한 예 :
df <- data.frame(age = c(50, 60, 50, 40, 70, 90, 30),
gender = c(0, 1, 1, 0, 1, 1, 1),
smoke = c(4, 3, 2, 1, 4, 3, 4),
BMI = c(19, 20, 21, 22, 23, 24, 25),
SBP = c(100, 120, 140, 110, 120, 130, 120),
diab = c(0, 1, 1, 1, 0, 1, 1),
stroke = c(0, 1, 0, 0, 1, 1, 1))
dput(df)
structure(list(age = c(50, 60, 50, 40, 70, 90, 30), gender = c(0,
1, 1, 0, 1, 1, 1), smoke = c(4, 3, 2, 1, 4, 3, 4), BMI = c(19,
20, 21, 22, 23, 24, 25), SBP = c(100, 120, 140, 110, 120, 130,
120), diab = c(0, 1, 1, 1, 0, 1, 1), stroke = c(0, 1, 0, 0, 1,
1, 1)), .Names = c("age", "gender", "smoke", "BMI", "SBP", "diab",
"stroke"), row.names = c(NA, -7L), class = "data.frame")
실제로 모델을 반복적 으로 확장하는 대신 최종 행 바인딩을 위해 data.frame 컬렉션을 반환 할 수 있으므로 lapply
귀하의 경우에 더 나은 접근 방식이 될 수 있습니다 .for
아래 예제 는 게시 된 데이터가 아니기 때문에 hscrp_mgl 을 무작위 화 합니다. 따라서 결과를 무시하고 프로세스를 고려하십시오. 또한 신뢰 구간은 서로 다른 열에서 낮음과 높음으로 나뉩니다.
set.seed(456)
df <- data.frame(hscrp_mgl = abs(rnorm(250)),
age = sample(100, 1000, replace=TRUE),
gender = sample(0:1, 1000, replace=TRUE),
smoke = sample(1:4, 1000, replace=TRUE),
BMI = sample(19:25, 1000, replace=TRUE),
SBP = sample(c(100, 120, 140, 110, 120, 130, 120),
1000, replace=TRUE),
diab = sample(0:1, 1000, replace=TRUE),
stroke = sample(0:1, 1000, replace=TRUE))
# ITERATE THROUGH COLUMN NUMBERS (SUBSETTING OUT FIRST AND LAST)
modeldfs <- lapply(seq_along(df)[3:ncol(df)-1], function(i) {
strf <- paste("stroke ~ log2(hscrp_mgl)",
paste(names(df)[2:i], collapse = "+"), sep = "+")
print(strf)
# FIT DYNAMIC CUMULATIVE FORMULA USING names() TO PASS IN COLUMN NAME
fit <- glm(as.formula(strf), family=binomial, data=df)
# BIND MODEL STATS
data.frame(OR = exp(coef(fit)[i+1]),
CI_2.5 = exp(confint(fit)[i+1,1]),
CI_97.5 = exp(confint(fit)[i+1,2]))
})
model <- do.call(rbind, modeldfs)
model
산출
[1] "stroke ~ log2(hscrp_mgl)+age"
# Waiting for profiling to be done...
# Waiting for profiling to be done...
[1] "stroke ~ log2(hscrp_mgl)+age+gender"
# Waiting for profiling to be done...
# Waiting for profiling to be done...
[1] "stroke ~ log2(hscrp_mgl)+age+gender+smoke"
# Waiting for profiling to be done...
# Waiting for profiling to be done...
[1] "stroke ~ log2(hscrp_mgl)+age+gender+smoke+BMI"
# Waiting for profiling to be done...
# Waiting for profiling to be done...
[1] "stroke ~ log2(hscrp_mgl)+age+gender+smoke+BMI+SBP"
# Waiting for profiling to be done...
# Waiting for profiling to be done...
[1] "stroke ~ log2(hscrp_mgl)+age+gender+smoke+BMI+SBP+diab"
# Waiting for profiling to be done...
# Waiting for profiling to be done...
# > model <- do.call(rbind, modeldfs)
# > model
OR CI_2.5 CI_97.5
age 1.003285 0.9989043 1.007701
gender 1.067117 0.8318796 1.369055
smoke 1.005926 0.9005196 1.123717
BMI 1.011281 0.9505659 1.075928
SBP 1.003252 0.9929368 1.013692
diab 1.139586 0.8880643 1.462925
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다