예측

2016-09-18 4 views
2

난 세 셋이 샘플) 2 (독립 변수)예측

test_set X - 10 (샘플 매트릭스) 응답 정의 10 (종속 변수)

response <- matrix(sample.int(15, size = 5*10, replace = TRUE), nrow = 5, ncol = 10) 
colnames(response) <- c("1_DV","2_DV","3_DV","4_DV","5_DV","6_DV","7_DV","8_DV","9_DV","10_DV") 
predictors <- matrix(sample.int(15, size = 7*2, replace = TRUE), nrow = 5, ncol = 2) 
colnames(predictors) <- c("1_IV","2_IV") 
test_set <- matrix(sample.int(15, size = 10*2, replace = TRUE), nrow = 10, ncol = 2) 
colnames(test_set) <- c("1_IV","2_IV") 

I 정의 트레이닝 세트를 사용하여 다변량 선형 모델을하고있어이 X를 응답과 예측 세트의 조합이야, 내가 테스트 세트에 대한 예측하기 위해이 모델을 사용하고 싶습니다 그러나

training_dataframe <- data.frame(predictors, response) 
fit <- lm(response ~ predictors, data = training_dataframe) 
predictions <- predict(fit, data.frame(test_set)) 

을, 예측의 결과는 정말 이상한 있습니다

predictions 

우선 off 행렬 차원은 5 x 10이며 응답 변수의 샘플 수는 DV 수입니다.

R의 이러한 유형의 분석에는 익숙하지 않지만 10x10 매트릭스를 얻지 않아야합니다. 그러면 test_set의 각 행에 대한 예측이 가능합니까?

이 문제에 어떤 도움이 크게 마틴

답변

4

당신은 당신이 가진 모델 클래스는 "MLM", 즉, "다중 선형 모델"입니다 R.에서 제대로 지원 부분으로 스테핑을 감상 할 수있는 표준 "lm"클래스가 아닙니다. 공변량/예측 변수의 공통 세트에 대해 여러 개의 (독립적 인) 응답 변수가있을 때 얻을 수 있습니다. 이러한 모델에 lm() 기능이 적합 할 수 있지만, "mlm"클래스의 경우 predict 방법이 좋지 않습니다. methods(predict)을 보면 predict.mlm*이 표시됩니다. 일반적으로 "lm"클래스가있는 선형 모델의 경우 predict을 호출하면 predict.lm이 호출됩니다. 그러나 "mlm"클래스의 경우 predict.mlm*이 호출됩니다.

predict.mlm*은 너무 원시적입니다. se.fit을 허용하지 않습니다. 즉, 이론적으로 가능하지만 예측 오차, 신뢰/예측 간격 등을 생성 할 수 없습니다. 그것은 단지 예측 평균을 계산할 수 있습니다. 그렇다면 왜 우리는 predict.mlm*을 사용하고 싶습니까?! 예측 평균은 간단한 행렬 - 행렬 곱셈 (표준 "lm"클래스에서 이것은 행렬 - 벡터 곱셈입니다)을 통해 얻을 수 있으므로 우리 스스로 수행 할 수 있습니다.

이 작은 재현 예제를 고려하십시오.

set.seed(0) 
## 2 response of 10 observations each 
response <- matrix(rnorm(20), 10, 2) 
## 3 covariates with 10 observations each 
predictors <- matrix(rnorm(30), 10, 3) 
fit <- lm(response ~ predictors) 

class(fit) 
# [1] "mlm" "lm" 

beta <- coef(fit) 
#     [,1]  [,2] 
#(Intercept) 0.5773235 -0.4752326 
#predictors1 -0.9942677 0.6759778 
#predictors2 -1.3306272 0.8322564 
#predictors3 -0.5533336 0.6218942 

는 예측 데이터 세트가있는 경우 :

# 2 new observations for 3 covariats 
test_set <- matrix(rnorm(6), 2, 3) 

우리는 먼저

pred <- Xp %*% beta 
#   [,1]  [,2] 
#[1,] -2.905469 1.702384 
#[2,] 1.871755 -1.236240 

아마도 이것은 행렬 곱셈을 수행 패드 절편 열

Xp <- cbind(1, test_set) 

을 필요 너는 그쪽을 알아 차렸다. 나는 여기에도 데이터 프레임을 사용하지 않았다. 네가 모든 것을 매트릭스 형태로 가지고 있기 때문에 불필요하다. R 마법사의 경우 lm.fit 또는 qr.solve을 사용하는 것이 더 간단합니다.


그러나 완전한 답변으로

, 우리의 원하는 결과를 얻을 수 predict.mlm를 사용하는 방법을 보여주기 위해 필수입니다.

## still using previous matrices 
training_dataframe <- data.frame(response = I(response), predictors = I(predictors)) 
fit <- lm(response ~ predictors, data = training_dataframe) 
newdat <- data.frame(predictors = I(test_set)) 
pred <- predict(fit, newdat) 
#   [,1]  [,2] 
#[1,] -2.905469 1.702384 
#[2,] 1.871755 -1.236240 

참고 I() 내가 data.frame()를 사용합니다. 이것은의 데이터 프레임 을 얻고 자 할 때 필수적입니다. 다음의 차이를 비교할 수 있습니다.

str(data.frame(response = I(response), predictors = I(predictors))) 
#'data.frame': 10 obs. of 2 variables: 
# $ response : AsIs [1:10, 1:2] 1.262954.... -0.32623.... 1.329799.... 1.272429.... 0.414641.... ... 
# $ predictors: AsIs [1:10, 1:3] -0.22426.... 0.377395.... 0.133336.... 0.804189.... -0.05710.... ... 

str(data.frame(response = response, predictors = predictors)) 
#'data.frame': 10 obs. of 5 variables: 
# $ response.1 : num 1.263 -0.326 1.33 1.272 0.415 ... 
# $ response.2 : num 0.764 -0.799 -1.148 -0.289 -0.299 ... 
# $ predictors.1: num -0.2243 0.3774 0.1333 0.8042 -0.0571 ... 
# $ predictors.2: num -0.236 -0.543 -0.433 -0.649 0.727 ... 
# $ predictors.3: num 1.758 0.561 -0.453 -0.832 -1.167 ... 

매트릭스 입력을 보호하기 위해 데이터가 지저분합니다. 이 문제로 인해 lm에 문제가 발생하지 않는다는 점은 놀랍습니다. predict.mlmI()을 사용하지 않으면 예측에 적합한 매트릭스를 얻는데 어려움을 겪습니다.

글쎄,이 경우 "데이터 프레임"대신 "목록"을 사용하는 것이 좋습니다.data 인수가 lm 인 경우 newdata 인수가 predict 인 경우 목록 입력이 허용됩니다. "리스트"는 아무런 데이터 구조도 어려움없이 보유 할 수있는 데이터 프레임보다 일반적인 구조입니다. 우리는 할 수 있습니다 :

## still using previous matrices 
training_list <- list(response = response, predictors = predictors) 
fit <- lm(response ~ predictors, data = training_list) 
newdat <- list(predictors = test_set) 
pred <- predict(fit, newdat) 
#   [,1]  [,2] 
#[1,] -2.905469 1.702384 
#[2,] 1.871755 -1.236240 

는 아마 가장 마지막에, 나는 오히려 매트릭스 인터페이스보다 식 인터페이스를 사용하는 것이 안전 것을 강조해야한다. R 내장 데이터 세트 trees을 재현 가능한 예제로 사용하겠습니다.
fit <- lm(cbind(Girth, Height) ~ Volume, data = trees) 

## use the first two rows as prediction dataset 
predict(fit, newdata = trees[1:2, ]) 
#  Girth Height 
#1 9.579568 71.39192 
#2 9.579568 71.39192 

아마도 당신은 여전히 ​​나의 predict.mlm*se.fit를 지원하기에 너무 원시적이라고 말을 기억한다. 이것은 그것을 시험 할 기회이다.

predict(fit, newdata = trees[1:2, ], se.fit = TRUE) 
#Error in predict.mlm(fit, newdata = trees[1:2, ], se.fit = TRUE) : 
# the 'se.fit' argument is not yet implemented for "mlm" objects 

죄송합니다 ... 어떻게 신뢰/예측 간격 (실제로 그 간격을 생산하는 것은 불가능 표준 오차를 계산하는 능력이없는) 어떻습니까? 음, predict.mlm*은 무시할 것입니다.

predict(fit, newdata = trees[1:2, ], interval = "confidence") 
#  Girth Height 
#1 9.579568 71.39192 
#2 9.579568 71.39192 

이렇게 이것은 predict.lm과 매우 다릅니다.

+0

이 경우 MLM은 "다 변수 선형 모델"을 나타냅니다. –

+0

설명해 주셔서 감사합니다. –