당신은 당신이 가진 모델 클래스는 "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.mlm
은 I()
을 사용하지 않으면 예측에 적합한 매트릭스를 얻는데 어려움을 겪습니다.
글쎄,이 경우 "데이터 프레임"대신 "목록"을 사용하는 것이 좋습니다.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
과 매우 다릅니다.
이 경우 MLM은 "다 변수 선형 모델"을 나타냅니다. –
설명해 주셔서 감사합니다. –