使用 dnorm 绘制正态曲线不适用于 R 中的 ggplot(因为倾斜或丢失数据?)

Plotting a normal curve with dnorm doesn't work with ggplot in R (because of skew or missing data?)

我有一个变量 (day2),我想为其在 ggplot 中的直方图之上叠加一个正态分布。当我尝试使用下面的代码执行此操作时,我收到两条警告消息并且没有正常分发。

Warning messages:
1: Removed 546 rows containing non-finite values (stat_bin). 
2: Removed 1 rows containing missing values (geom_bar).

我认为这可能与分布的偏度有关,或者可能与大量缺失数据 (67%) 有关,但我不明白为什么 R 不绘制正态曲线。谁能告诉我更多关于 R 不绘制正态曲线的原因?

#Data
day2 <- c(1.35,1.41,NA,NA,0.08,NA,NA,NA,NA,0.44,NA,0.2,NA,1.64,0.02,NA,NA,2.05,NA,NA,0.7,NA,NA,0.85,NA,NA,NA,NA,NA,0.38,0.11,NA,NA,NA,0.82,NA,0.91,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.38,NA,NA,NA,NA,NA,0.32,0.23,NA,NA,NA,NA,0.14,NA,NA,NA,1.9,NA,NA,0.76,NA,0.7,0.55,NA,0.38,NA,NA,NA,NA,1.18,0.79,NA,NA,NA,NA,NA,2.08,1,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.14,0.58,NA,1.7,NA,NA,1.06,NA,NA,NA,NA,NA,NA,1.58,NA,NA,NA,NA,NA,NA,NA,NA,2.08,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,1.38,1.44,1.73,NA,NA,NA,1.11,1.14,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,2.12,NA,NA,NA,NA,NA,NA,NA,NA,NA,1.97,0.58,0.7,NA,NA,NA,NA,NA,NA,NA,1.35,NA,NA,NA,0.29,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.85,1.02,NA,NA,0.05,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.78,NA,NA,NA,NA,NA,NA,2.29,NA,NA,NA,NA,NA,0.23,0.44,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.47,NA,NA,NA,NA,NA,NA,NA,1.17,NA,NA,0.44,NA,0.47,NA,NA,NA,0.17,NA,0.85,NA,NA,NA,NA,1.11,NA,NA,NA,NA,NA,NA,NA,0.41,0.76,NA,NA,NA,NA,0.55,1.02,NA,NA,NA,NA,NA,NA,2.5,NA,0.32,NA,0.17,0.2,0.52,NA,0.23,NA,0.52,NA,0.84,0.26,0.76,0.85,1.52,NA,NA,NA,NA,NA,NA,2.53,NA,NA,0.52,3.35,NA,NA,NA,NA,NA,1.08,NA,1.55,1.97,NA,NA,NA,1.38,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.97,NA,NA,0.94,0.11,NA,0.82,NA,NA,NA,0.5,NA,0.58,NA,0.14,NA,1.17,0.44,0.58,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.82,NA,NA,0.76,1.14,0.17,0.9,NA,0.67,0.38,NA,NA,NA,NA,NA,NA,NA,NA,0.35,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.2,1.44,0.91,2.44,NA,NA,0.23,0.35,0.79,0.76,0.26,NA,0.73,0.79,NA,NA,NA,NA,1.11,NA,2.38,0.06,2.41,0.85,0.58,0.23,NA,NA,NA,NA,NA,0.32,NA,0.29,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.41,NA,NA,NA,NA,NA,0.14,NA,1.2,0.45,NA,NA,NA,NA,NA,NA,0.14,NA,1.88,0.91,1.79,NA,NA,3,NA,1.21,1.7,0.35,NA,1.5,NA,NA,NA,NA,NA,3.21,1.38,2.5,NA,NA,NA,NA,NA,0.7,NA,NA,NA,NA,0.7,NA,NA,0.79,NA,NA,NA,NA,NA,NA,NA,NA,0.28,NA,NA,0.41,0.64,0.85,NA,NA,0.76,NA,NA,0.91,NA,NA,2.2,2.23,NA,NA,1.05,1.29,NA,NA,0.26,1.11,0.35,NA,NA,0.2,NA,NA,0.52,0.23,1.76,1.17,NA,NA,1.2,NA,NA,0.23,NA,0.64,NA,1.94,NA,NA,1,NA,NA,NA,NA,NA,0.73,1.58,0.55,NA,0.84,NA,0.52,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.67,NA,NA,NA,NA,NA,NA,NA,0.76,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,1.64,1.75,1.08,0.91,0.94,NA,0.32,2.44,0.17,0.02,1.54,0.5,0.48,1.35,2.61,2.05,NA,0.76,0.08,2.91,NA,1,NA,0.47,0.7,NA,1.45,0.14,NA,0.38,NA,NA,0.26,2.32,0.2,NA,2.72,NA,0.41,NA,0.88,NA,0.85,0.23,NA,NA,NA,NA,NA,NA,1.23,NA,0.2,NA,1.32,2.7,NA,NA,2.55,NA,0.17,NA,NA,NA,NA,1.13,NA,0.79,NA,NA,0.38,NA,NA,1,0.2,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,0.47,NA,NA,0.55,0.94,1.02,NA,NA,NA,NA,0.64,0.67,1.87,NA,NA,0.82,NA,NA,NA,NA,NA,NA,0.64,NA,NA,NA,NA,1.7,NA,0.79,NA,0.58,0.11,NA,2.42,NA,NA,NA,NA,NA,NA,NA,NA,NA,0,0.23,NA,NA,0.85,1.14,NA,1.14,NA,NA,0.26,NA,NA,NA,NA,NA,0.14,NA,1.14,1.02,NA,0.94,0.55,NA,1.11,NA,NA,NA,NA,NA,NA,0.7,NA,NA,NA,1.94,NA,NA,NA,0.2,3.44,1,0.91,NA,1.58,2.85,NA,0.79,NA,0.76,0.56,1.78,NA,0.23,1.35,1.82,NA,0.17,1.7,NA,1.32,0.14,0.94,1.52,NA,NA,NA,1.41,0.32,0.58,0.44,NA,0.94,1.44,NA,NA,NA)

day2 <- data.frame(day2)


# GGplot script
day2_hist <- ggplot(day2, aes(day2)) 
day2_hist + geom_histogram(aes(y =..density..), colour = "black", fill = "grey", bins = 20) + #specify geometric object, in this case a histogram       
labs(title = "Hygiene score Day 2") + #add main title                                       
scale_x_continuous("Hygiene Score",
    limits = c(0, 4)) + #specify x-axis name
scale_y_continuous("Density", #specify y-axis name
    limits = c(0, 0.8)) + #specify limits
theme(plot.title = element_text(hjust = 0.5), #align main title
    axis.line = element_line(colour = "black", size = 0.2), #colour of the lines that contain elements
    panel.grid.major = element_blank(), #colour of major grid lines
    panel.grid.minor = element_blank(), #colour of minor grid lines
    panel.border = element_blank(), #colour of graph border
    panel.background = element_blank()) + #colour of background
stat_function(fun = dnorm, #returns the probability (i.e., the density) for a given value from a normal distribution of known mean and standard deviation
    args = list(mean = mean(day2$day2), sd = sd(day2$day2)),
    colour = "black", size = 0.5)

T 认为问题是 day2 包含许多 NA,您应该通过将 na.rm = TRUE 添加到 meansd 来告诉 R:

+ stat_function(
    fun = dnorm,
    args = list(
        mean = mean(day2$day2, na.rm = TRUE),
        sd = sd(day2$day2, na.rm = TRUE)),
    colour = "black", size = 0.5)

此外,直方图看起来不像我认为的正态分布。