2014-12-11 3 views
0

나는 내 코드에서 벗어나고 싶은 것을 해결했으며이 결과를 얻는 더 깨끗한 방법을 찾고 있습니까? 내장 함수에서와 마찬가지로 내가 모르는 사람입니까?다중 요인 모델에서 개별 회귀 추정치를 얻는 더 명확한 방법이 있습니까 R

우리는이 개 상관 관계 변수 (약 200) 이항 많은 요인, 여기 단지 F1과 일러스트 및 F2 있습니다

x <- rnorm(100) 
y <- rnorm(100) 
f1 <- rbinom(100, 1, 0.5) 
f2 <- rbinom(100, 1, 0.5) 

# which gives the possible groups: 
group <- rep(NA, 100) 
group[which(f1 & f2)] <- "A" 
group[which(!f1 & f2)] <- "B" 
group[which(f1 & !f2)] <- "C" 
group[which(!f1 & !f2)] <- "D" 

df <- data.frame(group,y,x,f1,f2) 

우리는 용어와 상호 작용을 추가 및 제거 모델 선택을 실행하고 끝을 모델과 , 우리가 F1 및 F2와 X 과의 상호 작용을 모두 예측 인자로 나온 말

m <- glm(y ~ x * f1 + x * f2) 

그럼 내 목표는 각 그룹의 예에 대한 간단한 선형 모델의 출력을 확인하는 것입니다 . : Y = X + A * B

이런 출력 제공
# The possible groups: 
groups <- data.frame(groups = c("A", "B", "C", "D"), f1=c(1,0,1,0), f2=c(1,1,0,0)) 

interactions <- grep(":", attr(m$terms, "term.labels")) 
factors <- attr(m$terms, "term.labels")[-c(1,interactions)] 
interaction.terms <- substring(attr(m$terms, "term.labels")[interactions], 3) 

functions <- data.frame(groups$groups, intercept=NA, slope=NA) 

for(i in seq(along=groups$groups)) { 
    intercept <- coef(m)["(Intercept)"] + sum(groups[i, factors]*coef(m)[factors]) 
    slope <- coef(m)["x"] + sum(groups[i, interaction.terms]*coef(m)[paste("x:", interaction.terms, sep="")]) 

    functions[i, "intercept"] <- intercept 
    functions[i, "slope"] <- slope 
} 

:

> functions 
    groups.groups intercept  slope 
1    A -0.10932806 -0.07468630 
2    B -0.37755949 -0.17769345 
3    C 0.23635139 0.18406047 
4    D -0.03188004 0.08105332 

출력은 정확하고 싶습니다 무슨. 그래서 괜찮습니다. 나는이 방법이 상당히 복잡하다고 생각합니다. 나는이 함수들을 빼내는 더 깔끔한 방법을 찾을 수없는 것 같다.

답변

1

이 경우 predict()을 사용하는 것이 좋습니다. 절편은 단지 시간 값 x=0이고, 기울기는 x=1x=0 사이의 값의 차이입니다. 그래서 당신은 당신의 정확한 결과가 재현되지 않도록

int <- predict(m, cbind(groups,x=0)) 
t1 <- predict(m, cbind(groups,x=1)) 

data.frame(group=groups$groups, int=int, slope=t1-int) 

당신은 당신의 예를 들어 씨앗을 설정하지 않은 할 수 있지만 샘플 생성하기 전에 set.seed(15)을 할 경우, 당신은 가야

group   int  slope 
1  A -0.08372785 -0.16037708 
2  B -0.03904330 0.14322623 
3  C 0.16455660 -0.02951151 
4  D 0.20924114 0.27409179 

두 가지 방법 모두 사용

+0

이 솔루션은 훨씬 간단하고 오류가 발생하기 쉬운 방법입니다. –