2015-01-23 4 views
0

lm()이 장착 된 모델에서 두 변수의 곱 (상호 작용)의 평균을 얻으려고합니다.적합 선형 모델로부터 독립 변수 상호 작용의 평균을 추출하십시오

N <- 1000 
u <- rnorm(N) 
x1 <- rnorm(N) 
x2 <- 1 + x1 + rnorm(N) 
y <- 1 + x1 + x2 + u 
df <- data.frame(y,x1,x2) 
fit <- lm(y ~ x1 * x2, data = df) 

$model에 액세스하는 계수에 대한 단일 변수의 평균을 계산할 수 있습니다.

mean(fit$model[,2]) 
# verify result 
mean(df[,2]) 

그러나 어떻게 데이터로 돌아 가지 않고 상호 작용의 평균을 얻을 수 있습니까?

# Result should be 
mean(df$x1*df$x2) 

답변

1

나는 왜 당신이 원하는 모르겠지만, fit에서 얻을 간단하다. 첫째, $을 사용하여 이와 같이 맞는 오브젝트를 파고 들지 않는 것이 가장 좋습니다. 대신 추출 기능을 사용하는 법을 배우십시오. 이 경우, mean(fit$model[,2])의 상응 한 번에 모든 데이터 열에 대해, 다음과 같습니다

> colMeans(model.frame(fit)) 
     y  x1  x2 
2.0783225 0.0283555 1.0481141 

모델 프레임은 데이터의 단지 사본입니다. 원하는 것은 디자인 행렬이나 R은 모델 행렬이라고 부릅니다. 이는 당연히 model.matrix() 함수를 사용하여 얻을 수 있습니다.

> head(model.matrix(fit)) 
    (Intercept)   x1   x2  x1:x2 
1   1 -0.33406119 1.95054087 -0.65160001 
2   1 -1.41848058 0.35429591 -0.50256186 
3   1 -1.32877702 -0.00783884 0.01041607 
4   1 0.54054637 1.34637056 0.72777572 
5   1 -0.75686319 -0.36476471 0.27607699 
6   1 0.04514449 1.62928315 0.07355316 

응답 데이터는 설계 매트릭스에는 없지만 상호 작용 용어는 마지막 열에 있습니다. 이 디자인 행렬의 각 열의 평균을 얻기 위해 다시 colMeans()을 사용하여 완성도를 들어

> colMeans(model.matrix(fit)) 
(Intercept)   x1   x2  x1:x2 
    1.0000000 0.0283555 1.0481141 1.0820110 

나는이 내 임의의 데이터 세트에 대한 올바른 표시해야합니다 : 귀하의 답변에 대한

> colMeans(transform(df[,-1], interaction = x1 * x2)) 
     x1   x2 interaction 
    0.0283555 1.0481141 1.0820110 
+0

감사합니다. 나는 상호 작용 열에 대해서만 의미를 원했고 모든 열에는 의미를 원하지 않았습니다. 'colMeans (model.matrix (fit)) [3]'로 접근 할 수 있는지는 좋은 습관이라고 생각하지만 정확하게 필요합니다. – marco

+0

괜찮 으면 좋겠지 만 과장이 필요하다면 : mean (model.frame (fit) [, 3])은 더 명확하고 다른 열에 대해서는 추출 계산을하지 않아야합니다. –

0
mean(x1 * x2) 
#[1] 0.9009494 

mean(do.call("*", fit$model[, c("x1", "x2")])) 
#[1] 0.9009494 

fit <- lm(y ~ x1 * x2, data = df, x=TRUE) 
mean(fit$x[,"x1:x2"]) 
#[1] 0.9009494 
관련 문제