2015-01-11 8 views
2

겉으로보기에는 단순하지만 매우 실망한 문제가 있습니다. R에서 상호 작용 용어가있는 모델을 실행하면 R은 생성 된 매개 변수의 이름을 "var1 : var2"등으로 지정합니다. 불행하게도이 명명 규칙을 사용하면 newdata가 필요한 곳에 예측 값과 CI를 계산할 수 없습니다. 왜냐하면 ":"은 문자가 아니기 때문입니다 열 머리글에 포함될 수 있으며 원본 데이터 프레임의 이름은 newdata의 이름과 정확히 일치해야합니다. 다른 사람이이 문제를 겪었습니까? 이 예측 지정된 수준에서 각 변수의 값,하지만 상호 작용 테이블을 생성R이 모델 출력에서 ​​상호 작용 매개 변수에 레이블을 붙이는 방식을 변경하는 방법이 있습니까?

wemedist2.exp = glm(survive/trials ~ sitedist + type + sitedist*type + roaddist, family =   binomial(logexp(wemedata$expos)), data=wemedata) 
summary(wemedist2.exp) 
wemepredict3 = with(wemedata, data.frame(sitedist=mean(sitedist),roaddist=mean(roaddist), type=factor(1:2))) 
wemepredict3 = cbind(wemepredict3, predict(wemedist2.exp, newdata = wemepredict3, type = "link", se = TRUE)) 

: 여기

내 코드의 샘플입니다.

+2

을''이름에 사용할 수 있습니다, 예를 들어, 우리는 또한 데이터 as.data.frame(X[, -1])에 장착하여이 작업을 할 수 있었다 'd <- data.frame ('a : b'= 1 : 3, check.names = FALSE)'. – jbaums

+0

ahh 감사합니다. 답장을 위해 시간을내어 주셔서 감사합니다. – JSB89

답변

3

newdata 데이터 프레임의 경우 상호 작용을위한 열을 포함하지 않아야합니다. predict을 호출 할 때 상호 작용 변수의 곱이 계산되고 (추정 계수가 곱 해짐) 계산됩니다.

M <- lm(y ~ x1 * x2, X) 
summary(M) 

# Call: 
# lm(formula = y ~ x1 * x2, data = X) 
# 
# Residuals: 
#  Min  1Q Median  3Q  Max 
# -0.43208 -0.06743 -0.00170 0.06601 0.37197 
# 
# Coefficients: 
#    Estimate Std. Error t value Pr(>|t|)  
# (Intercept) 0.202040 0.003906 51.72 <2e-16 *** 
# x1   0.128237 0.006809 18.83 <2e-16 *** 
# x2   0.156942 0.006763 23.21 <2e-16 *** 
# x1:x2  0.292582 0.011773 24.85 <2e-16 *** 
# --- 
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
# 
# Residual standard error: 0.09906 on 9996 degrees of freedom 
# Multiple R-squared: 0.5997, Adjusted R-squared: 0.5996 
# F-statistic: 4992 on 3 and 9996 DF, p-value: < 2.2e-16 

b 
# [1] 0.2106027 0.1147864 0.1453641 0.3099322 
  • 예를 들어 데이터를 만들기 :

    set.seed(1) 
    n <- 10000 
    X <- data.frame(x1=runif(n), x2=runif(n)) 
    X$x1x2 <- X$x1 * X$x2 
    
    head(X) 
    #   x1   x2  x1x2 
    # 1 0.2655087 0.06471249 0.017181728 
    # 2 0.3721239 0.67661240 0.251783646 
    # 3 0.5728534 0.73537169 0.421260147 
    # 4 0.9082078 0.11129967 0.101083225 
    # 5 0.2016819 0.04665462 0.009409393 
    # 6 0.8983897 0.13091031 0.117608474 
    
    b <- runif(4) 
    y <- b[1] + c(as.matrix(X) %*% b[-1]) + rnorm(n, sd=0.1) 
    
  • 이 예상 대 실제 계수 모델을 장착하고 비교 :

    1. 일부 더미 데이터를 만들기 : 예를 들어

      예측하고 예측합니다. 피팅 모델

      다른 방법은 당신의 상호 작용을 포함하는 것입니다 ...

      X.predict <- data.frame(x1=runif(10), x2=runif(10)) 
      
      head(X.predict) 
      #   x1  x2 
      # 1 0.26037592 0.7652155 
      # 2 0.73988333 0.3352932 
      # 3 0.02650689 0.9788743 
      # 4 0.84083874 0.1446228 
      # 5 0.85052685 0.7674547 
      # 6 0.13568509 0.9612156 
      
      predict(M, newdata=X.predict) 
      
      #   1   2   3   4   5   6   7 
      # 0.4138194 0.4221251 0.3666572 0.3681432 0.6225354 0.4084543 0.4711018 
      #   8   9  10 
      # 0.7092744 0.3401867 0.2320834 
      

    또는를 우리는 x1x2를 작성하고 하지x1:x2를 생성 할 수 있습니다 상호 작용하는 용어의 곱을 계산하여 데이터를 생성 한 다음 새 데이터에도이를 포함시킵니다. 위의 1 번 단계에서 첫 번째 단계를 완료했습니다. 여기서 x1x2이라는 열을 만들었습니다. 다음 데이터에 lm(y ~ x1 + x2 + x1x2, X)

    그리고 예측 :

    그럼 우리가 가진 모델에 딱 맞는

    X.predict <- data.frame(x1=runif(10), x2=runif(10), x1x2=runif(10) 
    

    당신이 상호 작용에 관여 범주 변수가 있다면 ...

    범주 형 변수와 관련된 상호 작용이있을 때 모델은 참조 레벨에 속하는 것과 관련하여 각 레벨에 속하는 효과.(

    1. 절편을 : 그래서 예를 들면 우리는 기술, 하나 개의 연속 예측 (x1)와 하나 개의 범주 예측 (수준 a, bx2, 및 c), 다음 모델 y ~ x1 * x2 여섯 개 계수를 추정 할있는 경우 즉, x1이 0이고 관측치가 x2의 참조 레벨에 속할 때, y의 예측치);

    2. 관찰이 기준 레벨 x2 (즉, 참조 레벨 x2에 대한 기울기)에 속할 때 변화하는 효과는 x1이다.

    3. 제 2 레벨에 속하는 효과 (즉, 기준 레벨에 속하는 것에 비해 제 2 레벨에 속하는 것에 의한 절편의 변화);

    4. 제 3 레벨에 속하는 효과 (즉, 기준 레벨에 속하는 것에 비해 제 3 레벨에 속하는 것에 의한 절편의 변화);

    5. 기준 레벨에 속하는 것에 비해, 제 2 레벨에 속하는 것으로 인한 x1의 효과 변화 (즉, 기울기 변화);

    6. 기준 레벨에 속하는 것에 비해, 제 3 레벨에 속하는 것으로 인한 x1의 효과 변화 (즉, 기울기 변화).

    당신이 적합하고 상호 작용을 설명/위해 미리 계산 된 데이터와 모델을 예측하려는 경우, 당신은 열이 포함 된 dataframe 만들 수 있습니다 x1을; x2b (이진, 관찰이 수준 b에 속하는지 여부를 나타냄); x2c (이진, 관측치가 레벨 c에 속하는지 여부를 나타냄); x1x2b (x1x2b의 생성물); 및 x1x2c (x1x2c의 제품).

    이 작업을 수행하는 빠른 방법은 model.matrix 함께 :

    set.seed(1) 
    n <- 1000 
    d <- data.frame(x1=runif(n), x2=sample(letters[1:3], n, replace=TRUE)) 
    
    head(d) 
    #   x1 x2 
    # 1 0.2655087 b 
    # 2 0.3721239 c 
    # 3 0.5728534 b 
    # 4 0.9082078 c 
    # 5 0.2016819 a 
    # 6 0.8983897 a 
    
    X <- model.matrix(~x1*x2, d) 
    
    head(X) 
    # (Intercept)  x1 x2b x2c x1:x2b x1:x2c 
    # 1   1 0.2655087 1 0 0.2655087 0.0000000 
    # 2   1 0.3721239 0 1 0.0000000 0.3721239 
    # 3   1 0.5728534 1 0 0.5728534 0.0000000 
    # 4   1 0.9082078 0 1 0.0000000 0.9082078 
    # 5   1 0.2016819 0 0 0.0000000 0.0000000 
    # 6   1 0.8983897 0 0 0.0000000 0.0000000 
    
    b <- rnorm(6) # coefficients 
    y <- X %*% b + rnorm(n, sd=0.1) 
    

    당신은 한 이후 새로운 데이터 모델을 보내고 때 predict 일관된 이름을 사용하여, 당신이 원하는대로에 X의 열 이름을 바꿀 수 있습니다.

    이제 모델에 적합합니다. 여기에서는 변수 값 (Intercept)이 이미 X에 있고 계산 된 계수를 갖기 때문에 lm은 절편 (-1)을 계산하지 않는다고 말합니다.

    (M <- lm(y ~ . - 1, as.data.frame(X))) 
    
    # Call: 
    # lm(formula = y ~ . - 1, data = as.data.frame(X)) 
    # 
    # Coefficients: 
    # `(Intercept)`   x1   x2b   x2c `x1:x2b` `x1:x2c` 
    #  1.14389  1.09168 -0.88879  0.20405  0.09085 -1.63769 
    

    에 예측하고, 예측을 수행하는 몇 가지 새로운 데이터를 생성합니다 :

    d.predict <- expand.grid(x1=seq(0, 1, 0.1), x2=letters[1:3]) 
    X.predict <- model.matrix(~x1*x2, d.predict) 
    y.predict <- predict(M, as.data.frame(X.predict)) 
    
  • +0

    jbaums - 감사합니다.내가 혼란스러워하는 마지막 단계까지 너를 따라 간다. 나는 이것이 x1과 x2에 대해서뿐만 아니라 상호 작용 항의 예측 된 값을 산출하는 방법을 이해하지 못한다. (그것은 내 데이터에서 일어나는 일이다.) 당신이 제안하는 대안적인 접근법을 시도하고 싶지만, 상호 작용 용어의 변수 중 하나가 범주 적이라면 이것을 할 수 있습니까? 위 코드 예제를 추가했습니다. – JSB89

    +0

    @ user3500114 이렇게하려면 요인 수준에 대한 지표 변수를 만들고 연속 변수와 각 지표 변수의 곱을 계산해야합니다. 위의 수정 내용을 참조하십시오. – jbaums