在R中绘制回归线

时间:2019-12-30 23:09:35

标签: r

我需要为性别和种族(白色/非白色)的每个不同组合添加回归线。 这些是我制作的模型和图,但是我不知道在哪里放置这些线条以及如何做。

#Invoke-sqlcmd Connection string parameters
$params = @{'server'='TESTServer';'Database'='_Maintenance'}
#Server to query WMI class win32_logicalDisks
$server = 'TESTServer'
#Prepare Insert Statement

$insert = @' 
    INSERT INTO [_PBS_Maintenance].[dbo].[Maint_DiskSpace](Path,SizeInMB,SizeInGB,FileLastModified,CreatedDate,CreatedBY)
    VALUES (
                '{0}',
                '{1}',
                '{2}',
                '{3}',
                GetDate(),
                SYSTEM_USER
           )
'@
 write-host $insert
Try {
    #Define connction string of target database
    $connectionString = 'Data Source=PBSNV800IMG1\PBSNV800IMG1;Initial Catalog=_PBS_Maintenance;Integrated Security=SSPI'
    # connection object initialization
    $conn = New-Object System.Data.SqlClient.SqlConnection($connectionString)
    #Open the Connection 
    $conn.Open()
    # Prepare the SQL 
    $cmd = $conn.CreateCommand()

    $array= @() 
    $folder = "\\fsvr\Public\Users\Valorie L\Valorie\ATTORNEY\EIC-ERMG\" 
    $Source = $folder

Get-ChildItem -Recurse $Source | Where-Object { $_.PSIsContainer } | 
    ForEach-Object { 
            $obj = New-Object PSObject  
            $SizeMB = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1MB, 2)
            $SizeGB = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1GB, 2)  
            $obj |Add-Member -MemberType NoteProperty -Name "Path" $_.FullName
            $obj |Add-Member -MemberType NoteProperty -Name "SizeMB" $SizeMB 
            $obj |Add-Member -MemberType NoteProperty -Name "SizeGB" $SizeGB 
            $obj |Add-Member -MemberType NoteProperty -Name "DateModified" $_.LastWritetime
                    $array +=$obj 


    select Path,SizeMB,DateModified
        ForEach-Object{
            $cmd.CommandText = $insert -f $obj.Path,$obj.SizeMB,$obj.SizeGB, $obj.DateModified
            $cmd.ExecuteNonQuery()
    }
}
    #Close the connection
    $conn.Close()

}
Catch {
    Throw $_
}

Invoke-Sqlcmd @params -Query "SELECT  * FROM Maint_DiskSpace" | format-table -AutoSize

谢谢。

2 个答案:

答案 0 :(得分:4)

geom_smooth中的ggplot2呼叫可以为您做到这一点:

library(tidyverse)

white_men <- 3 * seq(20:40) + rnorm(n = 21, mean = 0, sd = 5)
white_women <- 2 * seq(20:40) + rnorm(n = 21, mean = 0, sd = 5)
nonwhite_men <- 2.5 * seq(20:40) + rnorm(n = 21, mean = 0, sd = 5)
nonwhite_women <- 1.5 * seq(20:40) + rnorm(n = 21, mean = 0, sd = 5)

df <- 
  white_men %>% enframe(name = NULL) %>% mutate(age = 20:40, sex = "Male", race = "White") %>% 
  bind_rows(
    white_women %>% enframe(name = NULL) %>% mutate(age = 20:40, sex = "Female", race = "White")
  ) %>% 
  bind_rows(
    nonwhite_men %>% enframe(name = NULL) %>% mutate(age = 20:40, sex = "Male", race = "Non-White")
  ) %>% 
  bind_rows(
    nonwhite_women %>% enframe(name = NULL) %>% mutate(age = 20:40, sex = "Female", race = "Non-White")
  ) %>% 
  mutate(sex_race = str_c(race, sex, sep = " "))

df %>% 
  ggplot(aes(x = age, y = value, color = sex_race)) +
  geom_point() +
  geom_smooth(method = "lm")

enter image description here

答案 1 :(得分:2)

尽管ggplot2对于这种示例更为简洁,但如果您确实想使用R base plot,我在这里提供了替代方法。

我使用了@ cardinal40制作的相同的df

> head(df)
       value age  sex  race   sex_race
1 -1.8812801  20 Male White White Male
2 -0.4755058  21 Male White White Male
3 13.3137759  22 Male White White Male
4 11.3594325  23 Male White White Male
5 13.3529303  24 Male White White Male
6 24.8443766  25 Male White White Male

对于绘图,可以使用for循环遍历所有不同的组,使用abline添加模型的回归线。

df = as.data.frame(df)
level = unique(df$sex_race)
colors = c("blue", "red", "green", "black")
for(i in 1:length(level))
{
  if(i == 1)
  {
    plot(x = df[df$sex_race == level[i],"age"],
         y = df[df$sex_race == level[i], "value"],
         xlim = c(min(df$age), max(df$age)), 
         ylim = c(min(df$value), max(df$value)), 
         col = colors[i],
         pch = 16,
         xlab = "Age",
         ylab = "Value")
    abline(lm(value~age, data = subset(df, df$sex_race == level[i])),
           col = colors[i])
  }
  else
  {
    points(x = df[df$sex_race == level[i],"age"],
           y = df[df$sex_race == level[i], "value"],
           col = colors[i], pch = 16)
    abline(lm(value~age, data = subset(df, df$sex_race == level[i])),
           col = colors[i])
  }
}
legend("topleft", title="Legend", legend=c("White Male"," White Female", "Nonwhite Male", "Nonwhite Female"),
       col=c("blue", "red", "green", "black"), pch=16, cex=0.54)

enter image description here

编辑:代码编写的替代方法

基于@StupidWolf的评论,您可以通过执行以下操作获得相同的情节:

df = as.data.frame(df)
level = unique(df$sex_race)
colors = c("blue", "red", "green", "black")
plot(NULL, 
     xlim = c(min(df$age), max(df$age)), 
     ylim = c(min(df$value), max(df$value)),
     xlab = "Age", ylab = "Value")
for(i in 1:length(level))
{
  points(x = df[df$sex_race == level[i],"age"],
           y = df[df$sex_race == level[i], "value"],
           col = colors[i], pch = 16)
  abline(lm(value~age, data = subset(df, df$sex_race == level[i])),
           col = colors[i])
}
legend("topleft", title="Legend", legend=c("White Male"," White Female", "Nonwhite Male", "Nonwhite Female"),
       col=c("blue", "red", "green", "black"), pch=16, cex=0.54)

在此,感谢@rawr,这是一种更简洁的代码编写方式来获得相同的绘图:

sp <- split(df, df$sex_race)
plot(value ~ age, df, type = 'n', xlab = 'Age', ylab = 'Value')
lapply(seq_along(sp), function(ii) {
  x <- sp[[ii]]
  points(value ~ age, x, col = ii, pch = 16)
  abline(lm(value ~ age, x), col = ii)
  })
legend("topleft", title="Legend", legend=c("White Male"," White Female", "Nonwhite Male", "Nonwhite Female"),
       col=c("blue", "red", "green", "black"), pch=16, cex=0.54)