如何正确使用dunif()函数执行线性回归?求解无结果异常
问题原因与修正方案
你的核心问题是混淆了R语言中分布密度函数和随机数生成函数:
dunif()是计算均匀分布的概率密度值,不是生成均匀分布随机数dnorm()是计算正态分布的概率密度值,不是生成正态分布随机数
当你传入n=1000时,这两个函数只返回了x=1000处的密度值,所以x和e都是长度为1的向量,最终y也只有1个数据点。线性回归需要至少2个数据点才能计算自由度,因此出现了残差自由度为0的报错。
修正后的代码
把生成随机数的函数换成对应的r开头函数:
set.seed(69) n <- 1000 e <- rnorm(n, 0, 0.1) # 生成n个均值0、标准差0.1的正态随机数 x <- runif(n, 0, 1) # 生成n个0到1之间的均匀随机数 y = 5*x + e fit <- lm(y ~ x) summary(fit)
预期输出示例
运行后你会得到类似这样的结果(因set.seed固定了随机数,结果可复现):
Call: lm(formula = y ~ x) Residuals: Min 1Q Median 3Q Max -0.3179 -0.0667 0.0012 0.0692 0.3210 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.00129 0.00606 -0.213 0.831 x 5.00527 0.01050 476.75 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.0994 on 998 degrees of freedom Multiple R-squared: 0.9959, Adjusted R-squared: 0.9959 F-statistic: 2.273e+05 on 1 and 998 DF, p-value: < 2.2e-16
可以看到x的系数接近设定的5,截距接近0,回归结果有效。
新手提示
R语言中分布相关函数分四类,开头字母对应不同功能:
d:计算概率密度(连续分布)或概率质量(离散分布)p:计算累积分布概率q:计算分位数r:生成指定分布的随机数
以后生成随机数记得用r开头的函数。
内容的提问来源于stack exchange,提问作者philipp jacober
相关产品推荐
相关产品推荐

