首页 > 解决方案 > R中lm的数据集大小限制

问题描述

我一直在努力解决 lm 在 R 中的一个问题,并认为我会分享我的发现并询问人们对此的看法。

我在一些数据上拟合了一个线性模型,这些数据清楚地表明了非常强的线性关系。然而,我很惊讶得到糟糕的结果(r2 ~ 0.46)。我的数据刚刚超过 6000 行。然后我运行相同的代码,但在数据样本上运行,我得到了我期望的结果(r2 ~ 0.99)。所以我想,好吧,可能有一个奇怪的地方把一切都搞砸了(尽管当我运行经典的数据质量检查时没有什么明显的)。我努力寻找那一点无济于事。但后来我意识到:这不是由于给定的点,而是由于数据集的大小。

就我而言(我正在使用 Azure 计算实例,16G RAM),限制为 n=4096。

我在下面创建了一段测试代码,它揭示了问题(再次:在我的机器上)。是的,这是一个非常愚蠢的例子,但这不是问题;)

# set some coefficient values 
some.noise <- 100
coef_ <- 3.8
interc_ <- -1.2

# set sample size (no. of rows)
n.sample <- 4096

# very basic linear relation with some noise
feature <- runif(n = n.sample, min = 0, max = 200)
outcome <- (coef_*feature + interc_) + runif(n=n.sample, max=some.noise)

df_ <- tibble(feat = feature, tar = outcome)
ggplot(df_) + geom_point(aes(x=feat, y=tar))

lm_ <- lm(tar ~ feat, data=df_)
summary(lm_)
# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept) 23.662659   1.429095   16.56   <2e-16 ***
#   feat         4.167374   0.006125  680.44   <2e-16 ***
#   ---
# 
# Multiple R-squared:  0.966,   Adjusted R-squared:  0.966 

# now the same as above, with just one more row
n.sample <- 4097
feature <- runif(n = n.sample, min = 0, max = 200)
outcome <- (coef_*feature + interc_) + runif(n=n.sample, max=some.noise)

df_ <- tibble(feat = feature, tar = outcome)
ggplot(df_) + geom_point(aes(x=feat, y=tar))

lm_ <- lm(tar ~ feat, data=df_)
summary(lm_)
# Coefficients:
#   Estimate Std. Error t value Pr(>|t|)    
# (Intercept) -825.0953    42.1167  -19.59   <2e-16 ***
#   feat           8.3911     0.1822   46.05   <2e-16 ***
# 
# Multiple R-squared:  0.467,   Adjusted R-squared:  0.4669 

所以这是我的问题:

我很想听听专家对此的看法。

提前致谢!

标签: r

解决方案


推荐阅读