回归Lm并替换NA

问题描述:

我有一个贝壳长度和高度的数据集,但在某些年份没有记录高度。我正在尝试使用记录身高和身高的数据年数的线性回归,以便用NAs生成年份的高度。 最重要的是,我希望它为我的每个评估领域做这个回归。回归Lm并替换NA

到目前为止,这是我的;

for(a in unique(all_data$Assessment_area)) { 
r1 <- lm(Height_t2~Length_t2,data=all_data[!is.na(all_data$Height_t2)&all_data$Assessment_area==a,]) #Regression model for all shells with L&H 
print(a) 
print(r1) 
} 

这给了我,我需要为每个评估区域(我然后插入下面即与0.8871 0.5143代码,但此刻一个个)的输出。 我的代码的下一位是创建一个新的列,如下所示,每次输入生成的值。有没有办法将这些线路合并到前一个循环中?

all_data$Height_r1 <- all_data$Length_t2*0.8871+0.5143 #Apply regression relationship to new column 
all_data$Height_r1[!is.na(all_data$Height_t2)] <-all_data$Height_t2[!is.na(all_data$Height_t2)] #Add original heights 

任何帮助表示赞赏

+0

什么是08871和0.5143?这是上一步中LM的结果吗? – bsg 2014-09-01 09:51:42

+0

是的,但有5个评估区域,所以有5组结果,所以我还需要指定只使用该区域的计算回归来替换每个评估区域的高度值。以前,当我使用这个代码时,我刚刚对所有的炮弹都使用了一个单一的回归方程,但我认为区域/评估区域规模回归会更准确。 – 2014-09-01 10:03:37

您可以访问使用$操作上的汇总函数的线性回归的结果。在这种情况下,你会做

r1coefs <- summary(r1)$coefficients 
intercept <- r1coeffs[1] 
slope <- r1coeffs[2] 

然后可以将这些变成你的循环如下:

for(a in unique(all_data$Assessment_area)) 

{ r1 <- lm(Height_t2~Length_t2,data=all_data[!is.na(all_data$Height_t2)&all_data$Assessment_area==a,]) #Regression model for all shells with L&H 
print(a) 
print(r1) 
#access the linear regression coefficients and store them   
r1coefs <- summary(r1)$coefficients 
intercept <- r1coeffs[1] 
slope <- r1coeffs[2] 

#use the stored regression coefficients on the new data 
all_data$Height_r1 <- all_data$Length_t2*slope+intercept #Apply regression relationship to new column 
all_data$Height_r1[!is.na(all_data$Height_t2)] <-all_data$Height_t2[!is.na(all_data$Height_t2)] #Add original heights 
} 
+0

谢谢bsg,代码运行良好,但是当我检查输出时,其中一些已经关闭了。我只能在计算器上生成5个评估区域高度中的一个。例如,许多人都不太合适。对于评估区域A,打印出的坡度为0.8877,截距为0.8175,因此长度为44 * 0.8877 + 0.8175,我得到39.8763,但是r产生39.3548,这对于某些高度来说是足够的差异以便凑到错误的mm。我想不出为什么会出现这种情况? – 2014-09-01 10:44:13

+0

嗯看起来它只是对它们使用一个等式,这就是为什么一个评估区域应该是这样,其他区域不是这样。循环中必须有一些缺失。 – 2014-09-01 10:54:10

问题解决了:)只是需要一些额外的比特使用存储的回归时指定Assessment_area数据 ;

for(a in unique(all_data$Assessment_area)) { 
r1 <- lm(Height_t2~Length_t2,data=all_data[!is.na(all_data$Height_t2) &all_data$Assessment_area==a,]) 
#Regression model for all shells with L&H 
print(a) 
print(r1) 
#access the linear regression coefficients and store them   
r1coeffs <- summary(r1)$coefficients 
    intercept <- r1coeffs[1] 
slope <- r1coeffs[2] 

    #use the stored regression coefficients on the new data 

    all_data[all_data$Assessment_area==a,"Height_r1"] <- all_data [all_data$Assessment_area==a,"Length_t2"]*slope+intercept #Apply regression relationship to new column 

} 

#Add original heights   
all_data$Height_r1[!is.na(all_data$Height_t2)] <-all_data$Height_t2[!is.na(all_data$Height_t2)]