r. ggplot2.stat_smooth 방법에서 원활한 곡선을 재현합니다
문제
GGPLOT2 패키지에서 STAT_SMOOTH에서 STAT_SMOOTH에서 부드러운 기능을 추정하는 데 사용되는 절차를 재현하려고 시도하고 있습니다. 예를 들어
를 취하십시오library(ggplot2)
n <- 100
X <- runif(n)*8
Y <- sin(3*X) + cos(X^2) + rnorm(n, 0, 0.5)
myData <- as.data.frame(cbind(X, Y))
p <- ggplot(myData, aes(y=Y, x=X)) +
stat_smooth(se = FALSE, size = 2) +
geom_point(size = 1)
p
geom_smooth: method="auto" and size of largest group is <1000, so using loess. Use 'method = x' to change the smoothing method.
.
부드러운 줄은 실제로 데이터에 맞지 않지만 중요하지 않습니다. 이제 스크래치와 동일한 그래프를 다시 작성할 수 있습니다. http://www.inside-rorg/r-doc/ 통계 / Loens 우리는 Tricubic Weighting 커널 및 Degree 2의 다항식을 사용해야합니다 (기본적으로). 나는이 http : // www. maths.manchester.ac.uk/~peterf/math38011/npr%20local%20linear%20estimator.pdf 원활한 로즈 기능을 추정하는 방법을 설명하는 기사. 이 메소드를 재생성하고 내 데이터로 사용하려고합니다.
Dfct <- function(t){
if (abs(t) <= 1)
((1-abs(t)^3)^3) else
0
}
K_h <- function(x_0, x){
f_hat <- NULL
Dfct(abs(x - x_0)/h)
}
m_hat_loess <- function(X, Y){
e_1 <- c(1, 0, 0)
m_hat <- NULL
for(i in 1:length(X)){
K_h_vector <- NULL
for(j in 1:length(X)){
K_h_vector <- c(K_h_vector, K_h(X[i], X[j]))
}
X_0 <- cbind(rep(1, length(X)), (X - X[i]), (X - X[i])^2)
W <- diag(K_h_vector)
m_hat <- c(m_hat,
t(e_1)%*% solve(t(X_0)%*%W%*%X_0) %*% (t(X_0)%*%W%*%Y)
)
}
m_hat
}
.
나는 h 매개 변수에 대해 내가 무엇을 해야하는지 확실하지 않지만, "Metric Width가있는 Tri-Cube 커널에 대해서는" h 은 반경이다. 지원 영역의. " 따라서 첫 번째 방법은 다음과 같습니다.
h <- (max(X)-min(X))/2
Y_hat <- m_hat_loess(X, Y)
tempData <- as.data.frame(cbind(X, Y_hat))
ggplot(tempData , aes(x=X, y=Y_hat)) +
geom_line(size = 2)
.
이것은 명확하게 동일한 기능이 아닙니다. 나는 h 의 다른 가치를 사용 해왔다. 그러나 같은 곡선을 다시 만들 수 없으므로, 나는 내가 어딘가에 실수를했다고 믿는다.
해결책
stat_smooth(...)
패키지의 ggplot
기능은 여기에서 설명 할 수 있듯이 데이터 (잠재적으로 잠재적으로 잠재적으로 보조)를 전달합니다.
library(ggplot2)
set.seed(1)
n <- 100
X <- runif(n)*8
Y <- sin(3*X) + cos(X^2) + rnorm(n, 0, 0.5)
myData <- data.frame(X,Y)
fit <- loess(Y~X,data=myData)
myData$pred <- predict(fit)
ggplot(myData, aes(X,Y))+
geom_point()+
stat_smooth(se=F, size=3)+
geom_line(aes(X,pred),colour="yellow")
.