인사말,
관측 된 공간의 크기와 빅뱅 이후 경과 한 시간을 확인하는 데 도움이되는 연구를 수행하고 있습니다. 잘하면 당신이 도울 수 있습니다!
두 개의 선형 회귀를 수행하려는 부분 선형 함수를 따르는 데이터가 있습니다. 경사와 절편이 바뀌는 지점이 있으며이 지점을 찾으려면 프로그램을 작성해야합니다.
생각?
인사말,
관측 된 공간의 크기와 빅뱅 이후 경과 한 시간을 확인하는 데 도움이되는 연구를 수행하고 있습니다. 잘하면 당신이 도울 수 있습니다!
두 개의 선형 회귀를 수행하려는 부분 선형 함수를 따르는 데이터가 있습니다. 경사와 절편이 바뀌는 지점이 있으며이 지점을 찾으려면 프로그램을 작성해야합니다.
생각?
답변:
mcp
패키지는이 작업을 수행 할 수 있습니다. 데이터가
먼저 몇 가지 데이터를 시뮬레이션 해 보겠습니다.
df = data.frame(x = 1:100,
y = c(rnorm(40, 10 + (1:40)*0.5),
rnorm(60, 10 + 40*0.5 -8 + (1:60)*0.2)))
이제 다음을 사용하여 변경점을 40 (및 매개 변수 값)으로 복구 할 수 있는지 살펴 보겠습니다 mcp
.
model = list(
y ~ 1 + x, # linear segment
~ 1 + x # another linear segment
)
library(mcp)
fit = mcp(model, df)
그것을 플로팅하십시오. 회색 선은 피팅에서 무작위로 그려져 추세를 포착 함을 나타냅니다. 파란색 곡선은 예상 변경점 위치입니다.
개별 모수 추정값을 보자. int_
절편, x_
x의 기울기 및 cp_
변경점입니다.
summary(fit)
Population-level parameters:
name mean lower upper Rhat n.eff
cp_1 40.48 40.02 41.00 1 2888
int_1 11.12 9.11 13.17 1 778
int_2 21.72 20.09 23.49 1 717
sigma_1 3.23 2.76 3.69 1 5343
x_1 0.46 0.36 0.54 1 724
x_2 0.21 0.16 0.26 1 754
면책 조항 : 나는 개발자입니다 mcp
.
R 패키지 strucchange 가 도움이 될 수 있습니다. 비 네트를 보면 비슷한 문제를 해결하는 방법에 대한 훌륭한 개요가 있습니다.
포인트 수가 너무 많지 않으면 모든 가능성을 시도 할 수 있습니다. 요점이 있다고 가정 해 봅시다 어디 . 보다, 당신은 루프 할 수 있습니다 ...에서 에 두 줄을 둘 다 맞 춥니 다 과 . 마지막으로, 당신은 선택 두 라인에 대한 제곱 잔차의 합의 합계는 최소입니다.
이것은 (오프라인) 변경점 감지 문제입니다. 우리의 이전 논의는 저널 기사 및 R 코드에 대한 참조를 제공합니다. Barry와 Hartigan의 "제품 파티션 모델"은 경사면의 변화를 처리하고 효율적으로 구현하기 때문에 먼저 살펴보십시오 .
또한 세그먼트 패키지는 과거에 비슷한 문제를 해결하는 데 도움이되었습니다.
segmented
세그먼트 간의 인터셉트 변경을 모델링 할 수 없으며 첫 번째 세그먼트에 대한 인터셉트 만 가능합니다.
모든 가능성을 찾는 mbq의 답변을 기반으로했습니다. 또한, 나는 이것을한다 :
중요성을 확인하는 이유는 무엇입니까? 조각 별 모델 중 하나가 데이터에 매우 적합하지 않으면 최소 SSE가있는 점이 의미가 없기 때문입니다. 이것은 경사가 변하는 명확한 중단 점이없는 상관 관계가 높은 두 변수에 대해 발생할 수 있습니다.
간단한 테스트 사례로이 간단한 접근 방식을 확인하겠습니다.
x <- c(-50:50)
y <- abs(x)
plot(x,y,pch=19)
중단 점은 분명히 0입니다. 다음 R 스크립트를 사용하십시오.
f <- function(x, y)
{
d <- data.frame(x=x, y=y)
d <- d[order(x),]
r <- data.frame(k=rep(0,length(x)-4), sums=rep(0,length(x)-4))
plm <- function(i)
{
d1 <- head(d,i)
d2 <- tail(d,-i)
# Make sure we've divided the region perfectly
stopifnot(nrow(d1)+nrow(d2) == nrow(d))
m1 <- lm(y~x, data=d1)
m2 <- lm(y~x, data=d2)
r <- list(m1, m2)
r
}
lapply(2:(nrow(d)-3), function(i)
{
r$k[i-2] <<- d[i,]$x
# Fit two piecewise linear models
m <- plm(i)
# Add up the sum of squares for residuals
r$sums[i-2] <<- sum((m[[1]]$residuals)^2) + sum((m[[2]]$residuals)^2)
})
b <- r[which.min(r$sums),]
b
}
가능한 모든 조합에 대해 조각 별 선형 모형을 적합합니다.
f(x,y)
k sums
0 0
최적의 두 모델에 대한 계수를 확인하면 매우 중요합니다. 그들의 R2도 매우 높습니다.