【问题标题】:r-squared by groups in linear regression线性回归中按组的 r 平方
【发布时间】:2018-08-20 20:53:19
【问题描述】:

我已经使用我的数据集 (24) 的所有元素计算了线性回归,得到的模型是 IP2。现在我想知道该单一模型对我的数据集中每个国家/地区的拟合程度(r 平方,我对斜率和截距不感兴趣)。糟糕的做法是(我需要做以下 200 次)

Country <- c("A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","B","B")
IP <- c(55,56,59,63,67,69,69,73,74,74,79,87,0,22,24,26,26,31,37,41,43,46,46,47)
IP2 <- c(46,47,49,50,53,55,53,57,60,57,58,63,0,19,20,21,22,25,26,28,29,30,31,31)
summary(lm(IP[Country=="A"] ~ IP2[Country=="A"]))
summary(lm(IP[Country=="B"] ~ IP2[Country=="B"]))

有没有办法同时计算两个 r 平方?我尝试使用 Linear Regression and group by in R 以及其他一些帖子 (Fitting several regression models with dplyr),但它不起作用,并且我得到的四个组的系数相同。 关于我做错了什么或如何解决问题的任何想法? 谢谢

【问题讨论】:

  • 有些不清楚。您想要 1) 使用完整的数据集来估计一个模型并从中计算多个 R^2,还是 2) 分别估计每个组的相同模型并提取 R^2?

标签: r subset linear-regression lm


【解决方案1】:

基于 R 的几个选项:

sapply(unique(Country), function(cn)
  summary(lm(IP[Country == cn] ~ IP2[Country == cn]))$r.sq)
#         A         B 
# 0.9451881 0.9496636 

c(by(data.frame(IP, IP2), Country, function(x) summary(lm(x))$r.sq))
#         A         B 
# 0.9451881 0.9496636 

sapply(split(data.frame(IP, IP2), Country), function(x) summary(lm(x))$r.sq)
#         A         B 
# 0.9451881 0.9496636 

【讨论】:

  • 谢谢@朱利叶斯。我更喜欢第二个选项,因为第一个选项你需要运行“unique(Country)”来知道哪个国家是哪个(如果 A 不是列表中的第一个)
【解决方案2】:

您可以使用split 函数,然后使用mapply 来完成此操作。

  • split 接受一个向量并将其转换为一个包含 k 个元素的列表,其中 k 是(在本例中)国家的不同级别。
  • mapply 允许我们循环多个输入。
  • getR2 是一个简单的函数,它接受两个输入,拟合一个模型,然后提取 R^2 值。

下面的代码示例

Country <- c("A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","B","B")
IP <- c(55,56,59,63,67,69,69,73,74,74,79,87,0,22,24,26,26,31,37,41,43,46,46,47)
IP2 <- c(46,47,49,50,53,55,53,57,60,57,58,63,0,19,20,21,22,25,26,28,29,30,31,31)

ip_split = split(IP,Country)
ip2_split = split(IP2,Country)

getR2 = function(ip,ip2){
  model = lm(ip~ip2)
  return(summary(model)$r.squared)
}

r2.values = mapply(getR2,ip_split,ip2_split)

r2.values
#>         A         B 
#> 0.9451881 0.9496636

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2017-03-24
    • 2011-08-01
    • 2017-11-13
    相关资源
    最近更新 更多