내 질문은 여기 에있는 것과 비슷 하지만 R에서하고 싶습니다. 데이터 프레임은
x<-c(0.35,0.46,0.60,0.78,1.02,1.34,1.76,2.35,3.17,4.28,5.77,7.79,10.50,14.20,19.10,25.80)
y<-c(32.40,43.00,37.20,26.10,17.40,14.00,19.90,36.90,48.60,55.30,64.60,70.20,63.90,47.60,22.70,10.30)
df<-data.frame(x,y)
plot(df,log='xy')
여기에 플로팅하면 데이터가 어떻게 보이는지 나타납니다. x 스케일 단위로 0.5 정도의 모드와 8 정도의 모드가 있습니다.
이러한 데이터에 "다중 모드"로그 정규 분포를 어떻게 맞출 수 있습니까 (이 경우 2 개의 곡선이 있음)? 내가 시도한 것입니다. 문제를 해결하는 데 도움이나 지시 사항이 있으면 대단히 감사하겠습니다.
ggplot(data=df, aes(x=x, y=y)) +
geom_point() +
stat_smooth(method="nls",
formula=y ~ a*dlnorm(x, meanlog=8, sdlog=2.7),
method.args = list(start=c(a=2e6)),
se=FALSE,color = "red", linetype = 2)+
scale_x_log10()+
scale_y_log10()
나는 당신이 원한다고 가정하고 nls
있습니다. 방정식에서 두 개의 매개 변수 (예 : a
및) 를 정의하여 두 가지 모드를 고려할 수 있습니다 b
. 두 start=
값 모두에 대해 정의하십시오 . (지금은 모든 값을 추측했습니다.)
fit <- nls(y ~ a*dlnorm(x, meanlog=.5, sdlog=.5) + b*dlnorm(x, meanlog=8, sdlog=2.7),
data=df1, start=list(a=1, b=1))
summary(fit)
# Formula: y ~ a * dlnorm(x, meanlog = 0.5, sdlog = 0.5) + b * dlnorm(x,
# meanlog = 8, sdlog = 2.7)
#
# Parameters:
# Estimate Std. Error t value Pr(>|t|)
# a -81.97 16.61 -4.934 0.00022 ***
# b 30695.42 2417.90 12.695 4.53e-09 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 11.92 on 14 degrees of freedom
#
# Number of iterations to convergence: 1
# Achieved convergence tolerance: 4.507e-07
fitted()
이미 데이터 프레임의 값을 y
따라 적합 값을 제공합니다 x
.
fitted(fit)
# [1] 45.56775 44.59130 38.46212 27.34071 15.94205 12.76579 21.31640
# [8] 36.51385 48.68786 53.60069 53.56958 51.40254 48.41267 44.95541
# [15] 41.29045 37.41424
# attr(,"label")
# [1] "Fitted values"
predict()
이것을 위해 사용할 수도 있습니다 .
stopifnot(all.equal(predict(fit), as.numeric(fitted(fit))))
그러나 더 부드러운 선을 얻으 려면 축을 따라 더 미세한 값 집합을 따라 predict
이온 (즉, y
값)이 필요 x
합니다 x
.
plot(df1, log='xy')
x.seq <- seq(0, max(df$x), .1)
lines(x=x.seq, y=predict(fit, newdata=data.frame(x=x.seq)), col=2)
참고 사항 : 이것이 매우 일반적 이더라도 데이터 프레임의 이름을 지정 하면 F 분포 df
의 밀도 함수 df()
에 사용되는 것과 동일한 이름을 사용 하므로 혼동이 발생할 수 있습니다! 이런 이유로 나는 df1
.
데이터:
df1 <- structure(list(x = c(0.35, 0.46, 0.6, 0.78, 1.02, 1.34, 1.76,
2.35, 3.17, 4.28, 5.77, 7.79, 10.5, 14.2, 19.1, 25.8), y = c(32.4,
43, 37.2, 26.1, 17.4, 14, 19.9, 36.9, 48.6, 55.3, 64.6, 70.2,
63.9, 47.6, 22.7, 10.3)), class = "data.frame", row.names = c(NA,
-16L))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다