如何在R

时间:2016-04-19 11:09:22

标签: r loops linear-regression

我在这里请求你的帮助。 我必须使用相同的集合为多个依赖变量运行一系列OLS回归。

即。我有一个大小(1510x5)的数据框,特别是每个代表一个投资组合的回报,我想再次回归相同的因变量(1510x4),在我的例子中是来自Carhart模型的因素。因为除了系数的值之外,我对它们的P值和回归的R2感兴趣,有没有办法构建一个允许我存储信息的循环?

到目前为止我尝试的是:

for (i in 1:ncol(EW_Portfolio)) {
  lmfit <- lm(EW_Portfolio[, i] ~ FFM)
  summary(lmfit_i)
}

希望每次循环重复时,我都能看到每个回归的结果。

2 个答案:

答案 0 :(得分:1)

最简单的方法是将其存储在列表中:

//A distinct select is needed because bank info can be on multiple lines. So first a list is generated with correct info except for bank information
List<SupplierItem> distinctsupplier = supplier
    .GroupBy(p => p.Code)
    .Select(g => g.First())
    .ToList();

CultureInfo ci = new CultureInfo("en-US");
XmlDocument doc = new XmlDocument();
var root = doc.CreateElement("ROOT");
var rootNode = doc.AppendChild(root);
var docElem = doc.CreateElement("DocumentElement");
var docElemNode = rootNode.AppendChild(docElem);

foreach (var item in distinctsupplier)
{
    var supplierElem = doc.CreateElement("Supplier");
    var companyElem = (XmlNode)doc.CreateElement("Company");
    companyElem.InnerText = item.Company.ToString();
    var codeElem = (XmlNode)doc.CreateElement("Code");
    codeElem.InnerText = item.Code.ToString();
    var codeName = (XmlNode)doc.CreateElement("Name");
    codeName.InnerText = item.Name.ToString();

    //supplieridentifier part
    var supplierIdsElem = doc.CreateElement("SupplierIdentifiers");
    var supplierIdElem = doc.CreateElement("SupplierIdentifier");
    var supplierIdValueElem = (XmlNode)doc.CreateElement("SupplierIDValue");
    supplierIdValueElem.InnerText = item.SupplierIDValue;

    //supplieraddress part
    var supplierAddressesElem = doc.CreateElement("SupplierAddresses");
    var supplierAddressElem = doc.CreateElement("SupplierAddress");
    var supplierTypeValueElem = (XmlNode)doc.CreateElement("Type");
    supplierTypeValueElem.InnerText = item.Type;
    var supplierNameValueElem = (XmlNode)doc.CreateElement("Name");
    supplierNameValueElem.InnerText = item.AddressName;
    var supplierDefaultValueElem = (XmlNode)doc.CreateElement("IsDefault");
    supplierDefaultValueElem.InnerText = item.AddressIsDefault;
    //address part
    var AddressPartElem = doc.CreateElement("AddressParts");
    var supplierAddressPartsElem = doc.CreateElement("SupplierAddressPart");
        //Street
    var AddressPartElemStreetKeyElem = (XmlNode)doc.CreateElement("AddressPartKey");
    AddressPartElemStreetKeyElem.InnerText = item.AddressStreetKey;
    var AddressPartElemStreetValueElem = (XmlNode)doc.CreateElement("AddressPartText");
    AddressPartElemStreetValueElem.InnerText = item.AddressStreetText;
        //Country
    var AddressPartElemCountryKeyElem = (XmlNode)doc.CreateElement("AddressPartKey");
    AddressPartElemCountryKeyElem.InnerText = item.AddressCountryKey;
    var AddressPartElemCountryValueElem = (XmlNode)doc.CreateElement("AddressPartText");
    AddressPartElemCountryValueElem.InnerText = item.AddressCountryText;

    //add elements to supplierelem
    supplierElem.AppendChild(companyElem);
    supplierElem.AppendChild(codeElem);
    supplierElem.AppendChild(codeName);

    //bankaccounts part
    var bankAccountElem = doc.CreateElement("BankAccounts");
    //select all rows that contain multiple lines, so the bank info can be extracted, for a certain supplier
    var bankInformation = supplier.Where(s => s.Code == item.Code).ToList();

    foreach (var bankitem in bankInformation)
    {
        if (item.Code == bankitem.Code)
        {
            var bankAccountSupplElem = doc.CreateElement("SupplierBankAccount");
            var bankAccountBbanElem = doc.CreateElement("Bban");
            var bankAccountBbanValueElem = (XmlNode)doc.CreateElement("Bban");
            bankAccountBbanValueElem.InnerText = bankitem.Bban;
            var bankAccountNameElem = doc.CreateElement("Name");
            var bankAccountNameValueElem = (XmlNode)doc.CreateElement("Name");
            bankAccountNameValueElem.InnerText = bankitem.BankName;

            var bankAccountElemNode = supplierElem.AppendChild(bankAccountElem);
            var bankAccountSupplElemNode = bankAccountElemNode.AppendChild(bankAccountSupplElem);
            bankAccountSupplElemNode.AppendChild(bankAccountBbanValueElem);
            bankAccountSupplElemNode.AppendChild(bankAccountNameValueElem);

        }
    }

    //add address elements to supplierelem
    var supplierAddressesElemNode = supplierElem.AppendChild(supplierAddressesElem);
    var supplierAddressElemNode = supplierAddressesElemNode.AppendChild(supplierAddressElem);
    supplierAddressElemNode.AppendChild(supplierTypeValueElem);
    supplierAddressElemNode.AppendChild(supplierNameValueElem);
    supplierAddressElemNode.AppendChild(supplierDefaultValueElem);
    //add addressparts to supplieraddressesnode
        //Street
    var AddressPartElemNode = supplierAddressElemNode.AppendChild(AddressPartElem);
    var supplierAddressPartsElemNode = AddressPartElemNode.AppendChild(supplierAddressPartsElem);
    supplierAddressPartsElemNode.AppendChild(AddressPartElemStreetKeyElem);
    supplierAddressPartsElemNode.AppendChild(AddressPartElemStreetValueElem);
        //Country (first reinitialize supplieraddresspart)
    supplierAddressPartsElem = doc.CreateElement("SupplierAddressPart");
    var supplierAddressPartsCountryElemNode = AddressPartElemNode.AppendChild(supplierAddressPartsElem);
    supplierAddressPartsCountryElemNode.AppendChild(AddressPartElemCountryKeyElem);
    supplierAddressPartsCountryElemNode.AppendChild(AddressPartElemCountryValueElem);

    //add all supplierelements to docelemnode
    docElemNode.AppendChild(supplierElem);

}
return doc.OuterXml;

然后,您可以访问您提到的结果:

resultsList <- list()

for (i in 1:ncol(EW_Portfolio)) {
  lmfit <- lm(EW_Portfolio[, i] ~ FFM)
  resultsList[[i]] <- summary(lmfit_i)
}

答案 1 :(得分:0)

可能是这样,不确定 p.values

data("mtcars")

formulas <- list(
  mpg ~ disp,
  mpg ~ disp + wt
)

res <- vector("list", length = length(formulas))
my.r2 <- vector("list", length = length(formulas))
my.sum <- vector("list", length = length(formulas))

for(i in seq_along(formulas)){
  res[[i]] <- lm(formulas[[i]], data = mtcars)
  my.r2[[i]] <- (summary(res[[i]]))$adj.r.squared
  my.sum[[i]] <- (summary(res[[i]]))
  }
res
unlist(my.r2)
my.sum

lapply(formulas, lm, data = mtcars)