尝试使用R中的fitdistr()拟合chi_square分布。有关此的文档在这里(对我不是很有用):https://stat.ethz.ch/R-manual/R-devel/library/MASS/html/fitdistr.html

问题1:下面的chi_df具有以下输出:3.85546875 (0.07695236)。第二个数字是多少?方差还是标准差?

问题2:fitdistr生成由Chi-SQ分布定义的“k”。如何拟合数据,以便获得缩放常数“A”?我愚蠢地使用下面的14-17行。显然不好。

问题3:是否仅针对某个x范围定义了Chi-SQ分布? (方差定义为2K,均值= k。这必须要求约束x范围...统计信息问题无法编程...)

nnn = 1000;
## Generating a chi-sq distribution
chii <- rchisq(nnn,4, ncp = 0);
## Plotting Histogram
chi_hist <- hist(chii);
## Fitting. Gives probability density which must be scaled.
chi_df <- fitdistr(chii,"chi-squared",start=list(df=3));
chi_k <- chi_df[[1]][1];

## Plotting a fitted line:
## Spanning x-length of chi-sq data
x_chi_fit <- 1:nnn*((max(chi_hist[[1]][])-min(chi_hist[[1]][]))/nnn);

## Y data using eqn for probability function
y_chi_fit <- (1/(2^(chi_k/2)*gamma(chi_k/2)) * x_chi_fit^(chi_k/2-1) * exp(-x_chi_fit/2));
## Normalizing to the peak of the histogram
y_chi_fit <- y_chi_fit*(max(chi_hist[[2]][]/max(y_chi_fit)));

## Plotting the line
lines(x_chi_fit,y_chi_fit,lwd=2,col="green");

谢谢你的帮助!

最佳答案

  • 如上所述,?fitdistr

  • “fitdistr”类的对象,该列表包含四个组成部分,
    ...
    sd:估计的标准误差,

    ...,因此带括号的数字是参数的标准错误。
  • 不需要估计scale参数;您需要根据直方图箱的宽度进行缩放,或者在绘制直方图时仅使用freq=FALSE。请参见下面的代码。
  • 卡方分布是在非负实数上定义的,这是有道理的,因为它是平方标准正态分布(这是统计问题,而不是编程问题)。

  • 设置数据:
    nnn <- 1000
    ## ensure reproducibility; not a big deal in this case,
    ##  but good practice
    set.seed(101)
    ## Generating a chi-sq distribution
    chii <- rchisq(nnn,4, ncp = 0)
    

    配件。
    library(MASS)
    ## use method="Brent" based on warning
    chi_df <- fitdistr(chii,"chi-squared",start=list(df=3),
                       method="Brent",lower=0.1,upper=100)
    chi_k <- chi_df[[1]][1]
    

    (就其价值而言,当使用fitdistr时,看来method="Brent"的打印方法中可能有一个错误。您也可以使用method="BFGS",而无需指定界限...)

    直方图
    chi_hist <- hist(chii,breaks=50,col="gray")
    ## scale by N and width of histogram bins
    curve(dchisq(x,df=chi_k)*nnn*diff(chi_hist$breaks)[1],
          add=TRUE,col="green")
    ## or plot histogram already scaled to a density
    chi_hist <- hist(chii,breaks=50,col="gray",freq=FALSE)
    curve(dchisq(x,df=chi_k),add=TRUE,col="green")
    

    09-26 23:15