К сожалению, функция stem
ничего не возвращает, что усложняет жизнь. Плюс код написан в C, который доступен здесь . Я попытался воспроизвести функцию stem
с помощью простых функций R, и это определенно не соответствует коду C, но работает для этого образца набора данных. Я определенно не использовал аргументы основы (масштаб, ширина, атом).
data(mtcars)
x <- mtcars$wt
stem(x) # you can see the result from the question.
mu = mean(x)
sdev <- sd(x)
y <- (1/(sdev * sqrt(2*pi))) * exp(-((x-mu)^2)/(2*sdev^2))
Это ваш график плотности:
par(mar=c(2,1,1,1))
plot(x, y, pch = 8, xaxt="n", yaxt="n", ylab="", col="grey)
Теперь нам нужно заново изобрести stem
функционировать с нуля. Сначала я использую функцию hist
для определения «лучших» точек останова, что, как я предполагаю, похоже на то, что делает stem
.
h <- hist(round(x,1), right=FALSE, plot=F)
bin <- h$breaks; bin
#[1] 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5
Затем я использую вырезать до назначьте значения x в правильные ячейки.
xgr <- sort(cut(round(x,1), breaks = bin, right=FALSE, labels = FALSE, include = TRUE))
Затем я использую функцию rowid
из data.table , чтобы определить значения оси Y, разделив их длину, чтобы получить плотности так, чтобы два графика использовали одну и ту же систему оси Y.
library(data.table)
y <- rowid(xgr)/length(xgr); y
Фактические символы для построения (pch
) берутся из первого di git после десятичного разряда.
pch <- as.character(round(10*(round(sort(x),1) %% 1))); pch
# [1] "5" "6" "8" "9" "1" "2" "3" "5" "6" "8" "8" "9" "1" "2" "2" "2"
#[17] "4" "4" "4" "4" "5" "5" "6" "6" "7" "8" "8" "8" "1" "2" "3" "4"
И, наконец, «at» для оси x.
at <- seq(min(x), max(x), length.out=length(bin)-1)
x <- rep(at, h$counts)
points(x, y, pch = pch, col="red")
axis(side=1, at=at, labels=trunc(bin[-length(bin)]), tck=-0.02, mgp=c(1,0.3,0), col="red", col.axis="red")
A notable difference is that stem
doesn't use round
as I've done here. It appears to use floor(x+0.5)
at lines 96 and 103, which explains the slight differences. Another problem is that it will need tweaking to be more robust.
For example, replacing x
with mtcars$drat
would need changing the scale
argument to 0.5.
x
введите описание изображения здесь