문제

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")
.

설명서 loess(...)는 계산 방법, 특히 여기 .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top