【问题标题】:Linear regression on split data in RR中拆分数据的线性回归
【发布时间】:2019-10-28 19:37:19
【问题描述】:

我想制作一组数据,其中在同一 LatLong 上对同一物种进行多个 Year 的测量。然后,我想对所有这些组进行线性回归(使用 N 作为因变量,Year 作为自变量)。

练习数据集:

  Species Year Lat Long   N
1       1 1999   1    1   5
2       1 2001   2    1   5
3       2 2010   3    3   4
4       2 2010   3    3   2
5       2 2011   3    3   5
6       2 2012   3    3   8
7       3 2007   8    7 -10
8       3 2019   8    7 100
9       2 2000   1    1   5

首先,我对在同一 Species 在同一 latitudelongitude 上进行多次测量的数据进行平均。然后,我根据LatLongSpecies 拆分数据。但是,这仍然将LatLongSpecies 不等于($ '4') 的行组合在一起。此外,我想删除$'1',因为我只想使用对多个Year 进行多次测量的数据。我该怎么做?

Data <- read.table("Dataset.txt", header = TRUE)
Agr_Data <- aggregate(N ~ Lat + Long + Year + Species, data = Data, mean)
Split_Data <- split(Agr_Data, Agr_Data$Lat + Agr_Data$Long + Agr_Data$Species)
Regression_Data <- lapply(Split_Data, function(Split_Data) lm(N~Year, data = Split_Data) )


Split_Data

$`3`
  Lat Long Year Species N
1   1    1 1999       1 5

$`4`
  Lat Long Year Species N
2   2    1 2001       1 5
3   1    1 2000       2 5

$`8`
  Lat Long Year Species N
4   3    3 2010       2 3
5   3    3 2011       2 5
6   3    3 2012       2 8

$`18`
  Lat Long Year Species   N
7   8    7 2007       3 -10
8   8    7 2019       3 100

期望的输出:

  Lat Long Species   Coefficients
    3    3       2   2.5
    8    7       3   9.167

【问题讨论】:

  • 嗨,如果您使用 dput(),您的示例很容易重现。
  • 我很抱歉,对 R 来说很新。这是 dput 输出。结构(列表(物种= c(1L,1L,2L,2L,2L,2L,3L,3L,2L),年份=c(1999L,2001L,2010L,2010L,2011L,2012L,2007L,2019L,2000L),纬度 = c(1L, 2L, 3L, 3L, 3L, 3L, 8L, 8L, 1L), 经度 = c(1L, 1L, 3L, 3L, 3L, 3L, 7L, 7L, 1L), N = c( 5L, 5L, 4L, 2L, 5L, 8L, -10L, 100L, 5L)), class= "data.frame", row.names = c(NA, -9L))

标签: r aggregate lm


【解决方案1】:

基础 R 解决方案:

# 1. Import data: 

df <- structure(list(Species = c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 2L ),
                     Year = c(1999L, 2001L, 2010L, 2010L, 2011L, 2012L, 2007L, 2019L, 2000L),
                     Lat = c(1L, 2L, 3L, 3L, 3L, 3L, 8L, 8L, 1L),
                     Long = c(1L, 1L, 3L, 3L, 3L, 3L, 7L, 7L, 1L),
                     N = c(5L, 5L, 4L, 2L, 5L, 8L, -10L, 100L, 5L)),
                class = "data.frame", row.names = c(NA, -9L ))

# 2. Aggregate data: 

df <- aggregate(N ~ Lat + Long + Year + Species, data = df, mean)

# 3. Concatenate vecs to create grouping vec: 

df$grouping_var <- paste(df$Species, df$Lat, df$Long, sep = ", ")

# 4. split apply combine lm:  

coeff_n <- as.numeric(do.call("rbind", lapply(split(df, df$grouping_var), 

                          function(x){

                           ifelse(nrow(x) > 1, coef(lm(N ~ Species+Lat+Long, data = x)), NA)

                          }

                        )

                      )

                    )


# 5.  Create a dataframe of coeffs: 

coeff_df <- data.frame(cbind(grouping_var = unique(df$grouping_var), coeff_n = coeff_n))

# 6. Merge the dataframes together: 

df <- merge(df, coeff_df, by = "grouping_var", all.x = TRUE)

【讨论】:

  • 感谢您的帮助!当我这样做时,我还会得到一个物种被采样一次的位置的输出(例如,lat = 1,long = 1,species = 1,Year = 1999)。我希望排除这些。是否有可能获得非标准化系数而不是预测(每年 N 的变化)?我现在在帖子中包含了所需的输出。
  • @maarvd 请查看上面的编辑代码。如果合适,请接受答案并投赞成票;)
  • 嗨!运行代码,但它分别给出 5.3333333 和 45 作为系数。我手动计算的时候应该是2.5和9.167。
  • 代码是正确的还是需要调整?
  • 嗨!它没有给我系数(2.5 和 9.167,请参阅帖子中的所需输出)。这种调整将不胜感激:)
猜你喜欢
  • 2019-11-19
  • 2020-07-12
  • 2022-01-24
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2014-09-21
  • 2010-11-13
相关资源
最近更新 更多